2014-09-23 71 views
0

我使用下面的查询,以获得用户的状态更新,并总喜欢每个已收到:Neo4j的暗号得到与“总喜欢”状态更新“就喜欢”

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

您的2 OPTIONAL MATCH条款基本相同,除了第二条中的username条款。因此,从逻辑上讲,单一关系应该可以匹配两个条款。然而,according to the neo4j manual

虽然模式匹配,Cypher支架确保为不包括其中 同一图表关系被发现多次在单个 图案匹配。

这可能导致匹配数量太低。

以下是否对您更好?

将帖子

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 
+0

hasLiked实际输出相同的数字,无论p.username' – pewpewlasers 2014-09-24 06:57:05

+0

你能澄清的'totallikes你所说的“不管p.username'的'”是什么意思?另外,实际上是否有超过1个''用户'''相同'o''? – cybersam 2014-09-24 16:32:35

+0

嗨,是的,可能会有更多的用户喜欢相同的“o”。 'o'是一个状态更新节点,可以有很多喜欢的。即使当'anotherUser'改变时,totallikes和hasLiked也会给出相同的值。 – pewpewlasers 2014-09-24 16:37:11