大佬教程收集整理的这篇文章主要介绍了node.js – 这是用Neo4j编写多语句事务的正确方法吗?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
对于多语句事务和neo4j驱动程序,这看起来是最佳实践吗?
const register = async (container,user) => { const session = driver.session() const timestamp = Date.Now() const saltRounds = 10 const pwd = await utils.bcrypt.hash(user.password,saltRounds) try { //Start registration transaction const registerUser = session.writetransaction(async (transaction) => { const initialCommit = await transaction .run(` CREATE (p:Person { email: '${user.email}',tel: '${user.tel}',pwd: '${pwD}',created: '${timestamp}' }) RETURN p AS Person `) const initialResult = initialCommit.records .map((X) => { return { id: x.get('Person').identity.low,created: x.get('Person').properties.created } }) .shift() //Generate serial const data = `${initialResult.iD}${initialResult.createD}` const serial = crypto.sha256(data) const finalCommit = await transaction .run(` MATCH (p:Person) WHERE p.email = '${user.email}' SET p.serialnumber = '${serial}' RETURN p AS Person `) const finalResult = finalCommit.records .map((X) => { return { serialnumber: x.get('Person').properties.serialnumber,email: x.get('Person').properties.email,tel: x.get('Person').properties.tel } }) .shift() //Merge both results for complete person data return Object.assign({},initialResult,finalResult) }) //Commit or rollBACk transaction return registerUser .then((commit) => { session.close() return commit }) .catch((rollBACk) => { console.log(`transaction problem: ${JSON.Stringify(rollBACk,null,2)}`) throw [`reg1`] }) } catch (error) { session.close() throw error } }
const register = (user) => { const session = driver.session() const performtransaction = session.writetransaction(async (tX) => { const statementOne = await tx.run(queryOnE) const resultOne = statementOne.records.map((X) => x.get('node')).slice() // Do some work that uses data from statementOne const statementTwo = await tx.run(queryTwo) const resultTwo = statementTwo.records.map((X) => x.get('node')).slice() // Do final processing return finalResult }) return performtransaction.then((commit) => { session.close() return commit }).catch((rollBACk) => { throw rollBACk }) }
Neo4j专家,是上面的代码正确使用Neo4j-driver?
const register = (user) => { const session = driver.session() const tx = session.begintransaction() const statementOne = await tx.run(queryOnE) const resultOne = statementOne.records.map((X) => x.get('node')).slice() // Do some work that uses data from statementOne const statementTwo = await tx.run(queryTwo) const resultTwo = statementTwo.records.map((X) => x.get('node')).slice() // Do final processing const finalResult = { obj1,...obj2 } let success = true if (success) { tx.commit() session.close() return finalResult } else { tx.rollBACk() session.close() return false } }
>开始会话
>开始交易
>之后使用try / catch块(在catch块中启用适当的范围)
>在try块中执行查询
>在catch块中回滚
.
const someQuery = async () => { const session = Neo4J.session() const tx = session.begintransaction() try { const props = { one: 'Bob',two: 'Alice' } const tx1 = await tx .run(` MATCH (n:NodE)-[r:rEL]-(o:Other) WHERE n.one = $props.one AND n.two = $props.two RETURN n AS One,o AS Two `,{ props }) .then((result) => { return { data: '...' } }) .catch((err) => { throw 'Problem in first query. ' + e }) // Do some work using tx1 const updatedProps = { _id: 3,four: 'excellent' } const tx2 = await tx .run(` MATCH (n:NodE) WHERE id(n) = toInteger($updatedProps._id) SET n.four = $updatedProps.four RETURN n AS One,{ updatedProps }) .then((result) => { return { data: '...' } }) .catch((err) => { throw 'Problem in second query. ' + e }) // Do some work using tx2 if (problem) throw 'RollBACk ASAP.' await tx.commit session.close() return Object.assign({},tx1,{ tx2 }) } catch (E) { tx.rollBACk() session.close() throw 'someQuery# ' + e } }
我要注意的是,如果要将数字传递给Neo4j,则应使用toInteger()将它们包含在Cypher查询中,以便正确解析它们.
我还包括了查询参数的示例以及如何使用它们.我发现它清理了一些代码.
除此之外,您基本上可以根据需要在事务中链接尽可能多的查询,但请记住两件事:
> Neo4j在事务期间对所有涉及的节点进行写锁定,因此如果您有多个进程都在同一节点上执行操作,您将看到一次只有一个进程可以完成一个事务.我们制定了自己的业务逻辑来处理写入问题,并选择甚至不使用事务.到目前为止,它运行良好,编写100,000个节点,并在大约30秒内创建100,000个关系,分布在10个进程中.在交易中花了10倍的时间.我们使用UNWIND没有遇到死锁或竞争条件.
>您必须等待tx.commit(),否则它将在核对会话之前提交.
我的观点是,如果您使用Polyglot(多个数据库)并且需要创建节点,然后将文档写入MongoDB然后在节点上设置Mongo ID,则此类事务会很有效.
它很容易推理,并根据需要进行扩展.
以上是大佬教程为你收集整理的node.js – 这是用Neo4j编写多语句事务的正确方法吗?全部内容,希望文章能够帮你解决node.js – 这是用Neo4j编写多语句事务的正确方法吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。