具有可选关系的Cypher查询

4

我有一个墙贴类型的场景,希望能够展示你和你的朋友发布的帖子,并按时间顺序排序,同时限制数量。

有没有一种不使用union的方法来实现这个功能呢?

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

match (a:Account)-([:FRIEND]->(friend:Account)-)?[:POST]->(post:Post)
where id(a) = 0
return friend,post

我是一名有用的助手,可以为您翻译文本。

我只是想知道如何在一个查询中获取您的帖子以及您朋友的帖子

现在我有以下内容(0是当前登录账户的id):

match (a:Account)-[:FRIEND]->(friend:Account)-[:POST]->(post:Post)
where id(a) = 0
return friend,post
union
match (friend:Account)-[:POST]->(post:Post)
where id(friend) = 0
return friend,post
order by post.date_created DESC
limit 10

而且,虽然这种方法可以获取我想要的所有帖子(根据我的测试),但 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"}}]

有什么指针吗?

2个回答

6
Brian Underwood的答案指引我走向了正确的方向,但最终尝试的解决方案并没有产生完全正确的结果。 然而,在一些尝试之后,我成功地找到了这个优秀的查询:
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“墙”式更新(包括自己的帖子)的人有所帮助。

欢迎提出任何改进此查询的意见,但我不知道它的效率到底如何,只知道它确实可以正确排序,并且据我目前所知限制得当。


1
这太棒了,解决了我的问题。唯一令人遗憾的是,neo4j浏览器显示:“此功能已弃用,并将在未来版本中删除。” - GreenAsJade
@GreenAsJade,很高兴能够帮到您,但现在具体哪个功能已被弃用? - RedactedProfile
说实话,我其实不理解这个错误信息。它说“将关系绑定到变长模式列表中的变量已过时。(将变长关系模式绑定到变量 ('c') 将会在未来版本中不被支持。建议的方式是将整个路径绑定到变量,然后提取关系:MATCH p = (...)-[...]-(...) WITH *, relationships(p) AS c)”。我想知道你是否可以好心看一下 https://stackoverflow.com/q/55964038/554807 - GreenAsJade

1

我认为你可以用以下两种方式之一来实现这一点:

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

你们两个中的任何一个都满足你的要求吗?


感谢您的回复,我会尽快尝试这些方法。 - RedactedProfile
第二项非常接近,但似乎复制了其中一篇帖子并将其归属于不同的帐户... 这将返回三个帖子结果,而不仅仅是数据库中的两个lol。 - RedactedProfile
啊,好的。你可以添加一个DISTINCT(例如RETURN DISTINCT friend, post),但是使用RETURN post, collect(friend)可能更有用,它会给你一个包含所有分享该帖子的朋友的集合。如果有帮助的话,甚至可以使用collect(DISTINCT friend) - Brian Underwood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接