Neo4j 与Cypher的可选关系

Neo4j 与Cypher的可选关系,neo4j,cypher,union,Neo4j,Cypher,Union,有一个墙贴类型的场景,我想把你和你的朋友的帖子都写出来,并按时间顺序对它们进行排序 有没有办法不用工会就可以做到这一点 比如,我几乎想要这样的东西(请原谅伪查询): 我只是想知道如何在一个查询中获得你和你朋友的帖子 现在我有(0是当前登录帐户的id): 虽然这可以获得我想要的所有帖子(根据我的测试),但order by似乎只根据单个结果集而不是整个联合结果集进行组织 基本上,这不应该是我的json结果: [{"id":4,"date_created":1438621410,"content":"

有一个墙贴类型的场景,我想把你和你的朋友的帖子都写出来,并按时间顺序对它们进行排序

有没有办法不用工会就可以做到这一点

比如,我几乎想要这样的东西(请原谅伪查询):

我只是想知道如何在一个查询中获得你和你朋友的帖子

现在我有(0是当前登录帐户的id):

虽然这可以获得我想要的所有帖子(根据我的测试),但order by似乎只根据单个结果集而不是整个联合结果集进行组织

基本上,这不应该是我的json结果:

[{"id":4,"date_created":1438621410,"content":"This is a test post!","account":{"id":10,"username":"test","email":"test@test.com"}},{"id":5,"date_created":1438621422,"content":"about to try this thing","account":{"id":0,"username":"test2","email":"test2@gmail.com"}}]
应该是

[{"id":5,"date_created":1438621422,"content":"about to try this thing","account":{"id":0,"username":"test2","email":"test2@gmail.com"}}, {"id":4,"date_created":1438621410,"content":"This is a test post!","account":{"id":10,"username":"test","email":"test@test.com"}}]

有什么建议吗?

我认为您可以通过以下两种方式之一实现:

MATCH (a:Account)-[:FRIEND]->(friend:Account)-[:POST*0..1]->(post:Post)
WHERE id(a) = 0
RETURN friend, post
ORDER BY post.date_created DESC
LIMIT 10
我认为,如果是属于第一个帐户的帖子,那么该好友将
NULL
。这也应该起作用:

MATCH (a:Account), (post:Post)
WHERE id(a) = 0
OPTIONAL MATCH (friend:Account)
WHERE
  a-[:POST]->post OR
  a-[:FRIEND]->friend-[:POST]->post
RETURN friend, post
ORDER BY post.date_created DESC
LIMIT 10

这两种方法都能满足你的需要吗?

布莱恩·安德伍德的回答恰好引导我朝着正确的方向前进,但最终尝试的解决方案并没有产生完全正确的结果

然而,经过一番修补之后,我终于无意中发现了这个成功的问题:

MATCH (a:Account)-[:FRIEND*0..1]->(friend:Account)-[:POST]->(post:Post)
WHERE id(a) = 0
RETURN friend,post
ORDER BY post.date_created DESC
LIMIT 10
希望这能帮助其他使用Neo的人获得Facebook“墙”式更新,包括你自己的帖子


欢迎对此查询进行任何改进,但是,我不知道它到底有多高效,只知道它确实进行了正确排序,并且据我所知,到目前为止受到了相应的限制

我感谢您的回答,我将尽可能早地尝试这些第二项非常接近,但它似乎复制了其中一个帖子,并将其归属于另一个账户。。这将总共返回三个post结果,而不仅仅是数据库中的两个lolAh,对吗。您可以添加一个
DISTINCT
(如
返回DISTINCT friend,post
),但执行
返回post,collect(friend)
可能会很有用,它会为您提供共享该帖子的所有朋友的集合。如果有帮助的话,你甚至可以做
收集(不同的朋友)
。这太棒了,解决了我的问题。唯一可悲的是neo4j浏览器说:“此功能已被弃用,并将在未来版本中删除。”@GreenAsJade很高兴它对您有所帮助,但具体是哪项功能现在已被弃用?老实说,我并不真正理解错误消息。它表示“不赞成将关系绑定到可变长度模式中的列表。(不赞成将可变长度关系模式绑定到变量('c'),并且在将来的版本中将不受支持。建议的方法是将整个路径绑定到变量,然后提取关系:MATCH p=(…)-[…]-(…)带*,关系(p)为c)”。我想知道你是否愿意看看
MATCH (a:Account), (post:Post)
WHERE id(a) = 0
OPTIONAL MATCH (friend:Account)
WHERE
  a-[:POST]->post OR
  a-[:FRIEND]->friend-[:POST]->post
RETURN friend, post
ORDER BY post.date_created DESC
LIMIT 10
MATCH (a:Account)-[:FRIEND*0..1]->(friend:Account)-[:POST]->(post:Post)
WHERE id(a) = 0
RETURN friend,post
ORDER BY post.date_created DESC
LIMIT 10