Neo4J Cypher:Match ()-[]-() Return count(*) 返回未分配节点标签时关系数的两倍

问题描述

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

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

它返回 140。

然而,如果我们给出节点的标签

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

它返回 70。

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

解决方法

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

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

如果向模式添加方向,则只有一条路径是可能的:

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

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

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

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

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

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