我正在将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
我尝试了上面的查询,但是没有返回任何记录。
任何帮助将不胜感激。
谢谢。
答案 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