请看下面的示例图(来自Neo4j参考):

这里的查询是:
MATCH (david { name: 'David' })--(otherPerson)-->()
WITH otherPerson, count(*) AS foaf
WHERE foaf > 1
RETURN otherPerson.name结果是:
"Anders"我不明白为什么这个结果是返回的。首先,
这是什么意思:
MATCH (david { name: 'David' })--(otherPerson)-->()
WITH otherPerson, count(*) AS foaf具体地说,Bossman也(像Anders一样)有两个传出边,并连接到David。
有人能给我解释一下这个查询的语义吗?
发布于 2018-04-30 17:00:06
正如您所注意到的,有两个节点看起来符合您所描述的模式。安德斯和博斯曼都和大卫有联系,并且都有两个外向的关系。
您遗漏的是,对于Cypher模式,relationships are unique for the pattern,它们不会被重用(这实际上非常有用,例如,当存在循环时使用可变长度关系时,它可以防止无限循环)。
所以在这个匹配模式中:
MATCH (david { name: 'David' })--(otherPerson)-->()用于从David获取到Bossman的关系(:foaf关系)将不会在模式中重用(特别是块部分),因此您将只获得一个结果行,而对于Anders,您将获得2个结果行。然后,WHERE子句排除了Bossman的匹配,因为块的计数是1。
更改此查询以获得所需结果的一种方法是在WHERE子句中而不是在匹配模式中检查关系的程度。这也更有效,因为检查关系度不需要执行扩展操作,关系度数据在节点本身。
MATCH ({ name: 'David' })--(otherPerson)
WHERE size((otherPerson)-->()) > 1
RETURN otherPerson.name(此外,在匹配中使用节点标签也是一个好主意,至少对于您想要的起始节点是这样。索引(如果存在)将仅在匹配中显式使用label和indexed属性时使用,当您省略标签或使用不属于索引的标签时,索引将不起作用)。
https://stackoverflow.com/questions/50096110
复制相似问题