I am trying to write a SPARQL query to return a path from a source to a destination. Below is the Turtle file representing the data set.
@prefix node:
Property paths in SPARQL are not things that you can query directly, but you can use property paths to help extract the edges along a path between two nodes. For instance, the following query returns the edges in paths from a to h. The basic idea is to use a property path to from a to some node u which has an edge to some node v from which there is a path to h. The values block just limits the value of e to be either p or q.
prefix node: <http://prism.uvsq.fr/>
prefix edge: <http://prism.uvsq.fr#>
select distinct ?u ?e ?v where {
values ?e { edge:p edge:q }
node:a (edge:p|edge:q)* ?u .
?u ?e ?v .
?v (edge:p|edge:q)* node:h .
}
----------------------------
| u | e | v |
============================
| node:a | edge:p | node:g |
| node:a | edge:p | node:b |
| node:g | edge:p | node:f |
| node:g | edge:p | node:c |
| node:f | edge:p | node:k |
| node:f | edge:p | node:g |
| node:k | edge:p | node:l |
| node:l | edge:p | node:g |
| node:c | edge:p | node:i |
| node:n | edge:p | node:m |
| node:h | edge:p | node:n |
| node:b | edge:p | node:c |
| node:a | edge:q | node:f |
| node:f | edge:q | node:l |
| node:c | edge:q | node:h |
| node:i | edge:q | node:j |
| node:j | edge:q | node:n |
| node:m | edge:q | node:g |
----------------------------
That doesn't give you the actual paths, but it gives you all and only the edges that are on paths from a to h. From that you can reconstruct paths by putting the graph back together and performing a depth first traversal to enumerate the paths.