【问题标题】:Neo 4j - How to count the number of times two relationships appear in the same nodesNeo4j - 如何计算两个关系出现在同一节点中的次数
【发布时间】:2023-03-24 07:04:02
【问题描述】:

假设我有 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之间都有这两种关系。

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

【问题讨论】:

标签: graph neo4j cypher


【解决方案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);

2。渲染事件

2.1 解决方案

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

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

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       │
└────────┘

【讨论】:

  • 谢谢,看来是正确的做法!我试试看
【解决方案2】:

我假设您的意思是“2 个节点之间恰好有 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),但第一种形式更清晰一些)

【讨论】:

  • 数据库上还有其他关系,我需要能够指定我要检查的两个关系是否同时存在于同一个节点上
  • @WolganEns 只需将查询中的模式替换为您要匹配的模式即可。如果您不需要检查每对的模式出现率,只需使用EXISTS() 而不是SIZE() = #。我已经给出了 EXISTS 表单,您可以在其中指定关系类型,所以我不确定您要计算的模式到底是什么。
  • 请注意,此解决方案涉及笛卡尔积 - 不适用于大图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多