我在 StackOverflow 上看到过相关问题,但我猜这个是不同的。
实际问题是:如何在现有 Node 之间建立相乘关系?
我得到了这个代码:
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})' +
下一个问题是:如何通过相同的参数匹配各个 Node id
但不是 <id>
,例如:
id
之间的区别和 <id>
就是第一个,是made做的自定义字段,第二个是native 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
& y
就在 Cypher 查询中?还是应该重写?
最佳答案
我想你在找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]}
)
关于javascript - 如何在现有 Node 之间创建/匹配多个关系? (通过相同的参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49267037/