【问题标题】:CYPHER storing count()-value for further usageCYPHER 存储 count() 值以供进一步使用
【发布时间】:2018-05-30 13:22:31
【问题描述】:

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

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

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

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

这给了我 2 个名字的列表以及他们一起在电影中播放的次数(例如“Keanu Reeves”、“Carrie-Anne Moss”、Strength: 3 -> 因为图中有 3 部 Matrix 电影.)

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

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

MERGE 确保只创建一个关系,但我无法让计数材料与创建一起工作。

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

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

      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)
    

    【讨论】:

    • 这确实有效。它以某种方式仅在仅在一部电影中一起工作的演员之间创建了 :ACTED_WITH 关系。不过还是谢谢。
    • 你确定吗?下面的查询 MATCH (a)-[r:ACTED_WITH]-&gt;(b) RETURN a.name, r.Strength, b.name ORDER BY r.Strength DESC 返回一些类似下面的结果 "Laurence Fishburne" 3 "Keanu Reeves"
    • 是的,我试过了,结果和我上面描述的一样。
    【解决方案2】:

    您可以使用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。

    【讨论】:

    • 更新:可以删除“COLLECT(p) as movies”子句,因为它没有被使用,导致查询需要更多时间
    • @Konster 该位仅用于验证目的。验证查询正确后,您可以删除该查询和 RETURN 位。
    猜你喜欢
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多