仅在预期列更改时从Cypher返回的不同行

时间:2015-11-18 21:24:11

标签: neo4j cypher

我是Neo4J,Cypher和StackOverflow的新手,所以当我讨厌协议时请告诉我。

我有一个测试Neo4J数据库,其中有超过7k个节点代表电影,并且每个电影都有相当多的关系。我注意到当我运行按计数排序的查询时,根据我返回的节点的参数,我得到不同的行。一个具体的例子是当我尝试列出关系最多的电影时。

此CQL查询

MATCH (m:Movie)-[r]-() 
RETURN m.title, count(r) AS rel_count ORDER BY rel_count DESC LIMIT 10

返回

m.title                 rel_count
The Three Musketeers    184
Scary Movie 3           128
Watchmen                114
Hero                    113
Horrible Bosses 2       113
The Longest Yard        112
Carrie                  111
The Butterfly Effect    111
Aliens                  111
Dick Tracy              110

而CQL查询

MATCH (m:Movie)-[r]-() 
RETURN m.title, m.tmsId, count(r) AS rel_count ORDER BY rel_count DESC LIMIT 10

返回

m.title                       m.tmsId           rel_count
Forrest Gump                  MV000398520000    106
The Karate Kid                MV000125280000    79
Evolution                     MV001067180000    76
Original Sin                  MV000790300000    74
Kill Bill: Vol. 2             MV001405480000    74
American Beauty               MV000773810000    74
O Brother, Where Art Thou?    MV000914040000    73
The Godfather                 MV000120060000    72
Sin City                      MV001558150000    71
The Karate Kid Part II        MV000205920000    71

我的假设是(是)MATCH语句收集节点m和关系r的数据,而RETURN语句只是将输出过滤到特定参数。因此,我希望每次调用返回相同的列表。有人认为我的Cypher或期望有问题吗?

即使我有一个特定的问题,我也想知道为什么会出现问题,以便深入了解Cypher的语法和执行。如果有帮助,我已经添加了PROFILE输出。

Profile Chart 1

Profile Chart 2

先谢谢了, -johnt

2 个答案:

答案 0 :(得分:2)

我认为你是对的。在Cypher中,// The Service [ServiceContract] public interface IMath { [OperationContract] string Add(Object param); } RETURN语句只适用于它们给出的表格数据。如果您指定聚合函数,例如WITH / count / etc ...那么它将根据您指定的其他非聚合列自动分组。

作为调试步骤,如果你试试这个怎么办?

sum

答案 1 :(得分:1)

我认为我们找到了答案。似乎COUNT(r)将根据其他返回值计算所有r。因此,当我要求非唯一参数时,我得到具有该参数的所有节点的r的总和。在这个特定的情况下,有4部电影的标题为“三个火枪手”,他们的r的所有4个总和为184.添加唯一参数tmsId返回我正在寻找的实际结果。

我们发现我们可以使用以下单独计算非唯一参数:

MATCH (m:Movie)-[r]-()
WITH DISTINCT m, COUNT(r) AS rel_count
RETURN m.title, rel_count
ORDER BY rel_count DESC LIMIT 12