Chris@0
|
1 /* This file is part of ClioPatria.
|
Chris@0
|
2
|
Chris@0
|
3 Author:
|
Chris@0
|
4 HTTP: http://e-culture.multimedian.nl/
|
Chris@0
|
5 GITWEB: http://gollem.science.uva.nl/git/ClioPatria.git
|
Chris@0
|
6 GIT: git://gollem.science.uva.nl/home/git/ClioPatria.git
|
Chris@0
|
7 GIT: http://gollem.science.uva.nl/home/git/ClioPatria.git
|
Chris@0
|
8 Copyright: 2007, E-Culture/MultimediaN
|
Chris@0
|
9
|
Chris@0
|
10 ClioPatria is free software: you can redistribute it and/or modify
|
Chris@0
|
11 it under the terms of the GNU General Public License as published by
|
Chris@0
|
12 the Free Software Foundation, either version 2 of the License, or
|
Chris@0
|
13 (at your option) any later version.
|
Chris@0
|
14
|
Chris@0
|
15 ClioPatria is distributed in the hope that it will be useful,
|
Chris@0
|
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@0
|
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@0
|
18 GNU General Public License for more details.
|
Chris@0
|
19
|
Chris@0
|
20 You should have received a copy of the GNU General Public License
|
Chris@0
|
21 along with ClioPatria. If not, see <http://www.gnu.org/licenses/>.
|
Chris@0
|
22 */
|
Chris@0
|
23
|
Chris@0
|
24 :- module(sesame_tests,
|
Chris@0
|
25 [ test/1,
|
Chris@0
|
26 test/0,
|
Chris@0
|
27 view/1,
|
Chris@0
|
28 in/1
|
Chris@0
|
29 ]).
|
Chris@0
|
30 :- use_module(serql).
|
Chris@0
|
31 :- use_module(library(rdf_ntriples)).
|
Chris@0
|
32 :- use_module(library('semweb/rdf_db')).
|
Chris@0
|
33 :- use_module(library(readutil)).
|
Chris@0
|
34 :- use_module(library(debug)).
|
Chris@0
|
35 :- use_module(rdfs_entailment, []).
|
Chris@0
|
36
|
Chris@0
|
37 :- multifile
|
Chris@0
|
38 user:file_search_path/2.
|
Chris@0
|
39
|
Chris@0
|
40 user:file_search_path(sesame, '/staff/jan/src/openrdf').
|
Chris@0
|
41
|
Chris@0
|
42
|
Chris@0
|
43 test_dir(construct, Dir) :-
|
Chris@0
|
44 absolute_file_name(sesame('test/files/testcases/SeRQL/CfwQuery'), Dir,
|
Chris@0
|
45 [ file_type(directory),
|
Chris@0
|
46 access(read)
|
Chris@0
|
47 ]).
|
Chris@0
|
48
|
Chris@0
|
49 assert_rdfs_triples :-
|
Chris@0
|
50 catch(nb_getval(rdfs_triples, Triples), _, fail), !,
|
Chris@0
|
51 forall(member(rdf(S,P,O), Triples), rdf_assert(S,P,O)).
|
Chris@0
|
52 assert_rdfs_triples :-
|
Chris@0
|
53 absolute_file_name(sesame('test/files/testcases/SeRQL/CfwQuery/test000-out.nt'), NT,
|
Chris@0
|
54 [ access(read)
|
Chris@0
|
55 ]),
|
Chris@0
|
56 load_rdf_ntriples(NT, Triples),
|
Chris@0
|
57 nb_setval(rdfs_triples, Triples),
|
Chris@0
|
58 forall(member(rdf(S,P,O), Triples), rdf_assert(S,P,O)).
|
Chris@0
|
59
|
Chris@0
|
60 test :-
|
Chris@0
|
61 test_dir(construct, Dir),
|
Chris@0
|
62 atom_concat(Dir, '/*-query', Pattern),
|
Chris@0
|
63 expand_file_name(Pattern, Files),
|
Chris@0
|
64 maplist(test_base, Files, Bases),
|
Chris@0
|
65 ( member(Base, Bases),
|
Chris@0
|
66 ( test_file(Base, true)
|
Chris@0
|
67 -> put('.'), flush_output
|
Chris@0
|
68 ; format('Test failed: ~w~n', [Base])
|
Chris@0
|
69 ),
|
Chris@0
|
70 fail
|
Chris@0
|
71 ; nl
|
Chris@0
|
72 ).
|
Chris@0
|
73
|
Chris@0
|
74 test_base(File, Base) :-
|
Chris@0
|
75 atom_concat(Base, '-query', File).
|
Chris@0
|
76
|
Chris@0
|
77
|
Chris@0
|
78 test(N) :-
|
Chris@0
|
79 test_dir(construct, Dir),
|
Chris@0
|
80 sformat(File, '~`0t~d~3|', [N]),
|
Chris@0
|
81 concat_atom([Dir, '/test', File], Base),
|
Chris@0
|
82 test_file(Base).
|
Chris@0
|
83
|
Chris@0
|
84 view(N) :-
|
Chris@0
|
85 test_dir(construct, Dir),
|
Chris@0
|
86 sformat(File, '~`0t~d~3|', [N]),
|
Chris@0
|
87 concat_atom([Dir, '/test', File], Base),
|
Chris@0
|
88 atom_concat(Base, '-query', Query),
|
Chris@0
|
89 edit(Query).
|
Chris@0
|
90 in(N) :-
|
Chris@0
|
91 test_dir(construct, Dir),
|
Chris@0
|
92 sformat(File, '~`0t~d~3|', [N]),
|
Chris@0
|
93 concat_atom([Dir, '/test', File], Base),
|
Chris@0
|
94 atom_concat(Base, '-in.nt', Query),
|
Chris@0
|
95 edit(Query).
|
Chris@0
|
96
|
Chris@0
|
97 test_file(Base) :-
|
Chris@0
|
98 test_file(Base, false).
|
Chris@0
|
99
|
Chris@0
|
100 test_file(Base, Silent) :-
|
Chris@0
|
101 atom_concat(Base, '-query', Query),
|
Chris@0
|
102 atom_concat(Base, '-in.nt', InFile),
|
Chris@0
|
103 atom_concat(Base, '-out.nt', OutFile),
|
Chris@0
|
104 read_file_to_codes(Query, Codes, []),
|
Chris@0
|
105 atom_codes(Text, Codes), % easier debugging
|
Chris@0
|
106 rdf_reset_db,
|
Chris@0
|
107 assert_rdfs_triples,
|
Chris@0
|
108 load_rdf_ntriples(InFile, Triples),
|
Chris@0
|
109 forall(member(rdf(S,P,O), Triples), rdf_assert(S,P,O)),
|
Chris@0
|
110 findall(Statement,
|
Chris@0
|
111 serql_query(Text, Statement, [entailment(rdfs)]),
|
Chris@0
|
112 Statements),
|
Chris@0
|
113 load_rdf_ntriples(OutFile, OutTriples),
|
Chris@0
|
114 ( compare_triples(Statements, OutTriples, _Subst)
|
Chris@0
|
115 -> true
|
Chris@0
|
116 ; ( Silent == true
|
Chris@0
|
117 -> fail
|
Chris@0
|
118 ; report_difference(Statements, OutTriples),
|
Chris@0
|
119 edit(Query)
|
Chris@0
|
120 )
|
Chris@0
|
121 ).
|
Chris@0
|
122
|
Chris@0
|
123
|
Chris@0
|
124 report_difference(Statements, OutTriples) :-
|
Chris@0
|
125 format(user_error, 'WRONG ANSWER~n~n', []),
|
Chris@0
|
126 format(user_error, ' *** Result ***:~n', []),
|
Chris@0
|
127 list_triples(Statements, user_error),
|
Chris@0
|
128 format(user_error, ' *** Official Result ***:~n', []),
|
Chris@0
|
129 list_triples(OutTriples, user_error).
|
Chris@0
|
130
|
Chris@0
|
131
|
Chris@0
|
132 list_triples([], _).
|
Chris@0
|
133 list_triples([rdf(S,P,O)|T], Stream) :-
|
Chris@0
|
134 rdf_global_id(LS, S),
|
Chris@0
|
135 rdf_global_id(LP, P),
|
Chris@0
|
136 ( nonvar(O), O = literal(_)
|
Chris@0
|
137 -> LO = O
|
Chris@0
|
138 ; rdf_global_id(LO, O)
|
Chris@0
|
139 ),
|
Chris@0
|
140 format(Stream, 'rdf(~p, ~p, ~p).~n', [LS, LP, LO]),
|
Chris@0
|
141 list_triples(T, Stream).
|
Chris@0
|
142
|
Chris@0
|
143
|
Chris@0
|
144 /*******************************
|
Chris@0
|
145 * COMPARING *
|
Chris@0
|
146 *******************************/
|
Chris@0
|
147
|
Chris@0
|
148 %% compare_triples(+PlRDF, +NTRDF, -Substitions)
|
Chris@0
|
149 %
|
Chris@0
|
150 % Compare two models and if they are equal, return a list of
|
Chris@0
|
151 % PlID = NTID, mapping NodeID elements.
|
Chris@0
|
152
|
Chris@0
|
153
|
Chris@0
|
154 compare_triples(A, B, Substitutions) :-
|
Chris@0
|
155 compare_list(A, B, [], Substitutions).
|
Chris@0
|
156
|
Chris@0
|
157 compare_list([], [], S, S).
|
Chris@0
|
158 compare_list(L1, L2, S0, S) :-
|
Chris@0
|
159 take_bag(L1, B1, E1, R1), !,
|
Chris@0
|
160 take_bag(L2, B2, E2, R2),
|
Chris@0
|
161 compare_field(B1, B2, S0, S1),
|
Chris@0
|
162 compare_bags(E1, E2, S1, S2),
|
Chris@0
|
163 compare_list(R1, R2, S2, S).
|
Chris@0
|
164 compare_list([H1|T1], In2, S0, S) :-
|
Chris@0
|
165 select(H2, In2, T2),
|
Chris@0
|
166 compare_triple(H1, H2, S0, S1), % put(.), flush_output,
|
Chris@0
|
167 compare_list(T1, T2, S1, S).
|
Chris@0
|
168
|
Chris@0
|
169 compare_triple(rdf(Subj1,P1,O1), rdf(Subj2, P2, O2), S0, S) :-
|
Chris@0
|
170 compare_field(Subj1, Subj2, S0, S1),
|
Chris@0
|
171 compare_field(P1, P2, S1, S2),
|
Chris@0
|
172 compare_field(O1, O2, S2, S).
|
Chris@0
|
173
|
Chris@0
|
174 compare_field(X, X, S, S) :- !.
|
Chris@0
|
175 compare_field(literal(X), xml(X), S, S) :- !. % TBD
|
Chris@0
|
176 compare_field(NS:Name, Atom, S, S) :-
|
Chris@0
|
177 rdf_global_id(NS:Name, Atom), !.
|
Chris@0
|
178 compare_field(X, node(Id), S, S) :-
|
Chris@0
|
179 memberchk(X=Id, S), !.
|
Chris@0
|
180 compare_field(X, node(Id), S, [X=Id|S]) :-
|
Chris@0
|
181 \+ memberchk(X=_, S),
|
Chris@0
|
182 atom(X),
|
Chris@0
|
183 rdf_is_bnode(X), !,
|
Chris@0
|
184 debug(bnode, 'Assume ~w = ~w~n', [X, node(Id)]).
|
Chris@0
|
185
|
Chris@0
|
186
|
Chris@0
|
187 %% compare_bags(+Members1, +Members2, +S0, -S)
|
Chris@0
|
188 %
|
Chris@0
|
189 % Order of _1, _2, etc. are not relevant in BadID reification. Are
|
Chris@0
|
190 % they in general? Anyway, we'll normalise the order of the bags
|
Chris@0
|
191
|
Chris@0
|
192 compare_bags([], [], S, S).
|
Chris@0
|
193 compare_bags([E1|T1], M, S0, S) :-
|
Chris@0
|
194 select(E2, M, T2),
|
Chris@0
|
195 compare_field(E1, E2, S0, S1),
|
Chris@0
|
196 compare_bags(T1, T2, S1, S).
|
Chris@0
|
197
|
Chris@0
|
198 take_bag(Triples, Bag, Elems, RestTriples) :-
|
Chris@0
|
199 select(rdf(Bag, Type, BagClass), Triples, T1),
|
Chris@0
|
200 compare_field(rdf:type, Type, [], []),
|
Chris@0
|
201 compare_field(rdf:'Bag', BagClass, [], []),
|
Chris@0
|
202 bag_members(T1, Bag, Elems, RestTriples).
|
Chris@0
|
203
|
Chris@0
|
204 bag_members([], _, [], []).
|
Chris@0
|
205 bag_members([rdf(Bag, IsElm, E)|T], Bag, [E|ET], Rest) :-
|
Chris@0
|
206 member_prop(IsElm), !,
|
Chris@0
|
207 bag_members(T, Bag, ET, Rest).
|
Chris@0
|
208 bag_members([T0|T], Bag, Elems, [T0|R]) :-
|
Chris@0
|
209 bag_members(T, Bag, Elems, R).
|
Chris@0
|
210
|
Chris@0
|
211 member_prop(rdf:Name) :-
|
Chris@0
|
212 atom_codes(Name, [0'_|Codes]),
|
Chris@0
|
213 number_codes(_N, Codes), !.
|
Chris@0
|
214 member_prop(Prop) :-
|
Chris@0
|
215 atom(Prop),
|
Chris@0
|
216 rdf_parser:rdf_name_space(NS),
|
Chris@0
|
217 atom_concat(NS, Name, Prop),
|
Chris@0
|
218 atom_codes(Name, [0'_|Codes]),
|
Chris@0
|
219 number_codes(_N, Codes), !.
|