寻找共同关系的有效方法

时间:2018-07-06 12:05:17

标签: neo4j cypher

我最近开始学习Cypher。我有一个包含四个用户和电影的数据库。用户可以与电影建立[:WATCHED] / [:WATCHLISTED] / [:FAVORITED]关系。

我想获得所有四个用户都观看过的电影。这是我编写的有效查询:

match (u1)-[:WATCHED]->(f)<-[:WATCHED]-(u2),
(u3)-[:WATCHED]->(f)<-[:WATCHED]-(u4)
return u1, u2, u3, u4, f

我想知道是否有更有效的方法来做到这一点。或其他任何我无法做到的方式。我出于好奇而问。

3 个答案:

答案 0 :(得分:2)

例如,您可以这样做:

MATCH (f:Film)
WHERE size((f)<-[:WATCHED]-()) = 4
RETURN f, [(f)<-[:WATCHED]-(u:User) | u] as watchers

在这里,我假设即使用户观看了电影多次,用户与电影之间也只有一种WATCHED类型的关系。

答案 1 :(得分:1)

您可以使用outerArray.forEach(function(d) { const coordinate = [d[0], d[1]]; const center = [width / 2, height / 2]; gdistance =d3.geoDistance(coordinate,projection.invert(center)); if(gdistance < 1.57079632679490) { context.fillText( d[2], projection(d)[0], projection(d)[1] ); } });

https://neo4j.com/docs/developer-manual/current/cypher/functions/predicate/

这将检查所有元素的谓词是否为真。

答案 2 :(得分:1)

为避免必须对User节点计数进行硬编码,此查询使用数据库的内部统计信息有效地获取了计数:

MATCH (u:User)
WITH COUNT(u) AS userCount
MATCH (f:Film)
WHERE SIZE((f)<-[:WATCHED]-()) = userCount
RETURN f;

此查询不会返回观看电影的用户,因为这实际上是数据库中的所有用户,并且如果查询的用户数量足够多,您的查询可能会用光内存-否则客户端(例如neo4j浏览器)可能需要很长时间才能接收和处理结果。我认为这样的查询的重点是找到电影,而不是用户。如果您确实想获得所有用户,则可以执行单独的查询:MATCH (u:Users) RETURN u