Mercurial > hg > dml-open-cliopatria
diff cpack/p2r/README.md @ 0:718306e29690 tip
commiting public release
author | Daniel Wolff |
---|---|
date | Tue, 09 Feb 2016 21:05:06 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpack/p2r/README.md Tue Feb 09 21:05:06 2016 +0100 @@ -0,0 +1,82 @@ +# P2R + +A set of modules allowing you to export +prolog predicates as RDF just by declaring +mappings, and access them through a SPARQL +end-point. + +Yves Raimond (c) 2007 +Centre for Digital Music, Queen Mary, +University of London + +Samer Abdallah (c) 2010, 2014 +Department of Computer Science, UCL + +## Installation & running + + 1. Get ClioPatria from here: + http://cliopatria.swi-prolog.org/home + and set it up as per instructions. + + 2. Copy or link this p2r directory into the cpacks directory of + your working ClioPatria server. + + 3. Register the cpack by doing (at the Prolog prompt) + + ?- cpack_configure(p2r). + + 4. In your code, do + + :- use_module(entailment(p2r)). + + Register any prefixes you need with rdf_register_prefix/2, declare any + macros with uripattern:def(_,_), and write your mapping rules. + + 5. Use the triples: + + a) Select p2r\_entailment on ClioPatria's SPARQL/SeRQL page... + + b) ...or call p2r\_entailment:rdf/3 directly (not recommended) + + c) ...or dump all the p2r\_entailment:rdf/3 triples into the main rdf database, using, eg + + forall(p2r_entailment:rdf(A,B,C), rdf_assert(A,B,C,p2r)). + + Asserting the triples into a named graph (p2r) makes it easy + to delete them all and re-import when things change. + + +## Pattern language + +Resources URIs and literals are expressed using a pattern language. +See the README in the lib directory. + +## Example mappings + +Suppose you have a predicate widget/3 which holds a database of +widget identifiers, names, and weights, and another predicate +connectable/2 which describes which widgets can be connected +to each other. Suppose also that the widgets are kept in a cabinet +with pidgeon holes arranged in a matrix, and that the location of +each widget is given by the predicate widget\_location/3. +We could expose this as RDF using the following mappings: + + :- rdf_register_prefix(eg,'http://www.example.org/'). + uripattern:def(loc(X,Y),num(X)/num(Y)). + + rdf(eg:widgets/enc(ID), rdf:type, eg:schema/'Widget') <== widget(ID,_,_). + + widget(ID,Name,Weight) ==> + rdf(eg:widget/enc(ID), rdf:label, literal(Name)), + rdf(eg:widget/enc(ID), eg:weight, literal(type(xsd:double,Weight)). + + rdf(eg:widget/enc(ID1), eg:connectsTo, eg:widget/enc(ID2) <= connectable(ID1,ID2). + + rdf(eg:widget/enc(ID), eg:location, eg:storage/loc(X,Y)) <= + widget_location(ID,X,Y). + +Note that URI patterns MUST be written into the rdf/3 terms in the head +of the rule (ie, the consequent part of the implication, rather than the +antecedent, no matter which way round the rule is written, using <== or ==>). +Otherwise, it is your responsibilty to construct or analyse any URIs. Of course, +you can use the uripattern module to help you do this.