Neo4j Cypher查询获取用户Feed

时间:2013-01-22 13:53:28

标签: feed neo4j social cypher

假设我的项目是Facebook。我想显示一个Feed,其中包含我的状态更新和朋友的状态更新。

以下是关系;

  • 用户知道用户
  • 用户UPDATES_STATUS状态

这是我获取朋友状态更新的方式;

START me = node(1) MATCH me-[:KNOWS]-()-[:UPDATES_STATUS]->friendsStatusUpdates RETURN friendsStatusUpdates

这就是我如何获得自己的状态更新;

START me = node(1) MATCH me-[:UPDATES_STATUS]->myStatusUpdates RETURN myStatusUpdates

两个查询都运行正常,但我需要一个结合这两个查询的查询。

3 个答案:

答案 0 :(得分:2)

以下是我从Google Groups获得的答案;

START me = node(1) MATCH me-[:KNOWS*0..1]-()-[:UPDATES_STATUS]->statusUpdate RETURN DISTINCT statusUpdate

我唯一需要做的就是在关系中添加*0..1深度指示符,以获得0或1级深度结果。

编辑:我必须添加DISTINCT因为没有它,查询包括0级节点2次,这会导致重复。


使用WITH语句返回相同结果的替代查询;

START me = node(1) 
MATCH me-[:KNOWS*0..1]-friend
WITH DISTINCT friend
MATCH friend-[:UPDATES_STATUS]->statusUpdate 
RETURN DISTINCT statusUpdate

答案 1 :(得分:0)

创建用户节点与其自身之间的关系比查询是START me = node(1)MATCH me - [:KNOWS | HIMSELF] - () - [:UPDATES_STATUS] - > friendsStatusUpdates RETURN friendsStatusUpdates

答案 2 :(得分:0)

http://docs.neo4j.org/chunked/milestone/introduction-pattern.html

START me = node(1) 
MATCH me-[:UPDATES_STATUS*1..2|KNOWS]-myStatusUpdates 
RETURN myStatusUpdates

如果*1..2不能使用|命令,请执行以下操作:

START me = node(1) 
MATCH friendsStatusUpdates2-[?:UPDATES_STATUS]-me-[:KNOWS]-()-[:UPDATES_STATUS]->friendsStatusUpdates 
RETURN distinct myStatusUpdates,friendsStatusUpdates2

只需使用某些聚合函数编辑RETURN语句,这样每行就会获得一个状态