首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j中密码查询的误区

Neo4j中密码查询的误区
EN

Stack Overflow用户
提问于 2018-04-30 15:48:40
回答 1查看 71关注 0票数 0

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

这里的查询是:

代码语言:javascript
复制
MATCH (david { name: 'David' })--(otherPerson)-->()
WITH otherPerson, count(*) AS foaf
WHERE foaf > 1
RETURN otherPerson.name

结果是:

代码语言:javascript
复制
"Anders"

我不明白为什么这个结果是返回的。首先,

这是什么意思:

代码语言:javascript
复制
MATCH (david { name: 'David' })--(otherPerson)-->()
WITH otherPerson, count(*) AS foaf

具体地说,Bossman也(像Anders一样)有两个传出边,并连接到David

有人能给我解释一下这个查询的语义吗?

EN

回答 1

Stack Overflow用户

发布于 2018-04-30 17:00:06

正如您所注意到的,有两个节点看起来符合您所描述的模式。安德斯和博斯曼都和大卫有联系,并且都有两个外向的关系。

您遗漏的是,对于Cypher模式,relationships are unique for the pattern,它们不会被重用(这实际上非常有用,例如,当存在循环时使用可变长度关系时,它可以防止无限循环)。

所以在这个匹配模式中:

代码语言:javascript
复制
MATCH (david { name: 'David' })--(otherPerson)-->()

用于从David获取到Bossman的关系(:foaf关系)将不会在模式中重用(特别是块部分),因此您将只获得一个结果行,而对于Anders,您将获得2个结果行。然后,WHERE子句排除了Bossman的匹配,因为块的计数是1。

更改此查询以获得所需结果的一种方法是在WHERE子句中而不是在匹配模式中检查关系的程度。这也更有效,因为检查关系度不需要执行扩展操作,关系度数据在节点本身。

代码语言:javascript
复制
MATCH ({ name: 'David' })--(otherPerson)
WHERE size((otherPerson)-->()) > 1
RETURN otherPerson.name

(此外,在匹配中使用节点标签也是一个好主意,至少对于您想要的起始节点是这样。索引(如果存在)将仅在匹配中显式使用label和indexed属性时使用,当您省略标签或使用不属于索引的标签时,索引将不起作用)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50096110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档