Neo4j-多次匹配查询中的错误计数

时间:2015-12-09 10:13:19

标签: neo4j cypher

当我尝试执行此查询时

match(u:User)-[ro:OWNS]->(p:PushDevice) where p.type='gcm' 
match(com:Comment)
return count(com) as total_comments,count(ro) as device

这会在both total_commentsdevice中返回相同的数字,即总评论数。

2 个答案:

答案 0 :(得分:0)

我觉得你的查询应该有效,但我更有信心这会起作用:

MATCH (u:User)-[ro:OWNS]->(p:PushDevice) WHERE p.type='gcm' 
WITH count(ro) AS device
MATCH (com:Comment)
RETURN count(com) as total_comments, device

答案 1 :(得分:0)

您的查询正在为MATCH结果的每个组合生成一行。如果您刚刚返回rocom值,则会更清楚。有关示例,请参阅this console。该控制台有2条注释和一个OWNS关系,但结果显示2行(两行具有相同的OWNS关系)。因此,您的查询基本上是计算行数 - 而不是您期望的行。

以下是一个可以按预期工作的查询示例:

MATCH (u:User)-[ro:OWNS]->(p:PushDevice {type:'gcm'})
WITH COUNT(ro) AS device
MATCH (com:Comment)
RETURN count(com) AS total_comments, device;

[EDITED]

这在逻辑上也有效,但性能较差(因为它需要笛卡尔积,然后过滤掉重复数据):

MATCH (u:User)-[ro:OWNS]->(p:PushDevice { type: 'gcm' })
MATCH (com:Comment)
RETURN COUNT(DISTINCT com), COUNT(DISTINCT ro);

观察

neo4j的强大功能来自于对关系的有效处理。因此,最有效的查询往往是连接的子图(所有节点都通过关系连接)。

由于您的查询不适用于单个连接的子图,因此获得所需的答案自然会更复杂并且效率低下。

如果您确定建议的查询太慢,则可以尝试进行2次单独的查询。这也可能使您的代码更容易理解。