代码之家  ›  专栏  ›  技术社区  ›  Wolgan Ens

NEO 4J-如何计算两个关系在同一节点中出现的次数

  •  0
  • Wolgan Ens  · 技术社区  · 7 年前

    假设我有3个节点A、B和C,以及两个关系R1和R2,我如何计算两个关系在同一个节点上发生的次数?例如:

    A-[r1]-B
    A-[r2]-B
    
    A-[r1]-C
    B-[r1]-C
    B-[r2]-C
    

    如您所见,r1出现3次,r2出现2次,但在同一个节点上,我们有a-[r1:r2]-b和b[r1:r2]-c,所以我要查找的计数值是2,因为a和b、b和c之间都有这两个关系。

    对于可能的重复,我不想计算两个节点之间关系发生的次数,我想计算发生这种情况的所有次数。 抱歉我的英语,谢谢。

    2 回复  |  直到 7 年前
        1
  •  1
  •   ThirstForKnowledge    7 年前

    1。你的图表

    为了便于进一步的回答和解决方案,我注意到我的图表创建声明:

    CREATE
      (a:NodeA {name: 'A'})-[:RelationType1]->(b:NodeB {name: 'B'}),
      (a)-[:RelationType2]->(b),
      (a)-[:RelationType1]->(c:NodeC {name: 'C'}),
      (b)-[:RelationType1]->(c),
      (b)-[:RelationType2]->(c);
    

    YourGraph

    2。渲染次数

    2.1解决方案

    MATCH
      (startNode)-[:RelationType1]-(endNode)-[:RelationType2]-(startNode)
      WHERE
      id(startNode) < id(endNode)
    RETURN
      startNode.name AS startNodeName, endNode.name AS endNodeName;
    

    这个 id 中的比较 WHERE 第4行的子句避免了每对有两个关系(每个方向一个),并防止从节点到它们自己创建关系。

    2.2结果

    ╒═══════════════╤═════════════╕
    │"startNodeName"│"endNodeName"│
    ╞═══════════════╪═════════════╡
    │"A"            │"B"          │
    ├───────────────┼─────────────┤
    │"B"            │"C"          │
    └───────────────┴─────────────┘
    

    三。计数发生次数

    3.1解决方案

    MATCH
      (startNode)-[:RelationType1]-(endNode)-[:RelationType2]-(startNode)
      WHERE
      id(startNode) < id(endNode)
    RETURN
      count(startNode) AS amount;
    

    3.2结果

    ╒════════╕
    │"amount"│
    ╞════════╡
    │2       │
    └────────┘
    
        2
  •  0
  •   Tezra    7 年前

    我假设您的意思是“两个节点之间正好有两个关系的次数”,但是这里的想法是保持密码简单,这样您匹配的模式就是即插即用的。您可以使用大小来计算节点之间特定模式的出现次数,并使用exists来测试它是否简单存在。在这里,我们使用where来查找符合我们感兴趣的模式的节点对,然后返回行数作为该模式出现次数的计数。

    MATCH (a), (b)
    WHERE ID(a) > ID(b) // create distinction between a and b
    AND SIZE((a)--(b)) = 2 // match the pattern we are looking for between them
    RETURN COUNT(*) as occurrences // return count
    

    模式也可以是 EXISTS((a)-[:r1]-(b)-[:r2]-(a)) (注意 WHERE EXISTS((a)--(b)) 等于 WHERE (a)--(b) 但第一种形式更清楚一点)