我对图形数据库生态系统非常陌生,首先我正在试验neo4j。我非常想使用node和neo4j。因此,经过快速搜索,我找到了JavaScript官方支持的驱动程序neo4j-driver,并提供了一个示例:
const neo4j = require('neo4j-driver')
const driver = neo4j.driver(uri, neo4j.auth.basic(user, password))
const session = driver.session()
const personName = 'Alice'
try {
const result = await session.run(
'CREATE (a:Person {name: $name}) RETURN a',
{ name: personName }
)
const singleRecord = result.records[0]
const node = singleRecord.get(0)
console.log(node.properties.name)
} finally {
await session.close()
}
// on application exit:
await driver.close()现在,当我运行这段代码时,我立即得到以下错误:
SyntaxError: await is only valid in async function现在我想我已经理解了这个错误,我必须用匿名异步函数包装try-catch块来消除这个错误。修改后的代码体为:
const config = {
"neo4j": {
"url": "neo4j://localhost",
"authUser": "neo4j",
"authKey": "adminPassword"
}
}
const neo4j = require("neo4j-driver");
const driver = neo4j.driver(
config.neo4j.url,
neo4j.auth.basic(config.neo4j.authUser, config.neo4j.authKey)
);
const session = driver.session();
(async () => {
try {
const result = await session.run('CREATE (a:Person {name: $name}) RETURN a', { name: 'Alice' });
const singleRecord = result.records[0];
const node = singleRecord.get(0);
console.log(node.properties.name);
} catch (error) {
console.log("Error Body: ", error);
} finally {
await session.close();
}
})();
await driver.close();但令我沮丧的是,我遇到了另一个非常隐秘的错误:
{ Neo4jError: Could not perform discovery. No routing servers available. Known routing table: RoutingTable[database=Sample database, expirationTime=0, currentTime=1592397056399, routers=[], readers=[], writers=[]]
at captureStacktrace (/Users/pc/node_modules/neo4j-driver/lib/result.js:263:15)
at new Result (/Users/pc/node_modules/neo4j-driver/lib/result.js:68:19)
at Session._run (/Users/pc/node_modules/neo4j-driver/lib/session.js:174:14)
at Session.run (/Users/pc/node_modules/neo4j-driver/lib/session.js:135:19)
at /Users/pc/neoNode.js:20:38
at Object.<anonymous> (/Users/pc/neoNode.js:31:3)
at Module._compile (module.js:653:30)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12) code: 'ServiceUnavailable', name: 'Neo4jError' }发布于 2020-07-16 07:28:46
我在这方面也有一些问题。
首先,Natam Oliveira是正确的。您需要使用bolt协议,并且await promises需要在async函数中。由于某些原因,文档中的一些示例中使用了neo4j协议。此外,Neo4j目前提供的两个示例-在driver-manual和javascript-driver部分-似乎都会导致错误,如果您在某种未指定的环境之外使用它们的话。
不过,在npmjs页面上有一些线索,所以通过将它们放入现有代码中,我至少能够输出一些数据。不过,我也想知道如何在async函数中实现这一点,所以如果能解释一下如何在这个驱动程序中工作,那将是非常受欢迎的。
以下是对我有效的方法:
const neo4j = require('neo4j-driver')
const cnx = {
user: 'neo4j',
password: 'some passphrase',
uri: 'bolt://localhost:7687'
}
const driver = neo4j.driver(cnx.uri, neo4j.auth.basic(cnx.user, cnx.password))
driver.verifyConnectivity()
.then((cnxMsg) => {
console.log(cnxMsg)
})
const session = driver.session({ database: 'neo4j' })
session.run('MATCH (n:Movie) RETURN n LIMIT 5')
.subscribe({
onKeys: keys => {
console.log(keys)
},
onNext: record => {
console.log(record.get('n').properties.title)
},
onCompleted: () => {
session.close()
},
onError: error => {
console.error(error)
}
})这将使用NPM文档中看到的流API输出一些电影。(注意:只有在启动/安装了电影数据库的情况下,它才能工作,所以请仔细检查您没有删除它,因为它的删除也是Neo4j教程的一部分。)现在只需将MATCH Cypher查询更改为您喜欢的任何内容,并处理输出,例如通过管道将其传递给Express。
资料来源:
发布于 2020-06-22 20:55:35
首先,我认为你的网址应该是"url": "bolt://localhost:7687",并且你仍然使用异步函数之外的await driver.close()
如果你开始使用neo4j,寻找一个对象图模型(Object Graph Model)来帮助你。
https://stackoverflow.com/questions/62429196
复制相似问题