我使用以下查询来获取用户状态更新以及每个人收到的总数:
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
编辑:图形如下所示(橙色节点 - >用户节点,灰色节点 - >状态更新节点):
答案 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