我试图准确理解Cypher如何返回无向路径。这里有两个查询及其结果(除了一个使用无向模式外,它们是相同的):
MATCH path = (a)-[]->(b) RETURN count(path), count(distinct(path))
计数(路径):1236951
计数(不同(路径)):1236951
MATCH path = (a)-[]-(b) RETURN count(path), count(distinct(path))
count(路径):2473901
计数(不同(路径)):2473901
我有两个具体的问题。
a。)为什么计数(路径)在无向情况下并不是它在定向情况下的两倍(它被1关闭)?
b。)在无向情况下,为什么 count(distinct(path))与 count(path)相同?我希望Cypher能够将每个路径匹配两次,每个方向一次,然后不计算 count(distinct(path))中的重复项。是不是将两个方向统计为相同的路径?
答案 0 :(得分:1)
(a)我没有回答为什么第二个查询的路径计数不是第一个查询的路径计数的两倍(除了可能的错误或数据损坏)。但是,您应该能够使用下面的查询获得没有预期计数的关系。这可能会提供有用的线索。
MATCH path = (a)-[r]-(b)
WITH r, COUNT(*) AS num
WHERE num <> 2
RETURN r;
(b)每个“路径”由按关系分隔的节点的有序序列组成。当您以相反的方向遍历路径时,结果是2个不同的有序序列,这些序列不相等。如果您计算了不同的关系,如下所示,您将获得nRels
的{{1}}值的一半(或接近它,考虑到(a)):
nPaths
答案 1 :(得分:0)
这是一个猜测,我本人对neo4j还是陌生的,但是关于为什么无向路径不是有向路径的两倍,我怀疑它与图中关系的方向有关。
您要查询任何方向的路径,但是如果图形是有方向的,则关系仅沿该方向存在,因此查询相反方向的关系将返回null。
也许计数结果相同的原因是图形中定义的每个关系都有一个方向