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

时间:2018-10-22 16:30:01

标签: graph neo4j cypher

假设我有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,因此计数值I为寻找的是2,因为A和B,B和C两者之间都有两个关系。

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

2 个答案:

答案 0 :(得分:1)

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;

第4行的id子句中的WHERE比较避免了每对具有两个关系(每个方向一个),并避免了从节点到自身的关系。

2.2结果

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

3。计算发生次数

3.1解决方案

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

3.2结果

╒════════╕
│"amount"│
╞════════╡
│2       │
└────────┘

答案 1 :(得分:0)

我假设您的意思是“两个节点之间恰好有2个关系的次数”,但是这里的想法是保持Cypher简单,以便您匹配的模式是即插即用的。您可以使用SIZE来计数节点之间特定模式的出现,并使用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),但第一种形式更清楚)