在neo4j中同时更新多个具有相同标签的节点

时间:2015-07-01 09:30:20

标签: neo4j cypher graph-databases

如何在neo4j中同时使用相同的标签更新这三个节点。我尝试了以下但不起作用。

方法1:

START n=node(0) 
MATCH n-[r:HAS_GRADE]->(g:Grade)-[r1:HAS_SYLLABUS]->(sy:Syllabus)
OPTIONAL MATCH (sy)-[:HAS_CHILD]->(s:Subject) SET s:Publish WITH s
OPTIONAL MATCH (s)-[:HAS_CHILD]->(c:Chapter) SET c:Publish WITH c
OPTIONAL MATCH (c)-[:HAS_CHILD]->(t:Topic) SET t:Publish 
RETURN s;

方法2

    START n=node(0) 
    MATCH n-[r:HAS_GRADE]->(g:Grade)-[r1:HAS_SYLLABUS]->(sy:Syllabus)
    OPTIONAL MATCH (sy)-[:HAS_CHILD]->(s:Subject)
    OPTIONAL MATCH (s)-[:HAS_CHILD]->(c:Chapter)
    OPTIONAL MATCH (c)-[:HAS_CHILD]->(t:Topic) WITH s,c,t
    SET s:Publish  
    SET c:Publish
    SET t:Publish
    RETURN s;

方法3

START n=node(0) 
MATCH n-[r:HAS_GRADE]->(g:Grade)-[r1:HAS_SYLLABUS]->(sy:Syllabus)
OPTIONAL MATCH (sy)-[:HAS_CHILD]->(s:Subject)
OPTIONAL MATCH (s)-[:HAS_CHILD]->(c:Chapter)
OPTIONAL MATCH (c)-[:HAS_CHILD]->(t:Topic) WITH s,c,t
SET s:Publish, c:Publish, t:Publish
RETURN s

我是否需要运行此查询3次才能更新三个节点。或者有其他方法吗?请帮忙。

1 个答案:

答案 0 :(得分:2)

怎么样:

START n=node(0) 
MATCH n-[r:HAS_GRADE]->(g:Grade)-[r1:HAS_SYLLABUS]->(sy:Syllabus)-[:HAS_CHILD*]->(c)
WHERE any(x in labels(c) WHERE x in ["Subject","Chapter","Topic"])
SET c :Publish
RETURN c

WHERE确保HAS_CHILD的结束节点带有列表中给出的标签。

我们使用*的可变路径长度(请参阅HAS_CHILD)来获取所有子节点。