- From: Holger Knublauch <holger@topquadrant.com>
- Date: Thu, 23 Oct 2014 10:28:04 +1000
- To: public-data-shapes-wg@w3.org
(This requirement is only relevant if SPARQL is chosen to play a role in the solution. However I mention it now because it may remove some of the prejudices against SPARQL being too complicating). SPARQL functions are identified by their URI. A SPARQL engine could follow that URI to learn about functions that it hasn't encountered yet. There is no standard mechanism to declare new extension functions. This WG could fill this gap, because having user-defined SPARQL functions significantly improves the user experience and maintainability of SPARQL queries and constraints. Example: Assuming we want to implement a cardinality check for a given property, to make sure that a ?subject has at most 10 values of ex:property. In vanilla SPARQL this could be written down with a nested SELECT as SELECT * WHERE { { SELECT (COUNT(?value) AS ?cardinality) WHERE { ?subject a ex:Class . ?subject ex:property ?value . } GROUP BY ?subject } FILTER (?cardinality <= 10) } A user-defined function would be like a stored procedure, and execute an encapsulated SPARQL query when called. With such a function spl:objectCount, the query above would become SELECT * WHERE { ?subject a ex:Class . FILTER (spl:objectCount(?subject, ex:property) <= 10) . } Which is far more readable and reusable. Furthermore it resolves an issue with the inside-out execution order of SPARQL (it's difficult to pass values into a nested SELECT). SPIN provides an RDF vocabulary to represent such functions. In the example above, the body of that function would be SELECT (COUNT(?object) AS ?result) WHERE { ?arg1 ?arg2 ?object . } and ?arg1 is passed into the body from the subject, and ?arg2 is the property. Once we have agreed on a vocabulary to define such functions, SPARQL processors can follow the URI of a function to learn about the declared arguments, body and return type, and then execute the nested body query whenever the function is called. There are also SPIN extensions that allow these bodies to be JavaScript snippets, and we could define extensions that call web services etc. Thanks Holger
Received on Thursday, 23 October 2014 00:30:29 UTC