假设我有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两者之间都有两个关系。
对于可能的重复,我对计数两个节点之间发生关系的次数不感兴趣,我想统计发生这种情况的所有次数。 对不起,我的英语,谢谢。
答案 0 :(得分: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);
MATCH
(startNode)-[:RelationType1]-(endNode)-[:RelationType2]-(startNode)
WHERE
id(startNode) < id(endNode)
RETURN
startNode.name AS startNodeName, endNode.name AS endNodeName;
第4行的id
子句中的WHERE
比较避免了每对具有两个关系(每个方向一个),并避免了从节点到自身的关系。
╒═══════════════╤═════════════╕
│"startNodeName"│"endNodeName"│
╞═══════════════╪═════════════╡
│"A" │"B" │
├───────────────┼─────────────┤
│"B" │"C" │
└───────────────┴─────────────┘
MATCH
(startNode)-[:RelationType1]-(endNode)-[:RelationType2]-(startNode)
WHERE
id(startNode) < id(endNode)
RETURN
count(startNode) AS amount;
╒════════╕
│"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)
,但第一种形式更清楚)