MATCH语句匹配多个模式和多MATCH检索哪个性能更优?

  • nebula 版本:3.2.0
  • 部署方式: 分布式
  • 安装方式:RPM
  • 是否上生产环境:Y

我注意到MATCH语句支持匹配多个模式和多MATCH检索功能,这两个功能很像,请问在日常使用中推荐使用哪个,哪个性能更好。

例如要匹配一个模式 (m)-[]->(n)->[]->l 其中 id(m)==“player100” and id(n)==‘player125’
用多模式可以写为:

MATCH  (m)-[]->(n),(n)->[]->l  WHERE id(m)=="player100" and id(n)=='player125'
RETURN m,n,l;

用MATCH检索可以写为:

MATCH (m)-[]->(n) WHERE id(m)=="player100" \
MATCH (n)-[]->(l) WHERE id(n)=="player125" \
RETURN m,n,l;

另外注意到可以直接用MATCH匹配模式 (m)-[]->(n)->[]->l ,这样直接匹配和拆分为多模式((m)-[]->(n),(n)->[]->l )后使用上面两个功能的性能有差别吗。

谢谢。

1 个赞

MATCH (m)-[]->(n) MATCH (n)-[]->(l)MATCH (m)-[]->(n), (n)-[]->(l) 是等价的(性能也是一样 的),但 和 MATCH (m)-[]->(n)-[]->(l) 是不等价的(因为做的事情不同所以性能没什么可比性),不同 pattern 匹配到的路径中 边 是可以重复的,但单个 pattern 匹配到的路径中边是不重复的。

4 个赞

在openCypher的标准中,似乎 MATCH (m)-[]->(n), (n)-[]->(l)和MATCH (m)-[]->(n)-[]->(l) 是等价的,而与MATCH (m)-[]->(n) MATCH (n)-[]->(l) 不等价。Nebula在traverse算子的实现中仅对以逗号分割的单条路径中进行了去重,可能是由于生成执行计划的时候是按照以逗号分割的单条路径为单位生成的?

1 个赞

是的。我个人的观点是应该和 OpenCypher 保持一致,这样在语义表达能力上不会有太大差别(虽然都可以表达等价的语义,但写法上可能会麻烦很多),对于之前比较了解 cypher 的用户也会友好些。可能是实现或者产品定义的原因,达成的结论是目前这样。

2 个赞

@kyle @Salieri 谢谢两位。两位提到的"Nebula在traverse算子的实现中仅对以逗号分割的单条路径中进行了去重,可能是由于生成执行计划的时候是按照以逗号分割的单条路径为单位生成"这个话题。

想再请教一下,如果按照这个说法,那么MATCH (m)-[]->(n), (n)-[]->(l)边是有可能重复的,但是MATCH (m)-[]->(n)-[]->(l) 这种方式边是不重复的(因为MATCH采用trail类型路径),但又提到MATCH (m)-[]->(n), (n)-[]->(l)和MATCH (m)-[]->(n)-[]->(l)是等价的,这两个说法是不是有矛盾呢?

“MATCH (m)-[]->(n), (n)-[]->(l)和MATCH (m)-[]->(n)-[]->(l)是等价的“是openCypher的标准,在Nebula的实现中,两者是不等价的,如 @kyle 上文所说。

这个说的是 OpenCypher 标准。nebula 和 OpenCypher 标准在这里是不兼容的,对于 nebula 来说,MATCH (m)-->(n), (n)-->(l)和MATCH (m)-->(n)-->(l)是不等价的,MATCH (m)-->(n), (n)-->(l)和MATCH (m)-->(n) MATCH (n)-->(l)是等价的。

做了测试,MATCH (m)-[]->(n), (n)-[]->(l)和MATCH (m)-[]->(n) MATCH (n)-[]->(l)两个语句, 但是MATCH (m)-[]->(n), (n)-[]->(l)语句查询会快一些,MATCH (m)-[]->(n) MATCH (n)-[]->(l)格式语句就很慢,这是为什么呢

请按照这个帖子的要求把信息补齐;

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