13 October 2006

Assignment Property Function

SPARQL is a graph pattern matching language, The matching can be semantic (basic graph patterns are entailed by the data in order to match) or through the algebra that works over the top of basic graph pattern matching.

Complex queries make use of UNION and OPTIONAL, including the idiom with OPTIONAL and !BOUND, in all sorts of creative ways. And sometimes they want the answers to indicate which way the query matched to get a particular solution.

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>

SELECT ?label
{
   { ?concept skos:prefLabel ?label }
 UNION
   { ?concept skos:altLabel ?label }
}

Which matched? the prefLabel or altLabel? The application can assign the different to branches to different variables although that might be inconvenient in a larger query if ?label is used elsewhere in the query.

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>

SELECT ?label_pref ?label_alt
{
  { ?concept skos:prefLabel ?label_pref }
UNION
  { ?concept skos:altLabel  ?label_alt }
}

ARQ's property functions provide a way of adding different ways to match a triple pattern. Uses include calling out to custom code to perform some calculation, or calling out to use a external index, such as Lucene.

Property functions can assign to variables in the solution - unlike FILTER functions which must not have side effects. Property functions can't change values but they can bind an unbound variable or check an existing binding is compatible.

PREFIX apf:   <java:com.hp.hpl.jena.query.pfunction.library.>
SELECT ?x
{
 ?x apf:assign "Hello World"
}
-----------------
| x             |
=================
| "Hello World" |
-----------------

It works both ways round: { "Hello World" apf:assign ?x } gives the same results.

If subject and object are constants or already bound, apf:assign checks to see if they are the same. If they are, the tripe pattern matches with no change to the solution, otherwise it does not match and that solution is rejected. The "sameness" is Jena's sameValueAs, just like the rest of graph matching. If both variables are unbound, apf:assign complains and the query is broken.