【问题标题】:Neo4J Cypher: Match ()-[]-() Return count(*) return double of the number of the relationships when node labels are not assignedNeo4J Cypher:Match ()-[]-() 返回 count(*) 返回未分配节点标签时关系数的两倍
【发布时间】:2021-04-14 02:20:33
【问题描述】:

在我的数据库中,AB 之间存在一种关系,名为awithb。 对于密码

MATCH ()-[:awithb]-() return count(*)

它返回 140。

但是,如果我们给出节点的标签,

MATCH (:A)-[:awithb]-(:B) return count(*)

它返回 70。

为什么这两个密码查询返回不同的结果?

【问题讨论】:

  • 没有标签,是不是任何一个节点都可以匹配关系的任何一方?您没有指定任何方向性,也没有指定每边的节点类型......

标签: neo4j cypher


【解决方案1】:

Cypher 是关于返回匹配模式的路径。

路径是节点和关系的有序序列,如果没有指定方向,也没有指定标签,那么这样的模式将使用相同的关系和相同的两个节点生成两条路径,只是路径中节点的顺序不同,你往另一个方向遍历关系。

如果给图案添加方向,那么只有一条路径是可能的:

MATCH ()-[:awithb]->() 
RETURN count(*)

【讨论】:

  • 谢谢!这是否意味着MATCH (:A)-[:awithb]-(:B) return count(*)MATCH (:A)-[:awithb]->(:B) return count(*) 返回相同的结果?
  • 不一定。如果创建了指向 :A 节点的关系,则计数将不匹配。 Neo4j 中的所有关系都是定向的。如果方向对你很重要,那么你可以将它包含在你的 MATCH 模式中,否则省略方向将匹配到任一方向的 rels。
【解决方案2】:

当您没有在查询中添加标签时,这意味着您想要任何具有这种关系的节点。

 () - [: awithb] - ()  where () is any nodes 

当您放置带有相应标签的非定向路径时;这意味着关系可以是从 A 到 B 或 B 到 A。

 (:A) - [: awithb] - (:B) equals  A->B  OR  A<-B

因此,在您的第一个查询中,您获得了 2 倍的计数,因为您获得了从 A 到 B 和 B 到 A 的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多