Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select multiple values as object in SPARQL pattern

In SPARQL we can do something like this

select * where {
    ?s   (_:prop1 | _:prop2)  "some_val" .
    ...
    #use ?s in other patterns
    ?s    ?o    ?p .
}

Is it possible to do the same for the object part of the pattern? And what are some workarounds of this in case it is not possible?

For example:

select * where {
    ?s   _:prop ("v1" | "v2") .
    ...
    #use ?s in other patterns
    ?s    ?o    ?p .
}
like image 848
0xFF Avatar asked Jul 11 '13 17:07

0xFF


1 Answers

There are a few ways to do this. The simplest and pure SPARQL 1.0 method is to use UNION e.g.

SELECT * WHERE
{
  { ?s _:prop "v1" } UNION { ?s _:prop "v2" }

  # Use ?s in other patterns
}

This is probably the simplest method but if you need multiple constraints on ?s this can quickly get unwieldy.

Second method is to use the IN function in a FILTER clause, this requires a SPARQL 1.1 implementation e.g.

SELECT * WHERE
{
  ?s _:prop ?value .
  FILTER(?value IN ("v1", "v2"))

  # Use ?s in other patterns
}

Problem here is that using IN can perform very poorly if you have many alternatives or a lot of data that may be matched by ?s _:prop ?value

Aside - Many optimisers will actually expand this second method into the first method under the hood.

Third method is to use the VALUES clause which again requires a SPARQL 1.1 implementation:

SELECT * WHERE
{
  VALUES (?value) { ( "v1" ) ( "v2 " ) }
  ?s _:prop ?value .

  # Use ?s in other patterns
}

This is likely the best option since it scales to many alternatives better (depending on your SPARQL implementation) and is maybe the nicest to read and write.

like image 185
RobV Avatar answered Oct 15 '22 02:10

RobV