Reputation: 1
I'm using OrientDB Community Edition 3.2.3.
This is the graph of my data: [1]: https://i.sstatic.net/5yK7C.png
I would like to get all the paths that are connected to the node #17:9.
I tried the following traverse command:
select $path from (traverse in() from #17:9)
results that I am getting:
[#17:9]
[#17:9 #17:2]
[#17:9 #17:2 #17:4]
[#17:9 #17:2 #17:4 #17:3]
[#17:9 #17:2 #17:4 #17:0]
[#17:9 #17:2 #17:5]
results that I want to get:
[#17:9]
[#17:9 #17:2]
[#17:9 #17:2 #17:4]
[#17:9 #17:2 #17:4 #17:3]
[#17:9 #17:2 #17:4 #17:0]
[#17:9 #17:2 #17:5]
[#17:9 #17:2 #17:5 #17:0]
the last path is not included in the traversal. Is there the possibility to get this result?
would really appreciate any help on this.
Upvotes: 0
Views: 188
Reputation: 3762
The reason you are not getting the last path is because, OrientDB traversal does not visit the nodes that have already been visited.
Currently there is no easy way to enumerate all the full paths from one vertex to another. You can get the shortest path, any of the paths but not all the paths with a query.
The solution to this that I have been able to work out is extremely ugly but it works if there are no self-loops.
The solution requires two steps viz.:
Below is an example:
Query to select vertices of destination
SELECT @rid FROM (TRAVERSE bothE() FROM #60:40 MAXDEPTH 1) WHERE $depth>0
Select all the edges from #60:40 rid
The result in the graph that I am considering is:
#15:15
#14:15
#17:12
#67:30
Query to
Get the paths from the source vertex till one of the edges:
SELECT $path FROM (TRAVERSE * FROM #51:0 WHILE @rid!=#60:40) WHERE ('#15:15' IN $path.asList()) OR
('#14:15' IN $path.asList()) OR
('#17:12' IN $path.asList()) OR
('#67:30' IN $path.asList())
Where '#51:0' is the starting vertex in my case.
Above is the partial view of the graph (the entire graph is too big)
In your case, you could use the '#17:0' as the destination vertex and the '#17:9' as the source vertex.
NOTE: The all the paths end in a 'dangling' edge whose out vertex is implicitly the destination vertex.
If someone can provide a shorter and better solution or optimize the above, it would be great. Since I am grappling with the same use case.
Upvotes: 0