CYPHER存储count() - 进一步使用的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CYPHER存储count() - 进一步使用的值相关的知识,希望对你有一定的参考价值。

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

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

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

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

这给了我一个2个名字的列表和他们一起在电影中播放的次数(f.e。“基努·里维斯”,“Carrie-Anne Moss”,力量:3 - >因为图中有3个Matrix电影。)

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

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

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

答案

您可以使用SET Cypher clause在匹配的节点上设置属性。如果您尝试在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将覆盖任何先前的值。如果您只想在创建关系时设置它,可以使用ON CREATE或ON MATCH。

另一答案

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

  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)

以上是关于CYPHER存储count() - 进一步使用的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在neo4j cypher中规范化值

Neo4j 使用cypher语言进行查询

如何使用CRT和PEM文件在SSLcat中实现ssl(SSL_ERROR_NO_CYPHER_OVERLAP)

使用 Cypher 向现有节点添加标签

如何使用Cypher返回节点的所有属性?

Neo4j 第三篇:Cypher查询入门