如何执行多个Match语句,或者使用相同的keyname连接两个查询

时间:2016-03-15 08:58:34

标签: neo4j cypher

用户可以是其他用户的朋友。用户还可以关注用户个人资料页面。我想查询所有朋友和follow_users(拥有所关注个人资料页面的用户)

返回follow_users

match (user:User {id: SOME_ID})
-[:FOLLOWED_PAGE]->(Page)<-[:PROFILE_PAGE]-(followed_user:User)
return followed_user

这回归朋友

match (u:User {uuid: SOME_ID})-[:CONNECTED_USER]->(friend:User)
return friend

这将结合两者

match (user:User {id: SOME_ID})
-[:FOLLOWED_PAGE]->(Page)<-[:PROFILE_PAGE]-(followed_user:User)
return followed_user
UNION ALL match (u:User {uuid: SOME_ID})-[:CONNECTED_USER]->(friend:User)
return friend

问题是,我想继续查询。联盟将返回。

这是我想要做的,但它不起作用(第二场比赛覆盖了第一场比赛)

match (user:User {id: SOME_ID})
-[:FOLLOWED_PAGE]->(Page)<-[:PROFILE_PAGE]-(friend:User)
match (user)-[:CONNECTED_USER]->(friend:User)
WHERE (page:Page)<-[:COMMENTED_ON]-(friend)
return page

我该怎么办?

编辑:Stefan Armbruster

初始设置查询:

create (PP:Page {title: "Jim"}), (Jim:User {name: "Jim"}), (You:User {name: "You"}), (Frank:User {name: "Frank"}), (Jimpost:Post {title: "Jim posted this, You follow his page"}), (Frankpost:Post {title: "Frank posted this, You are his friend (connected_to)"}),
(You)-[:CONNECTED_USER]->(Frank),
(Frank)-[:CONNECTED_USER]->(You),
(You)-[:BOOKMARKED_PAGE]->(PP),
(PP)<-[:PROFILE_PAGE]-(Jim),
(Jimpost)<-[:POSTED]-(Jim),
(Frankpost)<-[:POSTED]-(Frank)

你是“你”。弗兰克是你的“朋友”(CONNECTED_USER)。您已将“Jim”的个人资料页面(页面)添加为书签。因此,我希望能够使用“朋友”和“关注”(用户已为用户添加书签的个人资料页面)用户进行查询。在这个例子中,他们都发布了一个页面,但用例并不仅仅是发布的页面

1 个答案:

答案 0 :(得分:1)

您需要使用逗号,来创建复合模式:

match (user:User {id: SOME_ID})-[:FOLLOWED_PAGE]->(Page)<-[:PROFILE_PAGE]-(friend:User),
      (user)-[:CONNECTED_USER]->(friend:User),
      (page:Page)<-[:COMMENTED_ON]-(friend)
return page

逗号基本上构建了一个单一的模式。单独的部分通过常用的标识符(此处为user, page, friend)连接。