Chris@0
|
1 :- module(p2r,[
|
Chris@0
|
2 classmap/4
|
Chris@0
|
3 , bridge_lit/4
|
Chris@0
|
4 , bridge_lit/5
|
Chris@0
|
5 , bridge_uri/4
|
Chris@0
|
6 ]).
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Parsing turtle mapping files
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12
|
Chris@0
|
13 :- consult(library('semweb/rdf_db')).
|
Chris@0
|
14
|
Chris@0
|
15 :- rdf_register_ns(p2r,'http://moustaki.org/p2r#').
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * Parsing class mappings
|
Chris@0
|
19 */
|
Chris@0
|
20 classmap(CM,Engine,UriPattern,Class) :-
|
Chris@0
|
21 rdf(CM,rdf:type,p2r:ClassMap),
|
Chris@0
|
22 rdf(CM,p2r:prologEngine,Engine),
|
Chris@0
|
23 rdf(CM,p2r:uriPattern,literal(UriPattern)),
|
Chris@0
|
24 rdf(CM,p2r:class,Class).
|
Chris@0
|
25
|
Chris@0
|
26 /**
|
Chris@0
|
27 * Parsing property bridges
|
Chris@0
|
28 */
|
Chris@0
|
29 %bridge arguments/literals
|
Chris@0
|
30 bridge_lit(PB,ClassMap,Property,Arg) :-
|
Chris@0
|
31 rdf(PB,rdf:type,p2r:PropertyBridge),
|
Chris@0
|
32 rdf(PB,p2r:belongsToClassMap,ClassMap),
|
Chris@0
|
33 rdf(PB,p2r:property,Property),
|
Chris@0
|
34 rdf(PB,p2r:'arg',literal(Arg)).
|
Chris@0
|
35 bridge_lit(PB,ClassMap,Property,Arg,Dt) :-
|
Chris@0
|
36 bridge_lit(PB,ClassMap,Property,Arg),
|
Chris@0
|
37 rdf(PB,p2r:datatype,Dt).
|
Chris@0
|
38
|
Chris@0
|
39 %uri patterns bridge (object properties)
|
Chris@0
|
40 bridge_uri(PB,ClassMap,Property,UriPattern) :-
|
Chris@0
|
41 rdf(PB,rdf:type,p2r:PropertyBridge),
|
Chris@0
|
42 rdf(PB,p2r:belongsToClassMap,ClassMap),
|
Chris@0
|
43 rdf(PB,p2r:property,Property),
|
Chris@0
|
44 rdf(PB,p2r:uriPattern,literal(UriPattern)).
|
Chris@0
|
45
|
Chris@0
|
46
|
Chris@0
|
47 /**
|
Chris@0
|
48 * Tools to interpret patterns
|
Chris@0
|
49 */
|
Chris@0
|
50
|
Chris@0
|
51 :- op(700,xfx,'$').
|
Chris@0
|
52
|
Chris@0
|
53 instantiate_prop_lit(UriPattern,ArgPattern,Uri,Literal) :-
|
Chris@0
|
54 instantiate_uri(UriPattern,Uri,Queries),
|
Chris@0
|
55 atom_to_term(ArgPattern,Query,[]),
|
Chris@0
|
56 Query=(Mod:Pred/Arity$Arg),
|
Chris@0
|
57 length(Args,Arity),
|
Chris@0
|
58 forall(member(solved(Mod2:Pred2/Arity2$Arg2),Result),
|
Chris@0
|
59 nth1(Arg2,Args,Result)),
|
Chris@0
|
60 ToCall=..[Pred|Args],
|
Chris@0
|
61 nth1(Arg,Args,Literal).
|
Chris@0
|
62
|
Chris@0
|
63 instantiate_uri(UriPattern,Uri,Queries) :-
|
Chris@0
|
64 parse_pattern(UriPattern,Parsed),
|
Chris@0
|
65 run_queries(Parsed,List,Queries),
|
Chris@0
|
66 writeln(List),
|
Chris@0
|
67 list_to_atom(List,Uri).
|
Chris@0
|
68
|
Chris@0
|
69 run_queries(A,B) :-
|
Chris@0
|
70 run_queries(A,B,_).
|
Chris@0
|
71 run_queries([],[],[]).
|
Chris@0
|
72 run_queries([query(H)|T],[Result|T2],[solved(Query,Result)|T3]) :-
|
Chris@0
|
73 !,
|
Chris@0
|
74 writeln(H),
|
Chris@0
|
75 atom_chars(QueryAt,H),
|
Chris@0
|
76 atom_to_term(QueryAt,Query,[]),
|
Chris@0
|
77 writeln(Query),
|
Chris@0
|
78 run_query(Query,Result),
|
Chris@0
|
79 run_queries(T,T2,T3).
|
Chris@0
|
80 run_queries([H|T],[H|T2],T3) :-
|
Chris@0
|
81 run_queries(T,T2,T3).
|
Chris@0
|
82
|
Chris@0
|
83 run_query(Mod:Pred/Arity$Arg, Result) :-
|
Chris@0
|
84 length(Args,Arity),
|
Chris@0
|
85 ToCall =.. [Pred|Args],
|
Chris@0
|
86 call(Mod:ToCall),
|
Chris@0
|
87 writeln(Args),
|
Chris@0
|
88 nth1(Arg,Args,Result).
|
Chris@0
|
89
|
Chris@0
|
90
|
Chris@0
|
91
|
Chris@0
|
92
|
Chris@0
|
93
|
Chris@0
|
94 /**
|
Chris@0
|
95 * Getting prolog queries out of URI patterns
|
Chris@0
|
96 */
|
Chris@0
|
97 parse_pattern(Atom,Parsed) :-
|
Chris@0
|
98 atom_chars(Atom,CharList),
|
Chris@0
|
99 parse_pattern_out(CharList,Parsed).
|
Chris@0
|
100
|
Chris@0
|
101 parse_pattern_out(['@','@'|T],[query(Q)|T2]) :-
|
Chris@0
|
102 !,
|
Chris@0
|
103 parse_pattern_in(T,[query(Q)|T2]).
|
Chris@0
|
104 parse_pattern_out([H|T],[H|T2]) :-
|
Chris@0
|
105 parse_pattern_out(T,T2).
|
Chris@0
|
106 parse_pattern_out([],[]).
|
Chris@0
|
107 parse_pattern_in(['@','@'|T],[query([])|T2]) :-
|
Chris@0
|
108 !,
|
Chris@0
|
109 parse_pattern_out(T,T2).
|
Chris@0
|
110 parse_pattern_in([H|T],[query([H|T2])|T3]) :-
|
Chris@0
|
111 parse_pattern_in(T,[query(T2)|T3]).
|
Chris@0
|
112
|
Chris@0
|
113 /**
|
Chris@0
|
114 * Utils
|
Chris@0
|
115 */
|
Chris@0
|
116
|
Chris@0
|
117 list_to_atom(List,At) :-
|
Chris@0
|
118 list_to_atom(List,'',At).
|
Chris@0
|
119 list_to_atom([],At,At).
|
Chris@0
|
120 list_to_atom([Head|Tail],At1,At2) :-
|
Chris@0
|
121 atom_concat(At1,'',T),
|
Chris@0
|
122 atom_concat(T,Head,At3),
|
Chris@0
|
123 list_to_atom(Tail,At3,At2).
|
Chris@0
|
124
|