到目前为止,我已经尝试过这个查询,但是它对所有节点的扫描都非常慢。它能完成我想要的东西
match (u:Users{user_id:140}),(p:Posts),(pu:Users{user_id:p.created_by}) optional match (p)-[:POST_MEDIA]->(f) optional match (p)-[:COMMENT]->(c)<-[:COMMENT]-(u3)
where
(p)-[:CREATED_BY]->(u) or (p:PUBLIC and (u)-[:FOLLOW]->(pu) )or (p:PRIVATE and (p)-[:SHARED_WITH]->(u))
return {user_id:pu.user_id,firstname:pu.firstname,lastname:pu.lastname,profile_photo:pu.profile_photo,username:pu.username} as pu,p,collect({user_id:u3.user_id,profile_photo:u3.profile_photo,text:c.text}) as comment,collect(f) as file order by p.post_id DESC limit 25在这个查询之前,我尝试了这个查询,它非常快,但不能检索完整的新闻提要,它只能从下面检索文章,只能检索用户自己的文章,也不能检索其他用户的私人帖子,这些文章可以与检索新闻提要的用户共享。
match (u:Users{user_id:140})-[:FOLLOW]->(pu)<-[:CREATED_BY]-(p:Posts)
optional match (p)-[:POST_MEDIA]->(f)
optional match (p)-[:COMMENT]->(c)<-[:COMMENT]-(u3) where p:PUBLIC
return
{user_id:pu.user_id,firstname:pu.firstname,
lastname:pu.lastname,profile_photo:pu.profile_photo,username:pu.username} as pu,p,
collect({user_id:u3.user_id,profile_photo:u3.profile_photo,text:c.text}) as comment,
collect(f) as file order by p.post_id DESC limit 25注:-在where子句中没有修改如下:-
where p:PUBLIC or (p)-[:SHARED_WITH]->(u)
// but the only problem is that how i should include posts of users himself which is retrieving news feed .发布于 2015-10-15 07:17:20
首先,您应该确保在user_id属性上为User标签有一个索引。如下所示:
CREATE INDEX ON :Users(user_id)(顺便提一句,使用单数名词作为标签是常见的做法)
但是,您还应该使用Neo4j关系,而不是匹配post的created_by列。这将允许Neo4j遍历关系(非常快),而不是检查索引(我认为索引仍然很快,但不太理想)。
但是,我认为,您也有一个问题,就是WHERE中的变量应该放在WHERE子句中,直接放在所讨论的(OPTIONAL) MATCH之后。例如,您的(p)-[:CREATED_BY]->(u)条件是指在第一个MATCH中定义的变量,但是它们低于OPTIONAL MATCH,而WHERE实际上将应用于OPTIONAL MATCH。您应该能够通过在两者之间添加一个WITH *来修复这个问题,尽管您希望对性能进行基准测试。
下面是带有一些这些更改的查询(并不是说您需要首先单独设置CREATED关系):
MATCH
(u:Users {user_id:140}),
(p:Posts)<-[:CREATED]-(pu:Users)
WHERE
(p)-[:CREATED_BY]->(u) OR
(p:PUBLIC AND (u)-[:FOLLOW]->(pu)) OR
(p:PRIVATE AND (p)-[:SHARED_WITH]->(u))
OPTIONAL MATCH (p)-[:POST_MEDIA]->(f)
OPTIONAL MATCH (p)-[:COMMENT]->(c)<-[:COMMENT]-(u3)
RETURN
{user_id:pu.user_id,
firstname:pu.firstname,
lastname:pu.lastname,
profile_photo:pu.profile_photo,
username:pu.username} as pu,
p,
collect({user_id:u3.user_id,
profile_photo:u3.profile_photo,
text:c.text}) as comment,
collect(f) as file
ORDER BY p.post_id DESC LIMIT 25编辑:实际上,看看这个,WHERE中的所有变量都是在第一个MATCH中定义的,所以您应该能够将它移到上面。编辑查询以反映这一点。
EDIT2:您可以尝试使用OPTIONAL MATCH,我认为这会让Neo4j首先进行遍历。使用WHERE,我认为它得到了所有可能的结果,然后进行过滤,这样就不那么有效了。
PROFILE
MATCH
(u:Users {user_id:140}),
(p:Posts)<-[:CREATED]-(pu:Users)
OPTIONAL MATCH (p)-[created_by:CREATED_BY]->(u), (u)-[follow:FOLLOW]->(pu), (p)-[shared_with:SHARED_WITH]->(u)
WHERE created_by IS NOT NULL OR (p:PUBLIC AND follow IS NOT NULL) OR (p:PRIVATE AND shared_with IS NOT NULL)
OPTIONAL MATCH (p)-[:POST_MEDIA]->(f)
OPTIONAL MATCH (p)-[:COMMENT]->(c)<-[:COMMENT]-(u3)
RETURN
{user_id:pu.user_id,
firstname:pu.firstname,
lastname:pu.lastname,
profile_photo:pu.profile_photo,
username:pu.username} as pu,
p,
collect({user_id:u3.user_id,
profile_photo:u3.profile_photo,
text:c.text}) as comment,
collect(f) as file
ORDER BY p.post_id DESC LIMIT 25您还可以尝试使用索引属性来指示private,而不是使用标签。
发布于 2015-10-15 07:15:31
您应该使用Match(c) match (p:Posts),我的意思是使用多个匹配。此外,您还应该对用户user_id使用约束。
不应该在where子句中使用()-[]->()。也许你可以选择合适的匹配。
您还应该分析您的查询,以查看它的行为。这样你就可以减少你的数据库点击量。
https://stackoverflow.com/questions/33141786
复制相似问题