create (bird:Class {name:'bird'})-[:isSubClassOf]->(animal:Class {name:'animal'})
create (animal)-[:hasOrgan {condition:'Exists (({x})-[:isInstanceOf]->(bird))'}]->(wing:organ {name:'wing'})
create (x:bird:instance {name:'pigeon_1'})-[:isInstanceOf]->(bird)
如何创建一个查询来读取条件表达式的值,并根据其值决定是否创建(pigeon_1)-[:hasOrgan]->(:wing) MATCH (bird:Class {name:'bird'})-[:isSubClassOf]->(animal:Class {name:'animal'})
我创建了以下查询,但出现错误,我应该如何修复它?
MATCH (animal)-[hasOrgan:hasOrgan]->(wing:organ)
WHERE hasOrgan.condition IS NOT NULL
WITH x, hasOrgan, wing, hasOrgan.condition AS condition
CALL apoc.cypher.doIt('RETURN ' + condition + ' AS value', {x: x, wing: wing})
YIELD value
WITH x, hasOrgan, wing, value AS conditionValue
WHERE conditionValue
CREATE (x)-[:hasOrgan]->(wing)
以下查询可能适合您。它假设您用更简单的
[:hasOrgan {condition:'Exists (({x})-[:isInstanceOf]->(bird))'}]
替换非常复杂的关系模式 [:hasOrgan {ifClass: 'bird'}]
。
MATCH (cls:Class)-[hasOrgan:hasOrgan]->(organ:organ)
WHERE hasOrgan.ifClass IS NOT NULL
MATCH (inst:instance)-[:isInstanceOf]->(:Class)-[:isSubClassOf*0..]->(cls)
MATCH p = (inst)-[:isInstanceOf]->(:Class)-[:isSubClassOf*0..]->(clsN)
WHERE NOT (clsN)-[:isSubClassOf]->() AND
ANY(c IN TAIL(NODES(p)) WHERE hasOrgan.ifClass = c.name)
MERGE (inst)-[:hasOrgan]->(organ)
查询按顺序执行此操作:
hasOrgan
关系及其关联的 class
。instance
中的每个 class
。class
的所有 instance
,并要求 hasOrgan.ifClass
值是这些类之一的 name
。MERGE
创建 hasOrgan
关系(如果尚不存在)。