Neo4j用户状态隐私设置模型

时间:2014-10-23 12:40:51

标签: neo4j cypher

我正在关注这篇文章,以设置一个系统,用户可以follow彼此friends成为friendhttp://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}}

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两个结果集合在一起。