在neo4j中获取关注者的帖子以及自己的帖子

时间:2018-11-20 13:48:44

标签: neo4j cypher

我正在将neo4j用于我的社交项目,用户可以在其中创建帖子,并且可以互相关注。我必须同时获取我的关注者的帖子和我自己的帖子。为了获取我的关注者的帖子,我使用以下查询:

MATCH (me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS|CREATED]->(f:User)-(p:Posts) RETURN p LIMIT 25 

以上查询返回了我的关注者的帖子,但我无法获得自己的帖子。 有人可以告诉我我想得到自己的帖子以及关注者的帖子的缺失

MATCH (me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS]->(f:User)-[fc:CREATED|LIKED]-(p:Posts)<-[:CREATED]-(n) RETURN p LIMIT 25

我尝试了上面的查询,但是没有返回任何记录。

任何帮助将不胜感激。

谢谢。

3 个答案:

答案 0 :(得分:1)

最简单的方法是使用可选的可变长度关系,这可以通过使用0的下限实现:

MATCH (me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS*0..1]->(f:User)-[:CREATED]-(p:Posts) 
RETURN p LIMIT 25 

[:FOLLOWSS*0..1]是关键,因为这意味着它将包括与另一个:User节点具有:FOLLOWSS关系的模式,以及不涉及任何关系的模式(意味着您的me用户与f:用户节点是同一节点)。

答案 1 :(得分:1)

@InverseFalcon的答案为基础,这是一个返回嵌入式集合中数据的查询:

MATCH (n:User {name:"ikwattro"})<-[:FOLLOWS*0..1]-(x)-[:CREATED]->(p:Post)
RETURN n, 
[x IN collect(p) WHERE (n)-[:CREATED]->(x) | x.title] AS userPosts, 
[x IN collect(p) WHERE NOT (n)-[:CREATED]->(x) | x.title] AS followersPosts


╒═══════════════════╤═══════════╤═════════════════════════╕
│"n"                │"userPosts"│"followersPosts"         │
╞═══════════════════╪═══════════╪═════════════════════════╡
│{"name":"ikwattro"}│["Post1"]  │["Post4","Post3","Post2"]│
└───────────────────┴───────────┴─────────────────────────┘

答案 2 :(得分:0)

MATCH (me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS]->(f:User)-[fc:CREATED]-(p:Posts)<-[:CREATED]-(n) RETURN p LIMIT 25

返回您和其他人创建的每条帖子。您需要将属于不同项目的变量分开

MATCH (mine:Posts)<-[:CREATED]-(me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS]->(f:User)-[fc:CREATED]-(p:Posts) RETURN mine, p LIMIT 25

但是,这以多种冗余方式(每个帖子都针对他们的每个帖子)返回信息,因此,我建议像这样用COLLECT压缩它。

MATCH (mine:Posts)<-[:CREATED]-(me:User {UserId: '39434e4d-d501-4fba-8aae-16cf652deb3e'})-[:FOLLOWSS]->(f:User)-[fc:CREATED]-(p:Posts)
WITH mine, p LIMIT 25
WITH COLLECT(mine)+COLLECT(p) as posts
UNWIND posts as p
RETURN p LIMIT 25