我在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/

10-12 03:29
查看更多