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

时间:2018-03-13 22:43:24

标签: 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(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吗?或者我应该重写它?

2 个答案:

答案 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);
        });
}

在这种特殊情况下,您可以使用.mapset Maps或任何JS。 至于更多,执行此代码和@Bruno Peres回答之间仍然存在差异。