创建neo4j和nodejs的重复节点
问题描述:
我有JSON数据,通过它我使用https://github.com/thingdom/node-neo4j连接器创建节点和节点之间的关系。创建neo4j和nodejs的重复节点
我有以下JSON格式
{
att0:"abcd",
att1:"val1",
att2:"val2",
att3:"val3",
att4:"val4",
att5:"val5",
att6:"val6",
att7:"val7",
att8:"val8"
} .... more like this around 1000
Here att0+att1 gives me unique id after md5 hash (let it be UID1) .
and att4 gives me unique id after md5 hash (let it be UID2).
and att7 gives me unique id after md5 hash (let it be UID3).
我创建下列属性的两个节点的:
Node 1 :
{
id: UID1 ,
att3:"val3"
}
Node 2 :
{
id:UID2,
att5:"val5",
att6:"val6"
}
Relationship from Node 1 --> Node 2 :
{
id:UID3,
att5:"val8"
}
以下是我的数据插入查询:
for(i=0; i<1000; i++){ // 1000 objects in json
// create UID1,UID2 and UID3 based on above info for each object
// and create query string as mentioned below
query_string = MERGE (n:nodes_type1 {id:'UID1'})
ON CREATE SET n={ id:'UID1', att3:'val3'},n.count=1
ON MATCH SET n.count = n.count +1
MERGE (m:nodes_type2 {id:'UID2'})
ON CREATE SET m={ id:'UID2', att5:'val5', att6:'val6'},m.count=1
ON MATCH SET m.count = m.count +1
MERGE (n)-[x:relation_type {id:'UID3'} ]->(m)
ON CREATE SET x={ att8:'val8', id:'UID3' },x.count=1
ON MATCH SET x.count = x.count +1 return n
db.query(query_string, params, function (err, results) {
if (err) {
console.log(err);
throw err;
}
console.log("Node Created !!! "+ event_val)
});
}
首先我清了neo4j数据库使用以下外部查询(使用neo4j数据库UI): 现在的问题是当我查询MATCH(n:nodes_type2)返回COUNT(n)。由于json中有1000个对象,因此它应该创建1000个节点。但是结果会超过1000(约9000),并且每次清除数据并重新启动脚本时都会不断变化。当我在结果中看到有相同UID的多个节点时。不应该合并查询handel节点匹配和增量计数器。合并是递增计数器,但在一些数字之后,新节点用相同的UID创建。
答
我assue您查询大规模并行执行,
确保有一个独特的约束已安装: nodes_type1(id)
和nodes_type2(id)
否则MERGE不能保证唯一性。
你也应该改变你的查询中使用参数,而不是文字值
而且它也应该是这样的:
MERGE (n:nodes_type1 {id:{id1}})
ON CREATE SET n.att3={att3},n.count=1
ON MATCH SET n.count = n.count +1
MERGE (m:nodes_type2 {id:{id2}})
ON CREATE SET m.att5={att5}, m.att6={att6},m.count=1
ON MATCH SET m.count = m.count +1
MERGE (n)-[x:relation_type {id:{id3}} ]->(m)
ON CREATE SET x.att8={att8},x.count=1
ON MATCH SET x.count = x.count+1
return n,r,m
我不认为ID和柜台上的关系在实际使用情况下有意义,但对于您的测试可能是好的
答
基于你给出的查询,我承担UUID产生看起来是在每次循环不同:
1000环,3个查询3个不同的节点标签。
你能数不同的UUID您从数据库中获取,如:
MATCH (n) RETURN count(DISTINCT n.id)
我在小数据集上运行查询我得到3个uids,但是当我做n.count = n.count + 1时count数字不匹配。例如Uid1“n.count”的值应该是30,但它的值为24,当我清除数据库并重新启动服务器并再次运行脚本时,它的值为27。每次我遵循这个过程,不同的数字都会小于30。有时候还会有30次,但并不持久。我认为有些n.count = n.count + 1错过了。与UID2和UID3相同的情况。我无法调试导致此计数跳过的原因。 – user1276171 2014-11-05 10:57:01
通过回顾您的问题,您为什么这样做? ON CREATE SET n = {id:'UID1',att3:'val3'}我认为你应该做SET n.id ='UID1',n.att3 ='val3',n.count = n.count + 1 – 2014-11-05 15:15:21
因为=> LockClient [482] user1276171 2014-11-06 09:31:25