annotate jamendo/sparql-archived/p2r.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 :- 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