31
32:- module(serql_runtime,
33 [ serql_compare/3, 34 serql_eval/2, 35 serql_member_statement/2 36 ]). 37:- use_module(library(xsdp_types)). 38:- use_module(library(debug)). 39:- use_module(library('semweb/rdf_db')). 40
41
48
49
50 53
58
59serql_compare(Op, L, R) :-
60 serql_eval(L, VL),
61 serql_eval(R, VR), !,
62 do_compare(Op, VL, VR).
63
64do_compare(like, literal(Value), Pattern) :- !,
65 to_string(Value, String),
66 rdf_match_label(like, Pattern, String).
67do_compare(like, Resource, Pattern) :- !,
68 atom(Resource),
69 rdf_match_label(like, Pattern, Resource).
70do_compare(=, X, X) :- !.
71do_compare(=, literal(X), query(X)) :- !.
72do_compare(=, X, query(X)) :- !.
73do_compare(\=, X, Y) :- !,
74 \+ do_compare(=, X, Y).
75do_compare(Op, literal(Data), query(Query)) :-
76 catch(to_number(Query, Right, TypeQ), _, fail), !,
77 ( nonvar(TypeQ), atom(Data)
78 -> catch(xsdp_convert(TypeQ, [Data], Left), _, fail)
79 ; catch(to_number(Data, Left, TypeD), _, fail),
80 serql_subsumes(TypeQ, TypeD)
81 ),
82 cmp_nums(Op, Left, Right).
83do_compare(Op, literal(Data), query(Query)) :- !,
84 ( atom(Query) 85 -> atom(Data), 86 cmp_strings(Op, Data, Query)
87 ).
88do_compare(Op, query(Query), literal(Data)) :- !,
89 inverse_op(Op, Inverse),
90 do_compare(Inverse, literal(Data), query(Query)).
91do_compare(Op, literal(Value), literal(Number)) :-
92 catch(to_number(Value, Left, TypeL), _, fail),
93 catch(to_number(Number, Right, TypeR), _, fail),
94 TypeL == TypeR,
95 cmp_nums(Op, Left, Right).
96
97serql_eval(Var, X) :-
98 var(Var), !,
99 X = '$null$'.
100serql_eval(lang(X), Lang) :- !,
101 lang(X, Lang).
102serql_eval(datatype(X), Type) :- !,
103 datatype(X, Type).
104serql_eval(label(X), Lang) :- !,
105 label(X, Lang).
106serql_eval(X, X).
107
113
114lang(literal(lang(Lang0, _)), Lang) :-
115 nonvar(Lang0), !,
116 Lang = literal(Lang0).
117lang(_, '$null$').
118
119datatype(literal(type(Type0, _)), Type) :-
120 nonvar(Type0), !,
121 Type = Type0.
122datatype(_, '$null$').
123
124label(literal(lang(_, Label0)), Label) :-
125 nonvar(Label0), !,
126 Label = literal(Label0).
127label(literal(Label0), Label) :-
128 nonvar(Label0), !,
129 Label = literal(Label0).
130label(_, '$null$').
131
132
133cmp_nums(=, L, R) :- L =:= R.
134cmp_nums(=<, L, R) :- L =< R.
135cmp_nums(<, L, R) :- L < R.
136cmp_nums(>, L, R) :- L > R.
137cmp_nums(>=, L, R) :- L >= R.
138
139cmp_strings(Op, S1, S2) :-
140 atom(S1), atom(S2),
141 compare(Op, S1, S2).
142
143inverse_op(=, =).
144inverse_op(=<, >).
145inverse_op(<, >=).
146inverse_op(>, =<).
147inverse_op(>=, <).
148
149to_number(type(Type, String), Num, Type) :- !, 150 atom_number(String, Num).
151to_number(lang(_Lang, String), Num, _) :- !,
152 atom_number(String, Num).
153to_number(String, Num, _) :-
154 assertion(atom(String)),
155 atom_number(String, Num).
156
158
159serql_subsumes(Q, Var) :- 160 nonvar(Q),
161 var(Var), !.
162serql_subsumes(_, Var) :- 163 var(Var), !, fail.
164serql_subsumes(Var, _) :- 165 var(Var), !.
166serql_subsumes(Query, Data) :-
167 xsdp_subtype_of(Data, Query).
168
169to_string(lang(_, String), String) :- !.
170to_string(type(_, String), String) :- !.
171to_string(String, String) :-
172 atom(String).
173
180
181serql_member_statement(RDF, [H|_]) :-
182 member_statement2(RDF, H).
183serql_member_statement(RDF, [_|T]) :-
184 serql_member_statement(RDF, T).
185
186member_statement2(RDF, optional(True, Statements)) :- !,
187 True = true,
188 serql_member_statement(RDF, Statements).
189member_statement2(RDF, RDF)