我正在向我的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;
};
答案 0 :(得分:4)
您必须将查询更改为此
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'],[])
答案 1 :(得分:3)
您可以使用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和上面的查询我们可以实现