SPARQL Tips and Tricks

There are several less-than-obvious constructs that will help you construct useful SPARQL queries. The ACUITy team passes on the following lessons-learned.

  1. If you are doing function access to a Resource, e.g., regex pattern matching on the URL, you must wrap the variable reference in the "str()" function.
    Example: suppose you have the triple <http://some_namespace#Test> <rdfs:label> "Test"
    Then SELECT ?x ?l WHERE {?x <rdfs:label> ?l . FILTER (regex(?l,"Test"))} will match but
    SELECT ?x ?l WHERE {?x <rdfs:label> ?l . FILTER (regex(?x,"Test"))} will not match. The required syntax is
    SELECT ?x ?l WHERE {?x <rdfs:label> ?l . FILTER (regex(str(?x),"Test"))}
  2. To get only the direct subclasses of something, e.g., of apvf:ServerSideScript, use the special predicate:
    SELECT distinct ?t WHERE {?t <urn:x-hp-direct-predicate:http_//www.w3.org/2000/01/rdf-schema#subClassOf> <apvf:ServerSideScript> }

There are also some pit falls to avoid!

  1. SPARQL appears to be strongly typed in the sense that domains and ranges must match. For example, suppose that a Vantage had a property called currentPerson with range xsd:string. Suppose further that there was a property called hasHomePage with domain Person and range URL. The the query
    SELECT ?URL WHERE {${currentVantage} <currentPerson> ?p . ?p <hasHomePage> ?URL}
    would never return anything, even though the value of currentPerson might be "http://....#John_Doe" and there might be a Person instance with URI "http://...#John_Doe". In other words, they appear to the human eye to match but since one is an xsd:string and the other is an Individual of type Person, they do not. The solution is to make sure that the domains and ranges of properties that will be used in constructing graph patterns are consistent.

Copyright General Electric Company 2006, 2007
Last revised 03/05/2007