Neo4j:如何从具有关系条件的所有节点集中删除或过滤节点

时间:2016-11-23 06:13:51

标签: neo4j

假设我有一个图像节点,我在该图像节点上有不同的关系。比率视图等 我想根据与该关系的条件的特定关系删除图像。 e.g

match(i:Image)
where NOT (i)<-[r:RATES]-(u:User{userId:"123"})
and r.rate>5
return i

在这里,我想查找所有未被用户评分且评分大于5的图像。

我无法找到适合它的解决方案

2 个答案:

答案 0 :(得分:1)

要查找“所有未被用户评分且评分大于5的图像”:

MATCH (i:Image)<-[r:RATES]-(u:User)
WITH i, COLLECT(r.rating) AS ratings, COLLECT(u.userId) AS ids
WHERE ANY(r IN ratings WHERE r > 5) AND (NOT '123' IN ids)
RETURN i;

答案 1 :(得分:0)

感谢您的澄清,这是一个有点棘手的查询。由于我们似乎无论如何都要返回大部分图像,因此应该可以与用户和所有图像开始匹配。然后我们可以在:用户和图像之间的RATES关系上使用OPTIONAL MATCH,如果不存在这样的关系,则r将为null。这将让我们在另一个谓词中使用WITH,其中我们只保留给定关系不存在的行:图像,或者用户评价的位置:图像大于5。

MATCH (u:User{userId:"123"}), (i:Image)
OPTIONAL MATCH (u)-[r:RATES]->(i)
WITH i
WHERE r IS NULL OR r.rate > 5
RETURN i

请注意在WITH上使用WHERE子句而不是在OPTIONAL MATCH上。如果我们将WHERE放在OPTIONAL MATCH上,它就不会过滤掉用户将图像评级为小于或等于5的行,在这些情况下它会为r返回null,这会使得查询错误。