我有一个1000个密码(neo4j)查询数组(以字符串形式)。
当我在会话中遍历此数组(对于循环,各个值)时,所有查询都按顺序进行。 尽管我也收到了1000个结果,但是订单的结果却改变了。
如何同步它们,以便按顺序获得结果,就像数组中的查询一样?
...............................................
例如a = [t1,t2,t3,t4 ...]
密码的结果可以是任意顺序,例如t2,t1,t4,t3
我希望结果以相同的t1,t2,t3,t4方式
有什么建议吗?
答案 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 用作最佳实践。