CYPHER 存储 count()-value 以供进一步使用



我想在具有一个或多个共同事物的节点之间创建关系,并希望将共同事物的计数设置为关系中的属性。

例如:在电影教程图中,我想在一起出演过同一部电影的演员之间创建一个关系,以及他们一起播放的电影的设定计数作为关系中的属性。

对于基本计数,本教程提供了一个查询:

MATCH (n)-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)
RETURN n.name, coActors.name, count(*) AS Strength ORDER BY Strength DESC

这给了我一个包含 2 个名字的列表以及他们一起在电影中播放的次数(例如"基努·里维斯"、"嘉莉-安妮·莫斯",强度:3 ->,因为图表中有 3 部矩阵电影。

现在我想在这些对之间创建一个关系(ACTED_WITH(,并将强度值设置为其中的属性。 我可以创建这样的关系:

MATCH (a)-[:ACTED_IN]->(p)<-[:ACTED_IN]-(b) MERGE (a)-[r:ACTED_WITH]->(b)

MERGE 确保只创建了一个关系,但我只是无法让计数内容与创建一起使用。

我不确定你想要什么,但也许是这样的:

MATCH (a)-[:ACTED_IN]->(m)<-[:ACTED_IN]-(b) 
WITH  a,b, collect(m) AS movies ORDER BY size(movies)  DESC
MERGE (a)-[r:ACTED_WITH]-(b)
ON CREATE SET r.Strength=SIZE(movies)

可以使用 SET Cypher 子句在匹配的节点上设置属性。如果您尝试在 MERGE 子句中设置它,则 merge 会将键视为唯一标识符,如果尚不存在具有该特定值的关系,则将创建一个新关系。

MATCH (a)-[:ACTED_IN]->(p)<-[:ACTED_IN]-(b)
MERGE (a)-[r:ACTED_WITH]->(b)
// reduce matched set to one row of data
WITH DISTINCT a, b, r, COUNT(p) as strength, COLLECT(p) as movies
// set r
SET r.strength = strength
// Return everything to verify above results
RETURN *

SET 将覆盖任何以前的值。如果只想在创建关系时设置它,则可以使用"创建时"或"匹配时"。

最新更新