annotate jamendo/sparql-archived/SeRQL/sesame_tests.pl @ 27:d95e683fbd35 tip

Enable CORS on urispace redirects as well
author Chris Cannam
date Tue, 20 Feb 2018 14:52:02 +0000
parents df9685986338
children
rev   line source
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), !.