我是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输出。
先谢谢了, -johnt
答案 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