当我尝试执行此查询时
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_comments
和device
中返回相同的数字,即总评论数。
答案 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
结果的每个组合生成一行。如果您刚刚返回ro
和com
值,则会更清楚。有关示例,请参阅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次单独的查询。这也可能使您的代码更容易理解。