使用nodejs的Neo4j查询

时间:2018-08-17 14:39:31

标签: node.js neo4j cypher

我有一个1000个密码(neo4j)查询数组(以字符串形式)。

当我在会话中遍历此数组(对于循环,各个值)时,所有查询都按顺序进行。 尽管我也收到了1000个结果,但是订单的结果却改变了。

如何同步它们,以便按顺序获得结果,就像数组中的查询一样?

...............................................

例如a = [t1,t2,t3,t4 ...]

密码的结果可以是任意顺序,例如t2,t1,t4,t3

我希望结果以相同的t1,t2,t3,t4方式

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

returned values will be in order of the Promises passed起,您可以使用Promise.all函数:

var cyphers = [
    `MATCH (a) RETURN count(a) AS nodesCount`,
    `MATCH ()-[r]->() RETURN count(r) AS relsCount`
]

var session = driver.session()

var queries = []
cyphers.forEach(function(cypher) {
    queries.push(session.run(cypher))
})

Promise.all(queries).then(function(results) {
    results.forEach(function (result) {
        console.log(result)
    })
    session.close()
    driver.close()
})

答案 1 :(得分:1)

您是否要存储数据,并且所有密码都使用相同的attrib和props执行相同的操作? 如果是,那么为什么不使用unwind功能,该工作将在一个密码中完成,而在一个电话中也将完成。返回数据将按照您想要的顺序进行。即使有不同类型的密码,将它们分组并使用展开,这也会导致较少的会话(几乎1)以及连接,从而导致性能提高,与执行一个密码相比,产生的时间也更少一次。

经历this post,因为它肯定会对您有所帮助。

如果您不存储数据,则可以使用promise.node.js概念,也可以创建如下编码结构:

let cypher_array=[{cypher:'you cypher',param:'param'}]
let counter = 0;
function execute_cypher(counter) {
    if (counter < cypher_array.length) {
        session
        .run(cypher_array[counter].cypher, cypher_array[counter].param)
        .then(function (result) {
            //you logic here


            counter++;
            if(counter < cypher_array.length){
                execute_cypher(counter)
            }
        })
        .catch(function (error) {
            if(counter < cypher_array.length){
                execute_cypher(counter)
            }
            //comment the above code if you do not want to continue when error is occurred
        })
    }else{
        console.log('completed!');
        session.close();
        driver.close();
    }
}

execute_cypher(0)

注意:我不鼓励使用上面的代码,因为我知道它的缺点。它仅出于示例目的。正如@ stdob--展示了如何使用Promise进行操作,我仅举了一个以不同方式进行操作的示例,该示例在我刚接触Node.js和neo4j时就用过。 现在,根据我的经验,我建议将Neo4j:Cypher-UNWIND 用作最佳实践