Querying a Graph path in SPARQL
Asked Answered
A

1

1

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: <http://prism.uvsq.fr/>.
@prefix edge: <http://prism.uvsq.fr#>.
node:a edge:p node:b.
node:a edge:q node:f.
node:a edge:p node:g.
node:b edge:p node:c.
node:c edge:q node:h.
node:c edge:p node:i.
node:c edge:p node:d.
node:d edge:p node:e.
node:f edge:p node:g.
node:f edge:q node:l.
node:f edge:p node:k.
node:g edge:p node:c.
node:g edge:p node:f.
node:h edge:p node:n.
node:i edge:q node:j.
node:j edge:p node:o.
node:j edge:q node:n.
node:k edge:p node:l.
node:l edge:p node:g.
node:m edge:q node:g.
node:n edge:p node:m.

The image next presents the same information, for easier visualization.

Graph nodes and edges

The query I wrote so far is the following:

prefix graph: <http://prism.uvsq.fr/>
prefix node: <http://prism.uvsq.fr/>
prefix edge: <http://prism.uvsq.fr#>
SELECT * FROM graph: WHERE {
   node:a (edge:p|edge:q) ?des.
   ?des (edge:p|edge:q)* node:h.
}

The returned information only shows one level of the solution (it shows the possible neighbor nodes for reaching the destination). Thanks in advance for your help. Best Regards

Allege answered 6/3, 2015 at 13:54 Comment(8)
That's because ?des can only be one edge away from ?node, since you used the pattern node:a (edge:p|edge:q) ?des.. Did you mean node:a (edge:p|edge:q)* ?des. (with a star)? Then ?des can be any node along a path between a and h.Jabe
Finding all steps in property path may help. The accepted answer says that this isn't possible, but my answer shows that you actually can do this in some cases.Jabe
This seems very similar to getting a graph path using SPARQL. Is this a class assignment?Jabe
I tried it also with a * but the results are not comprehensive at all. I am searching for a way to get all the path from a to h. Thanks for the Links I will have a look at them. And no this is not a class assignment, I am a PhD student and I am seeking for such way to integrate it with my work.Allege
It's OK to ask about assignments (though it's usually good to mention if it is). Do you happen to know if one of your colleagues posted the other question (from about 2 hours before yours): https://mcmap.net/q/1176899/-getting-a-graph-path-using-sparql-duplicate/1281433. It's almost identical, after all, down to the data (using p and q as edges, and nodes labeled from a to o), and the desired result. Given the timing, it's very hard to imagine that these aren't related.Jabe
Yes he is my supervisor we were seeking for an answer to this question.Allege
so an answer to either question would be fine, since you'll both get an answer. I'm going to flag the other as a duplicate of this one, since I think that this one is nicer (it has the picture), and starts with a better query.Jabe
Yes an asnwer to any of us is good.Ok thank you very much.Allege
J
3

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.

Jabe answered 6/3, 2015 at 20:4 Comment(1)
So I think there is no way till now to fully support our needs. The technique you showed is interesting. Many thanks for your efforts and your help it is appreciated.Allege

© 2022 - 2024 — McMap. All rights reserved.