1:- module(graph_util,
    2          [
    3           extract_subgraph/3,
    4           
    5           edges_to_dict/2,
    6           edges_to_dotfile/2,
    7
    8           edges_to_imagefile/2,
    9           edges_to_imagefile/3
   10          ]).   11
   12:- use_module(library(http/json)).   13
   14:- use_module(library(semweb/rdf11)).   15:- use_module(library(semweb/rdfs)).   16:- use_module(library(sparqlprog/owl_util)).   17:- use_module(library(sparqlprog/emulate_builtins)).   18
   19my_maplist(L1,P,L2) :-
   20        G =.. [P,In,Out],
   21        maplist([In,Out]>>G, L1, L2).
 extract_subgraph(+Nodes:list, ?Edges:list, +Opts:list) is det
extracts a subgraph starting from seed nodes in Nodes

Options:

   31extract_subgraph(Nodes, Edges, Opts) :-
   32        extract_subgraph(Nodes, Edges, [], Opts).
   33
   34extract_subgraph([], [], _, _).
   35extract_subgraph([N|Nodes], Edges, Visited, Opts) :-
   36        memberchk(N,Visited),
   37        !,
   38        extract_subgraph(Nodes, Edges, Visited, Opts).
   39extract_subgraph([N|Nodes], Edges, Visited, Opts) :-
   40        extend_node(N,Edges1,Opts),
   41        collect_nodes(Edges1,Nodes1),
   42        append(Nodes1,Nodes,Nodes2),
   43        extract_subgraph(Nodes2, Edges2, [N|Visited], Opts),
   44        append(Edges1, Edges2, Edges).
   45
   46extend_node(N,Edges,Opts) :-
   47        memberchk(direction(down),Opts),
   48        !,
   49        findall(edge(S,N,P,[graph=G]),
   50                owl_edge(S,P,N,G),
   51                Edges).
   52extend_node(N,Edges,Opts) :-
   53        findall(edge(N,O,P,[graph=G]),
   54                owl_edge(N,P,O,G),
   55                Edges).
   56
   57        
   58
   59shorten(URI,Id) :-  rdf_global_id(Pre:Local, URI),concat_atom([Pre,Local],:,Id),!.
   60shorten(X,X).
   61
   62
   63
   64        
   65
   66edges_to_dict(Edges, doc{graphs:[G]}) :-
   67        collect_nodes(Edges,Nodes),
   68        my_maplist(Nodes,node_obj,NodeObjs),
   69        my_maplist(Edges,edge_obj,EdgeObjs),
   70        G = nodelist{nodes: NodeObjs, edges: EdgeObjs}.
   71
   72edges_to_dotfile(Edges,DF) :-
   73        edges_to_dotfile(Edges,DF,[]).
   74edges_to_dotfile(Edges,DF,Opts) :-
   75        edges_to_dict(Edges,D),
   76        tmp_file(obograph,GF),
   77        open(GF,write,Stream,[]),
   78        json_write_dict(Stream,D),
   79        close(Stream),
   80        findall(A,
   81                (   member(Opt=Val,Opts),
   82                    sformat(A,'~w ~w',[Opt,Val])),
   83                OptsAtoms),
   84        concat_atom(OptsAtoms,OptsAtom),
   85        sformat(Cmd,'og2dot.js ~w -o ~w ~w',[OptsAtom,DF,GF]),
   86        shell(Cmd).
   87
   88edges_to_imagefile(Edges,F) :-
   89        edges_to_imagefile(Edges,F, png).
   90edges_to_imagefile(Edges,F, Fmt) :-
   91        edges_to_dotfile(Edges,F,['-t'=Fmt]).
   92        
   93
   94node_obj(N, Obj) :-
   95        findall(A,node_attr(N,A),Attrs),
   96        (   Attrs=[]
   97        ->  true
   98        ;   true),
   99        shorten(N,Nx),
  100        Obj = node{id:Nx}.put(Attrs).
  101
  102:- rdf_meta node_attr(r,-).
  103node_attr(rdfs:subClassOf, lbl='is_a').
  104node_attr(N, lbl=Label) :-
  105        rdf(N, rdfs:label, Label1),
  106        eval_to_atom(str(Label1),Label).
  107
  108
  109        
  110
  111edge_obj(edge(S,O,P), Dict) :- edge_obj(edge(S,O,P,[]), Dict).
  112edge_obj(edge(S,O,P,Attrs), Dict) :-
  113        shorten(S,Sx),
  114        shorten(O,Ox),
  115        shorten(P,Px),
  116        Dict1 = edge{sub:Sx, obj:Ox, pred:Px},
  117        (   Attrs = []
  118        ->  Dict = Dict1
  119        ;   Meta=meta{}.put(Attrs),
  120            Dict = Dict1.put([meta=Meta])).
  121
  122
  123edge_node(edge(S,O,P,_),N) :- edge_node(edge(S,O,P),N).
  124edge_node(edge(X,_,_),X).
  125edge_node(edge(_,X,_),X).
  126edge_node(edge(_,_,X),X).
  127
  128
  129collect_nodes(Edges,Nodes) :-
  130        setof(N,Edge^(member(Edge,Edges),edge_node(Edge,N)),Nodes),
  131        !.
  132collect_nodes(_,[])