How can I use sub-queries to enable literal value based joins?

What?

Use of SPARQL sub-queries to enable the dynamic generation of literal values for SPO triple objects.

Why?

Sophisticated access to literal values via sub-queries provides a powerful mechanism for enhancing SPARQL graph patterns via dynamic literal value generation.

How?

Use select list variables from sub-queries to produce literal object values in SPARQL graph patterns as demonstrated in the example below.

Example

Assume the following query in which for ?app there is only exactly one resource which has this identifier:


SELECT DISTINCT ?r 
WHERE 
  {
    graph ?g 
      {
        ?r nie:url ?url .
      }  .
      ?g nao:maintainedBy ?app .
      ?app nao:identifier "nepomukindexer" .
  }

If one is not sure that ?app is the only identifier (e.g., if triple ?app nao:identifier "nepomukindexer" can appear in more than one graph), then the query can be rewritten to:


SELECT DISTINCT ?r 
WHERE 
  {
    graph ?g 
      {
        ?r nie:url ?url .
      }  .
      ?g nao:maintainedBy ?app .
      FILTER (?app = (SELECT ?a WHERE { ?a nao:identifier "nepomukindexer" }))
}

or even simpler:


SELECT DISTINCT ?r 
WHERE 
  {
   graph ?g 
     {
       ?r nie:url ?url .
     }  .
   ?g nao:maintainedBy `(SELECT ?a WHERE { ?a nao:identifier "nepomukindexer" })` .
 }

Related