如何计算neo4j中关系的重复

时间:2015-05-12 10:26:46

标签: graph neo4j cypher

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

3 个答案:

答案 0 :(得分: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之间的良好弯曲关系,并且上述查询将确认该事实。

答案 1 :(得分: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语句,该语句要求关系独立于属于该关系的节点中的任何新值或更改值进行合并。您可能希望发布代码示例以便正确查看。

答案 2 :(得分:0)

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

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

例如,如果您有以下数据:

  

John-打电话-> Sally

     

John-打电话-> Sally

     

莎拉-致电->汤姆

     

艾米-电话->莉莉

     

艾米-电话->莉莉

     

艾米-电话->莉莉

查询将返回:

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