两个独立查询的结果neo4j之间的差异

时间:2019-08-22 08:16:18

标签: neo4j cypher

我有2个子查询,可返回2组用户(每个查询返回1组用户)

第一个查询:

MATCH (:User {user_id: "69b3315a-ba4a-4021-94e1-0f494f9b957f"})-->(first_set_of_users)
RETURN first_set_of_users

第二个查询:

MATCH (:User {user_id: "69b3315a-ba4a-4021-94e1-0f494f9b957f"})<-[:LIKES]-(likers)-[:LIKES]->(v)
WITH DISTINCT v
MATCH (second_set_of_users)-[:LIKES]->(v)
RETURN second_set_of_users, COUNT(*) AS recoWeight
ORDER BY recoWeight DESC

我最后要返回的是second_set_of_users中的所有用户减去first_set_of_usersORDER BY recoWeight DESC中的用户

如何在一个查询中做到这一点?我尝试过的所有事情都导致了笛卡尔式的查询结果,并且花费了很多时间,而每个独立的查询都花费了不到一秒钟的时间。

1 个答案:

答案 0 :(得分:1)

MATCH (:User {user_id: "69b3315a-ba4a-4021-94e1-0f494f9b957f"})-->(first_set_of_users)
WITH collect(first_set_of_users) AS list_of_first_set_of_users
MATCH (:User {user_id: "69b3315a-ba4a-4021-94e1-0f494f9b957f"})<-[:LIKES]-(likers)-[:LIKES]->(v)
WITH DISTINCT v, list_of_first_set_of_users
MATCH (second_set_of_users)-[:LIKES]->(v)
WITH second_set_of_users, COUNT(*) AS recoWeight
WHERE NOT second_set_of_users IN list_of_first_set_of_users
RETURN second_set_of_users, recoWeight
ORDER BY recoWeight DESC

说明。 使用WITH子句,我们可以将第一个查询的结果传递给第二个查询。 然后使用WHERE NOT IN我们可以过滤第二个查询的结果。