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).