create (a:Class {name:'A'})-[:subClassOf]->(b:Class {name:'B'})
create (b)-[:subClassOf]->(c:Class {name:'C'})
create (rule:Rule {name:'Rule1',
condition:'exists( (a:Class)-[:subClassOf]->(b:Class) ) AND exists( (b:Class)-[:subClassOf]->(c:Class) )',
action:'create (a)-[:subClassOf]->(c)'})
字符串
我尝试将规则数据保存为节点属性中的字符串,而不是后端程序中的字符串,然后创建一个查询,读取规则中的条件,如果返回true,则执行操作,例如:如果存在任何A-[:subClassOf]->B AND B-[:subClassOf]->C,则创建A-[:subClassOf]->C。
我写了一个查询如下:
MATCH (rule:Rule)
WHERE rule.name = 'Rule1'
WITH rule, toBoolean(rule.condition) AS condition
WHERE condition
CALL apoc.cypher.run(rule.action) YIELD value
RETURN value
型
但是这个查询似乎没有返回任何结果,我应该怎么做才正确呢?谢谢帮助!
1条答案
按热度按时间dldeef671#
我倾向于使用像
CALL apoc.cypher.run(rule.condition,{}) YIELD value as condition
这样的东西来运行和评估你的条件。然后你可以使用类似
CALL apoc.do.when()
的东西来运行基于条件值的操作Cypher。然而,这意味着你需要再次重新选择条件数据,因为运行一个通用的create (a)-[:subClassOf]->(c)
将在整个数据集上执行此操作,而不仅仅是where(a)-->(B)-->(c)。因此,我建议更新操作Cypher以选择数据子集并创建新关系。它看起来像这样:
字符串