如何将条件作为字符串存储在节点属性或关系属性中并在查询中使用它?

问题描述 投票:0回答:1
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)
neo4j cypher
1个回答
0
投票

以下查询可能适合您。它假设您用更简单的

[: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)

查询按顺序执行此操作:

  1. 查找每个
    hasOrgan
    关系及其关联的
    class
  2. 找到
    instance
    中的每个
    class
  3. 查找每个
    class
    的所有
    instance
    ,并要求
    hasOrgan.ifClass
    值是这些类之一的
    name
  4. 使用
    MERGE
    创建
    hasOrgan
    关系(如果尚不存在)。
© www.soinside.com 2019 - 2024. All rights reserved.