此(newbe-)问题基于官方getting started with neo4j online-tutorial中提供的数据库。
我的目标是创建一个查询,列出所有与两个以上电影相关联的人。 数据库由人和电影类型的节点组成。节点通过“ACTED_IN”,“DIRECTED”,“WROTE”或“PRODUCED”等关系连接。
数据库声称Gene Hackman在三部不同的电影中演出,而Cameron Crowe则指导,制作和编写了一部电影。所以Cameron与一部电影有三种关系,而Gene连接三部不同的电影。存在更多节点和连接。
我目前的查询如下:
match (p:Person)-[r]->(m:Movie)
with p, count(r) as rel
where rel > 2
return p;
这将返回:
Gene和Tom各自播放了三部不同的电影,所以这是正确的。 如上所述,卡梅隆的所有关系都出现在同一部电影中,这不是我的意图。查询不应该在此列表中返回Cameron,而只返回前两个人。
显然,我可以通过“ACTED_IN”关系,但我也想列出不是演员的人,例如:写作三部或三部以上单独电影的作者。
我的另一个问题是:
match (m:Movie)<-[ra]-(p:Person)-[rb]->(b:Movie)
...
不幸的是,这会将连接数限制为两个。
在计算人物和电影之间的关系时,是否有可能以仅包含不同电影的方式调整第一个查询?
答案 0 :(得分:1)
尝试此查询:
match (p:Person)-[r]->(m:Movie)
with p, count(r) as rel, count(distinct(endNode(r))) as q
where rel > 2 and q = 1 return p;
它的作用是从关系中提取结束节点。你想要的是只有一部这样的电影,以摆脱卡梅伦克劳的问题。
答案 1 :(得分:0)
这是一个可以做你想要的查询。
MATCH (p:Person)--(m:Movie)
WITH p, collect(DISTINCT m) AS ms
WHERE LENGTH(ms) > 2
RETURN p
你并不真正关心关系类型,所以不要担心。您为每个人收集不同的电影,如果不同电影的数量大于您的阈值,则返还此人。
恩典与和平,
吉姆