我在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>
的区别在于,第一个是由made制作的自定义字段,第二个是本机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
在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/