我最近开始学习Cypher。我有一个包含四个用户和电影的数据库。用户可以与电影建立[:WATCHED] / [:WATCHLISTED] / [:FAVORITED]
关系。
我想获得所有四个用户都观看过的电影。这是我编写的有效查询:
match (u1)-[:WATCHED]->(f)<-[:WATCHED]-(u2),
(u3)-[:WATCHED]->(f)<-[:WATCHED]-(u4)
return u1, u2, u3, u4, f
我想知道是否有更有效的方法来做到这一点。或其他任何我无法做到的方式。我出于好奇而问。
答案 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
。