图有两种类型的节点:
有以下关系:
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 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
的作用是确保结果仅包含完整的规则链,而不包含它们的任何子集。