首页 > 解决方案 > 两个独立查询neo4j的结果之间的差异

问题描述

我有 2 个返回 2 组用户的子查询(每个查询返回一组用户)

第一个查询:

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

我怎样才能在一个查询中做到这一点?我尝试的一切都导致了查询的笛卡尔积,并且每次独立查询都需要不到一秒钟的时间。

标签: neo4jcypher

解决方案


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我们可以过滤第二个查询的结果。


推荐阅读