【问题标题】:Commas in MERGE clause like there are in MATCH clause?MERGE 子句中的逗号与 MATCH 子句中的逗号一样吗?
【发布时间】:2020-08-18 17:34:59
【问题描述】:

以下在 neo4j 4 中运行良好:

MATCH (a)-->(b)<--(c), (b)-->(d)
RETURN a

但以下返回错误:

MERGE (a)-->(b)<--(c), (b)-->(d)
RETURN a

错误文本: Neo.ClientError.Statement.SyntaxError

Invalid input ',': expected whitespace, a relationship pattern, ON, FROM GRAPH, USE GRAPH, CONSTRUCT, LOAD CSV, START, MATCH, UNWIND, MERGE, CREATE UNIQUE, CREATE, SET, DELETE, REMOVE, FOREACH, WITH, CALL, RETURN, UNION, ';' or end of input (line 1, column 22 (offset: 21))
"MERGE (a)-->(b)<--(c), (b)-->(d)"
                     ^

如果我理解正确,merge 提供了一定程度的 upsert 功能。但是,merge 在匹配能力上是否比 match 更受限制?如何合并complex non-linear patterns that require comma separations

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    如果模式中的任何项尚不存在,则将创建整个 MERGE 模式。因此,为了安全起见,您必须始终确保每个 MERGE 模式只有 一个 可能不存在的项目。

    这就是为什么只有 MERGE 支持具有单个术语的模式才有意义。

    例如,而不是这个(无论如何,这不是合法的 Cypher):

    MERGE
      (a:Foo {id: 'a'})-[:BAR]->(b:Foo {id: 'b'})<-[:BAR]-(c:Foo {id: 'c'}),
      (b)-[:BAR]->(d:Foo {id: 'd'})
    RETURN a
    

    你应该这样做:

    MERGE (a:Foo {id: 'a'})
    MERGE (b:Foo {id: 'b'})
    MERGE (c:Foo {id: 'c'})
    MERGE (d:Foo {id: 'd'})
    MERGE (a)-[:BAR]->(b)
    MERGE (b)<-[:BAR]-(c)
    MERGE (b)-[:BAR]->(d)
    RETURN a
    

    【讨论】:

    • 明白了。但是有没有办法实现合并为复杂模式提供的功能(即提供一个模式,如果至少一个节点/关系不存在,则创建整个模式)。我确信这方面的任何用例都可以用其他更明智的方式处理,但我只是想了解 cypher 为我提供了哪些开箱即用的设施。
    • 只要模式只有一个术语,那么MERGE 就会接受它。但如果这个术语很复杂,那么你最好知道你在做什么。坦率地说,我想不出一个冒险的好理由。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多