match 查询语

match语句:MATCH p=(v:player{name:“Tim Duncan”})-[*…1000]->(v2) RETURN p AS Paths
我有个场景: 如果路径检索到某个点的一些属性不符要求,这个路径就终止到这个点,不再往后检索。
match 查询语言如何写?

1 个赞

我们暂时不支持这个功能,我先记录一个需求了,如果有更新的进展我来更新帖子哈。

MATCH p=(v1:player{name:"Tim Duncan"})-[*1..20]->() 
  WHERE ALL(mid_node in nodes(p) WHERE mid_node.name=="Tim Duncan" or mid_node.age>45 ) 
RETURN p AS Paths

从起点变长拓展 1 到 20 步,要求中间节点 age 大于 45,输出所有符合条件的路径。
这个可以满足需求吗?

1 个赞

这应该是一个比较有用的场景, 可以专门做下优化, 把where All/None下推到expand里.

LDBC 里面这些语句都有,没必要一个个记的

我需要的是:不满足条件的那个点不要舍弃,这个点后面的才舍弃。

路径中间点呢?

路径中间点不包含这个点

因为我们的业务场景是,检索到这个点后,后面的分支路径非常多,没必要再检索了

1 个赞

其实是在找第一个终点不满足条件的所有路径哈?试下这个:

MATCH p=(v1:player{name:"Tim Duncan"})-[*1..20]->(v2) 
  WHERE v2.age<>45 and ALL(mid_node in nodes(p)[1..-1] WHERE mid_node.age==45 ) 
RETURN p

中间节点 age 都等于 45,终点不等于 45 的全部路径。

1 个赞

可能我说的不太清楚, 检索还是检索所有的路径,只不过一些路径当遇到了某个特定的点后,这些路径 就不再往后检索,但是这些路径的终点就取这个点。

MATCH p=(v1:player{name:"Tim Duncan"})-[*1..20]->(v2:player{age:45}) 
  WHERE ALL(mid_node in nodes(p)[1..-1] WHERE mid_node.age<>45) 
RETURN p

检索所有路径,路径一旦遇到 age 是 45 的点就不再往后检索。最终匹配到的路径除终点 age 是 45 之外,其他点 age 都不等于 45。跟你的描述相符吗?

牛逼啊

有些路径是没有age=45的点的,像这样的路径,终点就不是age=45

我大概理解你的意思是:中间没有坏点(age=45 是坏点)的路径。

MATCH p=(v1:player{name:"Tim Duncan"})-[*1..20]->(v2:player) 
  WHERE ALL(mid_node in nodes(p)[1..-1] WHERE mid_node.age<>45) 
RETURN p
1 个赞

我的版本是2.0.1, 为什么 执行你的这个 nGQL 报错??

这个场景我也有用到,后面的路径不满足了,就不往下找了。但是这个路径前面的保留

报的什么错

看来这个场景用得确实蛮多的,后续我们会考虑做一些性能优化,感谢反馈!


我把[1…-1] 去掉就不报错了,但是这样不是我想要的

浙ICP备20010487号