我正在关注这篇文章,以设置一个系统,用户可以follow
彼此friends
成为friend
:http://neo4j.com/docs/stable/cypher-cookbook-newsfeed.html
用户(A)可以follow
另一个用户(B),因此A自动跟随B.用户A也可以friends only
B而不添加B作为朋友。因此,应该对饲料结果进行区分。如果A和B未被确认为朋友,则A应该从B获得仅标记为公共的状态更新。如果A是B的确认朋友,A应该从B获得所有状态更新。即使是B的朋友,也可以取消关注他/她的订阅源。 (典型的Facebook模型?)。所以基本上我需要检查谁跟随并抓住他们的更新。但是,在执行此操作时,我还需要检查A是否可以访问这些状态更新。
有一个简单的密码来实现这个吗?或者你有更好的模型吗?假设所有更新都是公开的,则查询应该有效。如果还有MATCH (me { name: 'Joe' })-[rels:FOLLOWS*0..1]-(anotherUser)
WITH anotherUser
MATCH (anotherUser)-[:STATUS]-(latestupdate)-[:NEXT*0..1]-(statusupdates)
RETURN anotherUser.name AS name, statusupdates.date AS date, statusupdates.text AS text
ORDER BY statusupdates.date DESC LIMIT 3
个帖子,您会如何为其添加隐私设置维度?
{{1}}
答案 0 :(得分:2)
是的,您可以实现所有这些要求,在我看来,可以归结为一些精心挑选的WHERE
条款。
这是您的基本查询,并进行了修改:
MATCH (me { name: 'Joe' })-[rels:FOLLOWS*0..1]-(anotherUser)
WITH anotherUser
MATCH (anotherUser)-[:STATUS]-(latestupdate)-[:NEXT*0..1]-(statusupdates)
WHERE statusupdates.visibility='PUBLIC'
RETURN anotherUser.name AS name, statusupdates.date AS date, statusupdates.text AS text
ORDER BY statusupdates.date DESC LIMIT 3
在这里,我刚刚添加了一个WHERE
来检查visibility=PUBLIC
(我编写的,因为示例应用程序没有指定这些内容;这必须是您模型的一部分不管怎样。)
您可以考虑将该查询与UNION
一起执行到另一个查询,该查询仅用于从朋友那里获取这些状态更新。 (如果它是朋友,那么可见性是什么并不重要)
MATCH (me { name: 'Joe' })-[:FRIEND]-(friend)-[:STATUS|NEXT*1..]->(statusupdates)
RETURN statusupdates
ORDER BY statusupdates.date DESC LIMIT 3;
您可以将两个查询与第二个模式上的UNION
子句结合使用,而不是使用OPTIONAL MATCH
。但无论哪种方式,基本上,您的查询都需要获取所有状态更新的列表,这些状态更新是您关注的人员,其帖子是公开的,朋友帖子,或两者兼而有之。因此,从概念上讲,很容易将其分解为两个独立的案例,然后将UNION
两个结果集合在一起。