1:- module(kghub,
    2          [
    3           category/2,
    4           '^'/2,
    5
    6           edge/5,
    7           edge/6,
    8           edge_property_value/3,
    9           provided_by/2,
   10           provided_by/4,
   11
   12           relation_count/2,
   13           category_count/2,
   14           chained_provider/3,
   15           
   16           category_provider_count/3,
   17           category_node_property_count/3,
   18           category_relation_count/3,
   19           category_link_count/3,
   20           category_link_count/4,
   21           category_link_count/5,
   22           chained_edge_provider_count/3,
   23           edge_provider_count/2,
   24           provided_by_count/2,
   25           relation_provider_count/3
   26           %edge_property_count/2
   27           ]).   28
   29%:- use_module(library(biolink_model)).
   30%:- reexport([library(biolink_model)]).
   31
   32
   33:- rdf_register_prefix(biolink, 'https://w3id.org/biolink/vocab/').   34:- rdf_register_prefix(uniprotkb, 'http://identifiers.org/uniprot/').   35:- rdf_register_prefix(tmp, 'https://www.example.org/UNKNOWN/').   36:- sparql_endpoint( kgcovid19, 'http://kg-hub-rdf.berkeleybop.io/sparql').   37
   38category(I,C) :- rdf(I,biolink:category,C).
   39
   40capitalize(W,W2) :-
   41        atom_chars(W,[C|W1]),
   42        upcase_atom(C,C2),
   43        atom_chars(W2,[C2|W1]).
   44        
   45
   46'^'(I,C) :-
   47        pre((
   48             kghub:capitalize(C,Cx),
   49             rdf_global_id(biolink:Cx,URI)
   50             )),
   51        category(I,URI).
   52
   53edge(I,R,J,P,V) :-
   54        edge(_,I,R,J,P,V).
   55edge(A,I,R,J,P,V) :-
   56        rdf(A,biolink:subject,I),
   57        rdf(A,biolink:relation,R),
   58        rdf(A,biolink:object,J),
   59        rdf(A,P,V).
   60
   61edge_property_value(A,P,V) :-
   62        rdf(A,biolink:subject,_),
   63        rdf(A,P,V).
   64
   65provided_by(A,X) :-
   66        rdf(A,biolink:provided_by,X).
   67provided_by(I,R,J,X) :-
   68        rdf(A,biolink:subject,I),
   69        rdf(A,biolink:relation,R),
   70        rdf(A,biolink:object,J),
   71        rdf(A,biolink:provided_by,X).
   72
   73
   74chained_provider(Src1,Src2,JoinNode) :-
   75        rdf(A1,biolink:object,JoinNode),
   76        rdf(A2,biolink:subject,JoinNode),
   77        rdf(A1,biolink:provided_by,Src1),
   78        rdf(A2,biolink:provided_by,Src2).
   79        
   80
   81relation_count(P,N) :- aggregate_group(count(*),[P],rdf(_,P,_),N).
   82category_count(C,N) :- aggregate_group(count(I),[C],category(I,C),N).
   83category_provider_count(C,S,N) :- aggregate_group(count(I),[C,S],(category(I,C),provided_by(I,S)),N).
   84category_relation_count(C,P,N) :- aggregate_group(count(*),[C,P],(category(I,C),rdf(I,P,_)),N).
   85category_node_property_count(C,P,N) :- aggregate_group(count(*),[C,P],(category(I,C),rdf(I,P,O),is_literal(O)),N).
   86category_link_count(C1,C2,N) :- aggregate_group(count(*),[C1,C2],(category(I1,C1),rdf(I1,_P,I2),category(I2,C2)),N).
   87category_link_count(C1,R,C2,N) :- aggregate_group(count(*),[C1,R,C2],(category(I1,C1),rdf(I1,R,I2),category(I2,C2)),N).
   88category_link_count(C1,R,C2,Src,N) :- aggregate_group(count(*),[C1,R,C2],(category(I1,C1),rdf(I1,R,I2),category(I2,C2),provided_by(I1,R,I2,Src)),N).
   89chained_edge_provider_count(Src1,Src2,N) :- aggregate_group(count(*),[Src1,Src2],chained_provider(Src1,Src2,_),N).
   90provided_by_count(P,N) :- aggregate_group(count(*),[P],provided_by(_,P),N).
   91edge_provider_count(S,N) :- aggregate_group(count(*),[],(provided_by(_I1,_R,_I2,S)),N). % TODO
   92relation_provider_count(R,S,N) :- aggregate_group(count(A),[R],(rdf(A,biolink:relation,R),rdf(A,biolink:provided_by,S)),N).
   93
   94%edge_property_count(S,N) :- aggregate_group(count(*),[],(provided_by(_I1,_R,_I2,S)),N). % TODO
   95%relation_count(P,N) :- aggregate_group(count(*),[P],rdf(_,P,_),N).