gpt4 book ai didi

Neo4j Cypher Query 来聚合连接节点的数量

转载 作者:行者123 更新时间:2023-12-02 03:35:58 28 4
gpt4 key购买 nike

我在这里有一个电子邮件图模型:http://console.neo4j.org/r/go164n

我正在尝试查找从一个电子邮件地址发送到另一个电子邮件地址的邮件计数,反之亦然。

基本上,有几个电子邮件地址节点以及连接电子邮件地址的消息节点。这些消息和电子邮件地址节点之间的关系是:SENT or :Received_By
他们只能走一种方式,所以地址将采用这些格式

  • EmailNode1-[:SENT]->MessageNode1
  • MessageNode1-[:Received_By]->EmailNode2

  • 对于每个消息节点,只能有一个发送者,但可以有多个接收者。

    我想要得到的是两个特定电子邮件地址之间的邮件计数汇总 .

    这意味着在我的示例中,我试图获得以下各项的汇总:
    MATCH (n:EmailAddress)-->(m:Message)-->(o:EmailAddress)WHERE n.address='Yoprado@yahoo.com' AND o.address='SammyGee@yahoo.com'WITH n, count(DISTINCT m) AS messageCount, oRETURN n.address, messageCount, o.address

    MATCH (n:EmailAddress)<--(m:Message)<--(o:EmailAddress)WHERE n.address='Yoprado@yahoo.com' AND o.address='SammyGee@yahoo.com'WITH n, count(DISTINCT m) AS messageCount, oRETURN n.address, messageCount, o.address
    我没有得到两个单独的消息计数,而是想知道是否有一个密码查询来自动总结这些计数

    原因 MATCH (n:EmailAddress)--(m:Message)--(o:EmailAddress)不会工作是因为可能有第三个电子邮件地址节点可能会向其他两个电子邮件地址发送消息。这将使两个电子邮件地址接收器和我不想计算这些消息。

    谢谢!

    编辑:

    嘿!其实我可能把你搞糊涂了。我希望返回是两封电子邮件之间消息的汇总。最终会得到的东西

    n.address messageCount o.address
    Yoprado@yahoo.com 2 SammyGee@yahoo.com

    我不能使用 MATCH (n:EmailAddress)--(m:Message)--(o:EmailAddress)
    因为它还会计算发送给他们两个但都不是收件人的电子邮件

    最佳答案

    我认为这可以满足您的要求:

    MATCH (n:EmailAddress)-[:SENT]-(m:Message)-[:Received_By]-(o:EmailAddress)
    WHERE (n.address='Yoprado@yahoo.com' AND o.address='SammyGee@yahoo.com')
    OR (o.address='Yoprado@yahoo.com' AND n.address='SammyGee@yahoo.com')
    WITH n, m, count(DISTINCT m) AS messageCount, o
    RETURN n.address, messageCount, o.address, m.body

    您的创建代码中似乎也存在错误,因为它使用相同的数据创建了两个单独的图形。你需要围绕标识符的括号:
    CREATE (_6:EmailAddress { address:"Yoprado@yahoo.com" }),
    (_7:EmailAddress { address:"SammyGee@yahoo.com" }),
    (_8:EmailAddress { address:"Moniqua@yahoo.com" }),
    (_9:Message { body:"Sam Sucks" }),
    (_10:Message { body:"I suck" }),
    (_11:Message { body:"We ALL suck" }),
    (_6)-[:SENT]->(_9),
    (_7)-[:SENT]->(_10),
    (_8)-[:SENT]->(_11),
    (_9)-[:Received_By]->(_7),
    (_10)-[:Received_By]->(_6),
    (_11)-[:Received_By]->(_6),
    (_11)-[:Received_By]->(_7)

    它返回以下内容:
    n.address           messageCount    o.address               m.body
    Yoprado@yahoo.com 1 SammyGee@yahoo.com Sam Sucks
    SammyGee@yahoo.com 1 Yoprado@yahoo.com I suck

    Query took 41 ms and returned 2 rows.

    编辑1:

    如果您想要的只是一个计数,则可以简化查询:
    MATCH (n:EmailAddress)-[:SENT]-(m:Message)-[:Received_By]-(o:EmailAddress)
    WHERE (n.address='Yoprado@yahoo.com' AND o.address='SammyGee@yahoo.com')
    OR (o.address='Yoprado@yahoo.com' AND n.address='SammyGee@yahoo.com')
    RETURN count(*)

    关于Neo4j Cypher Query 来聚合连接节点的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436901/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com