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



我将迭代数据添加到我的neo4j数据库中,但是我坚持如何覆盖或更新现有数据,并检查其中数据是否尚不存在。

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

[
  {id: 'gameofthrones', genre: 'fantasy', release: '2017'},
  {id: 'inception', genre: 'scifi', release: '2010'},
  ...
]

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

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

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

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

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

// data
attributes['id']         = 'gameofthrones';
attributes['genre']     = 'fantasy';
...
// query
MERGE ( s:Movie {attributes}.id)
ON CREATE SET ( s:Movie {attributes} )

我在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;
};

您必须将查询更改为此

MERGE ( s:Movie {attributes}.id)
ON CREATE SET s += {attributes}
ON MATCH SET s += {attributes} // optional

这应该起作用,但是您应该使用apoc.map.clean(),这样您就不会设置两次ID,这可能会导致一些问题。

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

您可以使用MERGE子句如下实现此目标

MERGE (m1:Movie {id: 'gameofthrones'})
ON CREATE SET m1.genre = 'fantasy', m1.release = '2017'
MERGE (m2:Movie {id: 'inception'})
ON CREATE SET m2.genre: 'scifi', m2.release = '2010' 

理想情况下,您想用参数而不是文字字符串创建查询。如果您用户用户apoc.load.json

可以实现此目标
with "file:///home/sample.json" as url // can be also http://url/sample.json
CALL apoc.load.json(url) yield value
UNWIND value as item
MERGE (m1:Movie {id: item.id})
ON CREATE SET m1.genre = item.genre, m1.release = item.release

具有APOC函数的动态属性的示例:

with "file:///home/sample.json" as url // can be also http://url/sample.json
CALL apoc.load.json(url) yield value
UNWIND value as item
MERGE (m1:Movie {id: item.id})
ON CREATE SET m1 += apoc.map.clean(item,['id'],[])

,或者如果没有APOC插件:

with "file:///home/sample.json" as url // can be also http://url/sample.json
CALL apoc.load.json(url) yield value
UNWIND value as item
MERGE (m1:Movie {id: item.id})
ON CREATE SET m1 += item

请注意,ID将首先合并并随后与ON CREATE SET更新,您想避免使用APOC和上方查询两次编写单个属性,我们可以实现

最新更新