通过REST将MERGE与属性结合使用

时间:2013-06-17 13:27:29

标签: rest merge neo4j cypher

根据http://docs.neo4j.org/chunked/2.0.0-M03/rest-api-transactional.html的示例代码,我正在尝试使用MERGE语句。

但是当我申请以下声明时:

{
    "statements": [
        {
            "statement": "MERGE (p:PERSON { identification }) ON CREATE p SET { properties } ON MATCH p SET { properties } RETURN p",
            "parameters": {
                "identification": {
                    "guid": "abc123xyz"
                },
                "properties": {
                    "lastName": "Doe",
                    "firstName": "John"
                }
            }
        }
    ]
}

它返回了以下2个错误:

  • {identification}

代码:42000, 状态:STATEMENT_EXECUTION_ERROR, 消息:尝试将属性设置为混合类型的集合。列表(地图(guid - > abc123xyz))

  • SET {properties}

代码:42001, 状态:STATEMENT_SYNTAX_ERROR“, 消息:=' expected but O'发现\ n \ n我们应该......

这可不是这样做的(还是)或者我错过了什么?

感谢您的帮助

丹尼尔

3 个答案:

答案 0 :(得分:1)

好像你发现了一个错误。我在这里报告了这个问题:

https://github.com/neo4j/neo4j/issues/975

答案 1 :(得分:1)

问题是MERGE需要提前知道您要搜索的密钥。传递参数图可以隐藏它。

要实现相同目的,请明确列出每个键。如果您仍希望将它们全部传递到一个地图中,则可以执行以下操作:MERGE (p:Person {name: {merge_map}.name, email: {merge_map}.email})

答案 2 :(得分:0)

Daniel,

我认为你必须使用不同的SET,如下所示:

MERGE (p:PERSON { identification }) 
ON CREATE p SET p={ properties } 
ON MATCH p SET p={ properties } 
RETURN p

但我不确定SET是否会覆盖您的所有属性。所以你可能需要逐个指定它们。

{
    "statements": [
        {
            "statement": "MERGE (p:PERSON { guid : {guid} }) 
             ON CREATE p SET p.lastName={lastName},p.firstName={ firstName } 
             ON MATCH  p SET p.lastName={lastName},p.firstName={ firstName }
             RETURN p",
            "parameters": {
               "guid": "abc123xyz",
               "lastName": "Doe",
               "firstName": "John"
            }
        }
    ]
}