如何获取neo4j中关系的所有节点(节点A)-[关系A]->(节点B)-[关系B]->(节点C)

问题描述 投票:0回答:1

图有两种类型的节点:

  • 规则(有名称属性)
  • 变量(具有名称属性)

有以下关系:

  • 规则-[:depends_on]->变量
  • 规则-[:目标]->变量

Cypher 查询创建示例图

CREATE
  (rule1:Rule {name:'rule_1'}),
  (rule2:Rule {name:'rule_2'}),
  (rule3:Rule {name:'rule_3'}),
  (rule4:Rule {name:'rule_4'}),
  (variable1:Variable {name:'variable_1'}),
  (variable2:Variable {name:'variable_2'}),
  (variable3:Variable {name:'variable_3'}),
  (variable4:Variable {name:'variable_4'}),
  (variable5:Variable {name:'variable_5'}),
  (variable6:Variable {name:'variable_6'}),
  (variable7:Variable {name:'variable_7'}),
  (rule1)-[:targets]->(variable2),
  (rule1)-[:targets]->(variable3),
  (rule2)-[:targets]->(variable4),
  (rule2)-[:targets]->(variable5),
  (rule3)-[:targets]->(variable6),
  (rule3)-[:targets]->(variable7),
  (rule4)-[:targets]->(variable3),
  (rule1)-[:depends_on]->(variable1),
  (rule2)-[:depends_on]->(variable2),
  (rule3)-[:depends_on]->(variable3),
  (rule4)-[:depends_on]->(variable4)

查询需求

给定规则名称,使用密码查询递归地获取可以由其触发的所有可能的规则链。也就是说,如果规则 1 被触发,那么它将触发规则 2(变量 2 是规则 1 的目标并且是规则 2 的依赖项)和规则 3(变量 3 是规则 1 的目标并且是规则 3 的依赖项)和规则 2将触发规则 4(变量 4 是规则 2 的目标,并且是规则 4 的依赖项),这又可以触发规则 3(变量 3 是规则 4 的目标,并且是规则 3 的依赖项)。

可能的规则链

Rule 1 -> Rule 2 -> Rule 4 -> Rule 3
Rule 1 -> Rule 3
neo4j cypher
1个回答
0
投票

如果您使用 Neo4j 5.9+,您可以使用以下量化路径模式来获取每个不同的规则链:

MATCH ruleChain = (:Rule {name: 'rule_1'}) 
        (()-[:targets]->(:Variable)<-[:depends_on]-(:Rule))+ (r:Rule) 
WHERE NOT EXISTS { (r)-[:targets]->(:Variable)<-[:depends_on]-(:Rule) }
RETURN ruleChain

WHERE NOT EXISTS
的作用是确保结果仅包含完整的规则链,而不包含它们的任何子集。

© www.soinside.com 2019 - 2024. All rights reserved.