Cypher查询中的逗号有什么作用?

托尼·恩尼斯

一位同事编码如下:

match (a)-[r]->(b), (c) set c.x=y

逗号是做什么用的?只是MATCH的简写吗?

布莱恩·安德伍德

由于Cypher的ASCII艺术格式语法只能让您连续指定一个线性连接链,因此逗号(至少部分地)位于其中,以允许您指定可能会分支的内容。例如:

MATCH (a)-->(b)<--(c), (b)-->(d)

表示三个都连接到的节点b(两个传入关系和一个传出关系。

如果您的匹配太长,逗号对于分隔行也很有用,例如:

MATCH
  (a)-->(b)<--(c),
  (c)-->(d)

显然,这不是很长的线,但是它等效于:

MATCH
  (a)-->(b)<--(c)-->(d)

但通常,任何MATCH语句都指定了要搜索的模式。该部分的所有部分都MATCH构成了模式。在您的情况下,您实际上正在寻找两个未连接的模式((a)-[r]->(b)(c)),因此Neo4j将找到这两种模式的每个实例的每种组合,这可能会非常昂贵。在Neo4j 2.3中,您可能还会收到关于此查询的警告,这将使您得到笛卡尔积。

但是,如果指定多个匹配项,则要求搜索不同的模式。因此,如果您这样做:

MATCH (a)-[r]->(b)
MATCH (c)

从概念上讲,我认为这有点不同,但是结果是相同的。我知道与绝对不同OPTIONAL MATCH如果您这样做:

MATCH (a:Foo)
OPTIONAL MATCH (a)-->(b:Bar), (a)-->(c:Baz)

您只会找到其中一个Foo节点未连接或同时连接到Bar和的实例Baz而如果您这样做:

MATCH (a:Foo)
OPTIONAL MATCH (a)-->(b:Bar)
OPTIONAL MATCH (a)-->(c:Baz)

你会发现每一个Foo节点,你会匹配零个或多个连接BarBaz独立的节点。

编辑:

Stefan Armbruster在评论中指出,逗号也可以用于将子模式分配给各个标识符。如:

MATCH path1=(a)-[:REL1]->(b), path2=(b)<-[:REL2*..10]-(c)

谢谢斯蒂芬!

EDIT2:另请参阅下面的Mats的答案

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章