一位同事编码如下:
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
节点,你会匹配零个或多个连接Bar
和Baz
独立的节点。
编辑:
Stefan Armbruster在评论中指出,逗号也可以用于将子模式分配给各个标识符。如:
MATCH path1=(a)-[:REL1]->(b), path2=(b)<-[:REL2*..10]-(c)
谢谢斯蒂芬!
EDIT2:另请参阅下面的Mats的答案
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句