求从一个点出发m到n跳所有能经过的具有某一个tag的点

请问,我需要查询从点a出发,经过edge1,edge2,edge3任意组合的m到n跳的边,能够经过的所有的具有tag1的点应该怎么写呢。如果用match语句已经写出来了,可以用go语句来实现么

go m to n steps from ‘xxx’ over edge where tags($$) == [‘tag1’] return $$ as dst

1 个赞

假设我有(vertex1)-[edge1]->(vertex3),(vertex1)-[edge1]->(vertex2)-[edge2]->(vertex3),(vertex1)-[edge3]->(vertex4)-[edge1]->(vertex5)-[edge2]->(vertex3)。确实使用go 1 to 3 steps from "vertex1" over edge1,edge2,edge3 where tags($$) == ["tag1"] and edge1.startTime < now() and edge1.expirationTime > now() and properties($$).code == "xxxxxx" yield $$ as dst可以进行筛选。但是我现在edge2也有过期时间这个属性。但是如果我加上 and edge2.expirationTime > now(),最终查询的结果为空。最终要实现类似

MATCH (src)-[e:edge1|:edge2|:edge3*1..3]->(dst:tag1) 
WHERE  id(src) == "vertex1"  AND ANY(e_ IN e WHERE e_.startTime <= now() AND e_.expirationTime > now)  and dst.code in ["xxxxxx"] 
RETURN  distinct id(dst)

有什么方法吗

where tags($$) == [“tag1”] and ( (edge1.startTime < now() and edge1.expirationTime > now()) or (edge2.startTime < now() and edge2.expirationTime > now()) ) and properties($$).code == “xxxxxx”

可能是我描述的不清楚,就是a到b的路径里,要么有edge1,要么有edge1和edge2,这两种都要求edge1的时间要满足条件,如果有edge2,那么edge2也需要满足条件。那么这个用or是不对的。

其实我们现在想明确的一个问题是go语句的行为,文档上的描述是

GO用指定的过滤条件遍历图,并返回结果。

如果在遍历过程中出现某个点或边不符合条件,那么这条路径上后续的点/边是否还会继续遍历,就我们目前测试的结果来看,答案是会的,不知道这是一个bug还是有意这么设计

你是用的 go m to n steps 还是 go。n steps

用的是go m to n。我们是一个组的。这个对边的筛选有什么区别吗?我们是一个组的

但是我们用的m是1

而且根据我上面举例的场景,也只能使用go m to n steps

是这样设计的, 条件不满足的话,也会拓展,只是最后 收集结果时候 把不满足的 删掉

go m to n 是对拓展过程中的 每一跳 都进行了过滤, go n steps是 只对最后一跳进行了过滤,前n-1 跳没有过滤

match和go语句的性能会相差多少呢?另外,nebula是否考虑出一个判定a到b只要有一条合法路径就提前停止遍历的方法呢

match和go的性能差距没有实际测试过,不过年后的3.0版本上,match的性能会有所提升,
你说的 判定a到b 只要有一条合法路径就结束的 语法目前没有,可以帮忙提个issue,PM小姐姐会定时收集用户的需求,评审

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。