Neo4j cypher以'总喜欢'和'喜欢'获得状态更新

时间:2014-09-23 16:07:44

标签: neo4j cypher

我使用以下查询来获取用户状态更新以及每个人收到的总数:

MATCH (n:user {username: "pewpewlasers"})-[:STATUSUPDATE|:NEXT*]->(o)
OPTIONAL MATCH (p:user)-[x:LIKED]->(o)
RETURN n, o, COUNT(p) AS totallikes
ORDER BY o.date DESC SKIP 0 LIMIT 10

这很有效,但现在我想获得有关特定用户是否喜欢这些状态更新的信息(以实现'不同'功能)。我尝试了以下内容,它给了我很大(错误)的数字,甚至是totallikes

MATCH (n:user {username: "pewpewlasers"})-[:STATUSUPDATE|:NEXT*]->(o)
OPTIONAL MATCH (p:user)-[:LIKED]->(o)
OPTIONAL MATCH (q:user {username: "anotherUser"})-[:LIKED]->(o)
RETURN n, o, COUNT(p) AS totallikes, COUNT(q) AS hasLiked
ORDER BY o.date DESC SKIP 0 LIMIT 10

编辑:图形如下所示(橙色节点 - >用户节点,灰色节点 - >状态更新节点): Orange represent user nodes, gray represents status update nodes

1 个答案:

答案 0 :(得分:1)

您的2 OPTIONAL MATCH条款基本相同,但第二条username条件除外。因此,从逻辑上讲,单个关系应该可以匹配两个子句。但是,according to the neo4j manual

  

在模式匹配时,Cypher确保不包括匹配位置   在单个中多次找到相同的图形关系   图案。

这可能导致匹配次数过低。

以下哪项更适合您?

[EDITED]

MATCH (n:user {username: "pewpewlasers"})-[:STATUSUPDATE|:NEXT*]->(o)
OPTIONAL MATCH (p:user)-[:LIKED]->(o)
WITH n, o, COLLECT(p) AS cp
RETURN n, o, length(cp) AS totallikes, length(filter(x IN cp WHERE x.username="anotherUser")) AS hasLiked
ORDER BY o.date DESC LIMIT 10