CYPHER中存储count值并创建带计数属性的关系技术问询
创建带共同参演计数的ACTED_WITH关系
我来帮你搞定这个需求——把共同参演电影的数量作为ACTED_WITH关系的Strength属性,其实只需要把统计逻辑和关系创建/更新通过WITH子句串起来就行,还能避免重复创建关系。
直接上完整的Cypher语句:
MATCH (a:Actor)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(b:Actor) WHERE a <> b // 排除演员和自身建立关系的情况 WITH a, b, count(m) AS strength WHERE a.name < b.name // 可选:确保每对演员只生成一条单向关系,避免重复 MERGE (a)-[r:ACTED_WITH]->(b) SET r.Strength = strength // 给关系设置或更新Strength属性 RETURN a.name, b.name, r.Strength
逐部分解释:
- MATCH子句:先定位所有共同参演同一部电影的演员对,以及他们参演的电影节点。
- WHERE a <> b:这步很重要,防止出现演员自己和自己创建关系的无效数据。
- WITH子句:把匹配到的演员对和对应的共同电影数聚合起来,把结果传递给后续的关系操作。
- WHERE a.name < b.name:这是个可选的优化条件,能保证每对演员之间只会生成一条
ACTED_WITH关系(比如只创建Keanu Reeves指向Carrie-Anne Moss的关系,而不会反过来也创建一条),避免重复统计。如果你的业务需要双向关系,直接去掉这个条件就行。 - MERGE子句:保证每对演员之间最多只有一条
ACTED_WITH关系——如果已经存在就复用,不存在就新建。 - SET子句:把统计出来的共同电影数赋值给关系的
Strength属性;如果关系已经存在,这步会更新属性值,所以后续新增电影后重复执行这个语句,就能同步更新最新的计数。
额外提示:
- 如果你的图谱里演员节点没有
:Actor标签、电影没有:Movie标签,可以去掉这些标签限制,不过加上标签能让查询效率更高。 - 如果需要确保关系的
Strength始终是最新的,随时可以重新执行这个语句,它会自动更新已有关系的属性值。
内容的提问来源于stack exchange,提问作者Konster
相关产品推荐
相关产品推荐

