如何计算neo4j中关系的重复

问题描述 投票:1回答:3

我试图计算两个节点之间的关系数量,这些关系重复了一次以上。因为我正在使用MERGE条款。那么,是否有可能计算关系重复是否超过一次。图形上我看不到因为在使用MERGE子句时,如果节点和关系相同,则所有关系都会合并。但在我的数据重复确实存在。例如,如果节点A调用节点B,则此调用关系超过10次。当我将使用MERGE子句时,它只会出现一次,这有利于避免图中的重复。但我可以用cypher查询计算这些重复吗?提前致谢

graph neo4j cypher
3个回答
1
投票

如果你有(a)-[:CALLS]->(b)那么计算a和b之间的CALLS关系数的方法就是

MATCH (a)-[r:CALLS]->(b) 
RETURN COUNT(r)

但是,你也说你使用MERGE,它只能在a和b之间创建一个CALLS关系。

如果您确定a和b之间存在多个CALLS关系,则MERGE的使用不正确,或者在您开始使用MERGE之前存在这些关系。

无论哪种方式,如果存在多个,则Neo4j浏览器(2.2之后)将显示a和b之间的良好弯曲关系,并且上述查询将确认该事实。


0
投票

如果要获取重复的关系,可以使用此查询:

MATCH (a)-[r]->(b)
WITH 
    a, b, type(r) as typer, count(r) as countr
WHERE 
    countr>1
RETURN
    a, b, typer, countr

例如,如果您有这些数据:

约翰 - 打电话 - >莎莉

约翰 - 打电话 - >莎莉

莎拉 - 打电话 - >汤姆

艾米 - 打电话 - >莉莉

艾米 - 打电话 - >莉莉

艾米 - 打电话 - >莉莉

该查询将返回:

a        b         typer        countr
John     Sally     calls     2 
Amy      Lily      calls     3

0
投票

我使用以下内容的变体来审查重复的关系:

MATCH
  (a)-[r]->(b)
WITH
  id(a) AS id_a, id(b) AS id_b, type(r) AS type_r, count(*) AS count_r
WHERE
  count_r > 1
RETURN
  type_r, count_r
LIMIT 10

你需要小心,因为它们也可能是有效的,因为它们可能包含其中包含的不同属性值。但是,正如您所解释的那样,在创建时使用MERGE,您不应该获得重复项。您是否可以确保使用正确的MERGE语句,该语句要求关系独立于属于该关系的节点中的任何新值或更改值进行合并。您可能希望发布代码示例以便正确查看。

© www.soinside.com 2019 - 2024. All rights reserved.