Search code examples
neo4jcypherneo4j-apoc

apoc.merge.node with special identifier fails


I tried to merge a node with apoc.merge.node but my ident property keys have a special char(:) and get double escaped. Did i miss something or does a workaround exist? If i replace the ":" with "_" everything works as expected.

Neo4j 4.2.1 community and APOC 4.2.0

CALL apoc.merge.node(["test"], apoc.map.fromPairs([["i:d","123"]])) YIELD node return node

Error

Failed to invoke procedure `apoc.merge.node`: Caused by: org.neo4j.exceptions.SyntaxException: Invalid input 'i': expected "}" (line 1, column 17 (offset: 16))
"MERGE (n:test{``i:d``:$identProps.``i:d``}) ON CREATE SET n += $onCreateProps ON MATCH SET n += $onMatchProps RETURN n"

Solution

  • EDIT

    It seems there is a bug in APOC which causes the identifier to be encoded twice.

    First with Util::quote https://github.com/neo4j-contrib/neo4j-apoc-procedures/blob/4.1/core/src/main/java/apoc/util/Util.java#L674

    And then in the merge procedure https://github.com/neo4j-contrib/neo4j-apoc-procedures/blob/4.1/core/src/main/java/apoc/merge/Merge.java#L85

    I've filed an issue: https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/1783


    In Neo4j, you can use backticks ` around a key that contain special characters :

    CALL apoc.merge.node(["test"], apoc.map.fromPairs([["`i:d`","123"]])) 
    YIELD node 
    return node
    

    Same is true everywhere in the Cypher syntax, escaping a label with a whitespace for eg :

    MERGE (n:`Land Vehicle` {id: "land-rover-1"})