Javascript 如何在现有节点之间创建/匹配多个关系?(按相同参数)

Javascript 如何在现有节点之间创建/匹配多个关系?(按相同参数),javascript,node.js,mongodb,neo4j,cypher,Javascript,Node.js,Mongodb,Neo4j,Cypher,我已经看到了有关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(fun

我已经看到了有关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:x,id:y,q:4}

id
两次,或
x
y
在密码查询中的正确位置?或者我应该重新写吗?

我想你在找

此外,要访问Neo4j管理的内部ID,您需要使用。这样,当前查询与内部ID不匹配,因为您没有使用
ID()
函数


编辑:

let x = [79, 43, 85];
for (let i = 0; i < x.length; i++)
session
        .run('MATCH(u:TEST { id: $id }), {id: x, q: 4})' +
在评论和其他回答中进行一些澄清后,符合所需行为的查询是:

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]}

好的,实际上总有另一种方法。在我的事业中,我将
用于
循环,这有助于我将
结果
MongoDB数组中的必要值导出到Neo4j,并创建一对一的乘法关系->

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);
        });
}
设x=[79,43,85];
设y=[59,44,36];
设q=[3,4,4];
for(设i=0;i(u)\n',{id_1:x[i],id_2:y[i],q:q[i]})
.然后(函数(结果){
result.records.forEach(函数(记录){
控制台日志(记录);
});
session.close();
})
.catch(函数(错误){
console.log(错误);
});
}
在这种特殊情况下,您可以使用
.map
设置贴图
或任何JS。
至于更多,这段代码的执行与Bruno Peres的回答之间仍然存在差异。

测试它。。。顺便说一句,我可以在
session.run()中自由使用任何密码查询,对吗?(所以没有必要从原来的密码改写)@AlexZeDim我想是的。但你为什么要考虑重写你的查询呢?这对我来说并不清楚。我在
Neo4j
方面没有我想要的那么多经验,我记得自己在学习
JS
的过程中,我需要为
promise
重写几乎所有的
callback
。因此,我仍然认为我在做一些错误的事情,
MATCH(u:TEST),其中$id中的u.id不能正常工作。而不是创建3个测试关系
'CREATE(m)-[r:TEST{Quantity:$q}]->(u)\n',{id:[79,65,87],q:4})
45之间→ 39, 65→ 39, 87 → 39,它在第一个(45)点和endpoint@AlexZeDim你可以阅读更多和更多。或者,您可以使用将UUID分配给图形中新创建的节点和关系,并确保没有人可以(意外或故意)更改或删除它们。考虑到所有数组的大小都相同(例如,
{ids1:[79,43,85],ids2:y[59,44,36],qs:[3,4,4]}
)您可以通过以下方式在单个查询中执行相同的工作,而无需使用
foreach
match(n1:TEST)其中$ids1中的n1.id匹配(n2:TEST)其中$ids2中的n2.id以collect(distinct n1)作为x,collect(distinct n2)作为y,$qs,range(0,size($qs)-1)作为索引以x[index]作为开始,以qs[index]作为数量,以y[index]作为结束创建(开始)-[:SHIET{Quantity:Quantity}]->(结束)
同样,
$ids1
$ids2
必须存在。这个查询有点复杂…你能把这个代码添加到上面的答案中吗?这将是非常有帮助的我和软件社区在未来。当然。补充。谢谢
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);
        });
}