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).
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(_,[])