我在StackOverflow上看到了相关的问题,但猜测这个问题是不同的。
实际问题是:如何创建现有节点之间的多重关系?
我收到了这段代码:
session
.run('MATCH(u:TEST { id: $id }) \n' +
'MATCH(m:TEST { id: 39}) \n' +
'CREATE(m)-[r:RELATIONSHIP {Quantity: $q}]->(u)\n', {id: 4, q: 4})
.then(function (result) {
result.records.forEach(function (record) {
console.log(record);
});
session.close();
})
.catch(function (error) {
console.log(error);
});
它的工作正常,但只有一种关系。它在这种情况下停止工作:
{id: [45, 65, 87], q: 4}
但没有任何错误,关系不会创建。
我通过以下代码解决了这个问题:
let x = [79, 43, 85];
for (let i = 0; i < x.length; i++)
session
.run('MATCH(u:TEST { id: $id }), {id: x, q: 4})' +
下一个问题是:如何使用相同的参数id
而不是<id>
匹配各种节点,例如:
id
和<id>
之间的区别在于,第一个是由make制作的自定义字段,第二个是本机Neo4j字段
(顺便说一句,正如您已经注意到我使用node.js
所以我可以通过此Cypher查询从我的自定义<id>
中的值替换原始id
字段:
'CREATE (a:TEST {id: $id, name: $name}) RETURN a'
let x = [79, 43, 85];
let y = [59, 77, 80];
for (let i = 0; i < x.length; i++)
session
.run('MATCH(u:TEST { id: $id }) \n' +
'MATCH(m:TEST { id: $id}) \n' + //I want to see array from y here
'CREATE(m)-[r:RELATIONSHIP {Quantity: $q}]->(u)\n', {id: x, q: 4})
我可以使用{id: x, id: y, q: 4}
id
两次,或x
&amp; Cypher查询中是y
吗?或者我应该重写它?
答案 0 :(得分:1)
我认为您正在寻找IN operator。
session.run('MATCH(u:TEST) WHERE u.id in $id \n' +
'MATCH(m:TEST { id: 39}) \n' +
'CREATE(m)-[r:RELATIONSHIP {Quantity: $q}]->(u)\n', {id: [45, 65, 87], q: 4})
另外,要访问由Neo4j管理的内部ID,您需要使用id()。这样,您的当前查询就不会与内部ID匹配,因为您没有使用id()
函数。
修改强>
在评论和其他答案中做出一些澄清后,符合所需行为的查询是:
match (n1:TEST) where n1.id in $ids1
match (n2:TEST) where n2.id in $ids2
with collect(distinct n1) as x, collect(distinct n2) as y, $qs, range(0,size($qs) - 1) as indexes
unwind indexes as index
with x[index] as start, qs[index] as quantity, y[index] as end
create (start)-[:SHIET {Quantity:quantity}]->(end)
考虑到所有数组都具有相同的大小(例如{ids1: [79, 43, 85], ids2:y[59, 44, 36], qs: [3, 4, 4]}
)
答案 1 :(得分:0)
好的,实际上总有另一种方式。在我的原因中,我使用了for
周期,这有助于我将必要的值从result
MongoDB 数组导出到 Neo4j 并创建乘以一对一的鬃毛-relationships->
:
let x = [79, 43, 85];
let y = [59, 44, 36];
let q = [3, 4, 4];
for (let i = 0; i < x.length; i++) {
session
.run('MATCH(u:TEST { id: $id_1 }) \n' +
'MATCH(m:TEST { id: $id_2}) \n' +
'CREATE(m)-[r:SHIET {Quantity: $q}]->(u)\n', {id_1: x[i], id_2:y[i], q: q[i]})
.then(function (result) {
result.records.forEach(function (record) {
console.log(record);
});
session.close();
})
.catch(function (error) {
console.log(error);
});
}
在这种特殊情况下,您可以使用.map
和set Maps
或任何JS。
至于更多,执行此代码和@Bruno Peres
回答之间仍然存在差异。