我在下面的表单中有一个JSON:
{ "conditions": [ { "id": "123", "type": "a", entities: ["529", "454"] },
{ "id": "124", "type": "b", entities: ["530", "455"] }
]
}
我希望基于类型属性在条件节点与节点A实体或节点B实体之间创建关系。假设这些实体已经存在于neo4j中,则可以是A/B。
我正在尝试下面的密码,但这不起作用。
WITH {json} as data
UNWIND data.conditions as condition
MATCH (c:Condition { conditionId: condition.id})
CASE c.type
WHEN 'a' THEN FOREACH (sid IN condition.entities |
MERGE (s:NodeA {nr_serverId:sid}) MERGE (s)-[:ATTACHED_TO]->(c)
)
WHEN 'b' THEN FOREACH (aid IN condition.entities |
MERGE (a:NodeB {nr_appId: aid}) MERGE (a)-[:ATTACHED_TO]->(c)
)
END;
有没有人能帮我找出正确的方法?谢谢。
发布于 2017-03-25 07:06:47
由于目前cypher中没有经典的条件语句,因此您可以使用famous trick with foreach
and case
WITH {json} as data
UNWIND data.conditions as condition
MATCH (c:Condition { conditionId: condition.id})
FOREACH (ift in CASE WHEN c.type = 'a' THEN [1] ELSE [] END |
FOREACH (sid IN condition.entities |
MERGE (s:NodeA {nr_serverId:sid}) MERGE (s)-[:ATTACHED_TO]->(c)
)
)
FOREACH (ift in CASE WHEN c.type = 'b' THEN [1] ELSE [] END |
FOREACH (aid IN condition.entities |
MERGE (a:NodeB {nr_appId: aid}) MERGE (a)-[:ATTACHED_TO]->(c)
)
)
发布于 2017-05-15 22:32:48
APOC Procedures刚刚更新了对conditional cypher execution的支持。您需要3.1.3.7或更高版本(如果使用Neo4j 3.1.x),或者3.2.0.3或更高版本(如果使用Neo4j 3.2.x)。
下面是使用这些新过程执行查询的示例:
WITH {json} as data
UNWIND data.conditions as condition
MATCH (c:Condition { conditionId: condition.id})
CALL apoc.do.case([
c.type = 'a',
"FOREACH (sid IN condition.entities |
MERGE (s:NodeA {nr_serverId:sid}) MERGE (s)-[:ATTACHED_TO]->(c))",
c.type = 'b',
"FOREACH (aid IN condition.entities |
MERGE (a:NodeB {nr_appId: aid}) MERGE (a)-[:ATTACHED_TO]->(c))"
], '', {condition:condition, c:c}) YIELD value
https://stackoverflow.com/questions/43010726
复制相似问题