Is there a way to find a path between 2 vertices only including edges having a property with specific value in orient DB ?
I am able to find the path between 2 vertices but not able to filter out based on edge properties.
答案 0 :(得分:1)
如果你想要2个顶点之间的路径,那么你可以这样做:
SELECT $path as path
FROM (
TRAVERSE outE(), inV() FROM #13:1
)
WHERE @rid == '14:2'
这基本上是通过#13:1 的边缘,构建路径。只保留以#14:2 结尾的那些结尾。需要注意的一点是,它将返回多个路径,但是如果两条路径共享一条公共轨道,则只会检索其中一条路径(这就是带有遍历命令的东西,用于防止循环和效率)
如果您还有其他条件要应用于遍历,可以将它们放在 WHILE 中。假设您还想从边缘考虑测试属性的值:
SELECT $path as path
FROM (
TRAVERSE outE(), inV() FROM #13:1
WHILE (@class == 'V') OR (@class == 'E' AND test == 3)
)
WHERE @rid == '14:2'
这里你需要这两个条件,因为你遍历了两个顶点和边,所以如果它是一个边缘你要检查测试属性,如果它是一个顶点,没有条件,继续遍历。
注意:强>
Traverse命令有一个警告,你无法获得2个顶点之间的所有可能路径(不包括带有cicles的路径),因为遍历避免多次遍历一个节点,所以$ path只有一个包含目标的路径顶点。由于我们过滤路径检查遍历节点的id,我们只得到一条路径,因为它不会多次遍历一个节点。我们需要一种方法来查找路径,而不依赖于遍历的节点....
我们有优势!这是解决方法:
BEGIN;
LET target = SELECT @rid as rid, inE() as ins FROM <target_id>
LET paths = SELECT $path as path
FROM (TRAVERSE outE(), inV() FROM <source_id>)
WHERE @rid in $target['ins'];
if ($paths.size() > 0) {
LET result = SELECT path.append(".inV(").append($target['rid'][0]).append(")") from $paths;
}
if ($paths.size() == 0) {
LET result = SELECT FROM $paths;
}
COMMIT;
RETURN $result;
所以我们从源头遍历每条路径,但是我们过滤那些包含来自目标的渐近边缘的路径。如果从源开始的路径包含来自目标的进入边缘,则它绝对是两者之间的有效路径。 然后我们做了一个小技巧,将目标顶点包含在路径中,这样我们就可以返回一个漂亮而完整的路径字符串。
这将返回2个顶点之间的所有路径,包括rels。它可能相当贪婪但是我找到了获得所有可能路径的唯一方法。
答案 1 :(得分:0)
不知道,如果你还在寻找答案,但你可以尝试这样的事情:
select from (traverse * from #13:1 while @rid <> #14:2) where test = 3
其中#13:1
是A的ID,#14:2 - 对于E.