如何将唯一数据添加到neo4j图数据库中

Joh*_*ews 6 neo4j graph-databases graphenedb

我正在向我的neo4j数据库添加迭代数据,但我仍然坚持如何覆盖或更新现有数据并检查数据是否已存在于那里.

基本上我有一组带有相应id的电影,例如:

[
  {id: 'gameofthrones', genre: 'fantasy', release: '2017'},
  {id: 'inception', genre: 'scifi', release: '2010'},
  ...
]
Run Code Online (Sandbox Code Playgroud)

我可以按如下方式添加电影:

CREATE 
(m1:Movie {id: 'gameofthrones', genre: 'fantasy', release: '2017'}), 
(m2:Movie {id: 'inception', genre: 'scifi', release: '2010'}) 
Run Code Online (Sandbox Code Playgroud)

但是,当我运行脚本两次时,它会创建4个节点,而不是将其保留在两个节点上.

所以我的问题是,我如何确保它检查节点id是否已经存在,如果是这样,则覆盖它而不是创建新节点?

我试过(但只添加了属性)

// data
attributes['id']         = 'gameofthrones';
attributes['genre']     = 'fantasy';
...

// query
MERGE ( s:Movie {attributes}.id)
ON CREATE SET ( s:Movie {attributes} )
Run Code Online (Sandbox Code Playgroud)

我打电话NodeJS如下:

executeQuery(queryStr, {"attributes": attributes})

// cypher (nodejs)
function executeQuery(queryStr, params) {
    var qq = Q.defer();
    db.cypher({
        query: queryStr,
        params: params,
    }, function (error, results) {
        if (error) {
            qq.reject(error);
        } else {
            if (results.length != 0) {
                qq.resolve(true);
            } else {
                qq.resolve(false);
            }
        };
    });
    return qq.promise;
};
Run Code Online (Sandbox Code Playgroud)

Tom*_*nič 4

您必须将查询更改为此

MERGE ( s:Movie {attributes}.id)
ON CREATE SET s += {attributes}
ON MATCH SET s += {attributes} // optional
Run Code Online (Sandbox Code Playgroud)

这应该可以工作,但你应该使用 apoc.map.clean() 这样你就不会设置 id 两次,这可能会导致一些问题。

MERGE ( s:Movie {attributes}.id)
ON CREATE SET s += apoc.map.clean({attributes},['id'],[])
Run Code Online (Sandbox Code Playgroud)