Mercurial > hg > dbtune-rdf-services
view 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 |
line wrap: on
line source
:- module(p2r,[ classmap/4 , bridge_lit/4 , bridge_lit/5 , bridge_uri/4 ]). /** * Parsing turtle mapping files */ :- consult(library('semweb/rdf_db')). :- rdf_register_ns(p2r,'http://moustaki.org/p2r#'). /** * Parsing class mappings */ classmap(CM,Engine,UriPattern,Class) :- rdf(CM,rdf:type,p2r:ClassMap), rdf(CM,p2r:prologEngine,Engine), rdf(CM,p2r:uriPattern,literal(UriPattern)), rdf(CM,p2r:class,Class). /** * Parsing property bridges */ %bridge arguments/literals bridge_lit(PB,ClassMap,Property,Arg) :- rdf(PB,rdf:type,p2r:PropertyBridge), rdf(PB,p2r:belongsToClassMap,ClassMap), rdf(PB,p2r:property,Property), rdf(PB,p2r:'arg',literal(Arg)). bridge_lit(PB,ClassMap,Property,Arg,Dt) :- bridge_lit(PB,ClassMap,Property,Arg), rdf(PB,p2r:datatype,Dt). %uri patterns bridge (object properties) bridge_uri(PB,ClassMap,Property,UriPattern) :- rdf(PB,rdf:type,p2r:PropertyBridge), rdf(PB,p2r:belongsToClassMap,ClassMap), rdf(PB,p2r:property,Property), rdf(PB,p2r:uriPattern,literal(UriPattern)). /** * Tools to interpret patterns */ :- op(700,xfx,'$'). instantiate_prop_lit(UriPattern,ArgPattern,Uri,Literal) :- instantiate_uri(UriPattern,Uri,Queries), atom_to_term(ArgPattern,Query,[]), Query=(Mod:Pred/Arity$Arg), length(Args,Arity), forall(member(solved(Mod2:Pred2/Arity2$Arg2),Result), nth1(Arg2,Args,Result)), ToCall=..[Pred|Args], nth1(Arg,Args,Literal). instantiate_uri(UriPattern,Uri,Queries) :- parse_pattern(UriPattern,Parsed), run_queries(Parsed,List,Queries), writeln(List), list_to_atom(List,Uri). run_queries(A,B) :- run_queries(A,B,_). run_queries([],[],[]). run_queries([query(H)|T],[Result|T2],[solved(Query,Result)|T3]) :- !, writeln(H), atom_chars(QueryAt,H), atom_to_term(QueryAt,Query,[]), writeln(Query), run_query(Query,Result), run_queries(T,T2,T3). run_queries([H|T],[H|T2],T3) :- run_queries(T,T2,T3). run_query(Mod:Pred/Arity$Arg, Result) :- length(Args,Arity), ToCall =.. [Pred|Args], call(Mod:ToCall), writeln(Args), nth1(Arg,Args,Result). /** * Getting prolog queries out of URI patterns */ parse_pattern(Atom,Parsed) :- atom_chars(Atom,CharList), parse_pattern_out(CharList,Parsed). parse_pattern_out(['@','@'|T],[query(Q)|T2]) :- !, parse_pattern_in(T,[query(Q)|T2]). parse_pattern_out([H|T],[H|T2]) :- parse_pattern_out(T,T2). parse_pattern_out([],[]). parse_pattern_in(['@','@'|T],[query([])|T2]) :- !, parse_pattern_out(T,T2). parse_pattern_in([H|T],[query([H|T2])|T3]) :- parse_pattern_in(T,[query(T2)|T3]). /** * Utils */ list_to_atom(List,At) :- list_to_atom(List,'',At). list_to_atom([],At,At). list_to_atom([Head|Tail],At1,At2) :- atom_concat(At1,'',T), atom_concat(T,Head,At3), list_to_atom(Tail,At3,At2).