Javascript Neo4j驱动程序Json解析express api
这可能不是问题,但我忍不住觉得有更好的方法来实现我的目标 我正在用存储在neo4j数据库中的数据编写一个Express API。 我使用官方的neo4j驱动程序与本地运行的neo4j进行接口。当我运行查询时,例如:Javascript Neo4j驱动程序Json解析express api,javascript,node.js,neo4j,Javascript,Node.js,Neo4j,这可能不是问题,但我忍不住觉得有更好的方法来实现我的目标 我正在用存储在neo4j数据库中的数据编写一个Express API。 我使用官方的neo4j驱动程序与本地运行的neo4j进行接口。当我运行查询时,例如: session .run(`MATCH (foo:FamilyMember)-[:HAS_SISTER]->(sister:FamilyMember) WHERE foo.firstName = 'bar' RETURN sister.firstName
session
.run(`MATCH (foo:FamilyMember)-[:HAS_SISTER]->(sister:FamilyMember)
WHERE foo.firstName = 'bar'
RETURN sister.firstName AS Name, sister.lastName AS Surname
`)
.then(res => {
console.log(res);
})
Neo4j返回一个包含大量请求信息的响应对象:
{
records: [
Record {
keys: [Array],
length: 2,
_fields: [Array],
_fieldLookup: [Object]
},
Record {
keys: [Array],
length: 2,
_fields: [Array],
_fieldLookup: [Object]
},
Record {
keys: [Array],
length: 2,
_fields: [Array],
_fieldLookup: [Object]
},
Record {
keys: [Array],
length: 2,
_fields: [Array],
_fieldLookup: [Object]
}
],
summary: ResultSummary {
query: {
text: 'MATCH (foo:FamilyMember)-[:HAS_SISTER]->(sister:FamilyMember)\n' +
" WHERE foo.firstName = 'bar'\n" +
' RETURN sister.firstName AS Name, sister.lastName AS Surname\n' +
' ',
parameters: {}
},
queryType: 'r',
counters: QueryStatistics { _stats: [Object], _systemUpdates: 0 },
updateStatistics: QueryStatistics { _stats: [Object], _systemUpdates: 0 },
plan: false,
profile: false,
notifications: [],
server: ServerInfo {
address: 'localhost:7687',
version: 'Neo4j/4.2.1',
protocolVersion: 4.2
},
resultConsumedAfter: Integer { low: 0, high: 0 },
resultAvailableAfter: Integer { low: 4, high: 0 },
database: { name: 'neo4j' }
}
}
当我真正想要的是作为对象数组的实际响应数据,或者在出现故障时发出错误消息时,这是一种痛苦
我编写此解析方法是为了使用查询返回的数据生成Javascript对象数组:
function parseNeo4jResponseJSON(res) {
return results = res.records.reduce( (array, currentRecord) => {
const record = currentRecord.keys.reduce( (obj, key, index) => {
obj[key] = currentRecord._fields[index]
return obj
}, {})
array.push(record);
return array;
},[])
};
这是可行的,现在当我通过解析器控制台记录查询响应时,我会以我想要的格式获得它,例如:
[
{ Name: 'foo', Surname: 'bar' },
{ Name: 'foo2', Surname: 'bar2' },
...
]
这种方法会给我带来麻烦吗?有没有更好的方法从响应中获取javascript对象?我对neo4j很陌生。如果答案显而易见,则表示歉意。基于以下情况:
会话
.readTransaction((tx)=>
tx.run(`MATCH(foo:FamilyMember)-[:HAS\u SISTER]->(SISTER:FamilyMember)
其中foo.firstName='bar'
返回sister.firstName作为姓名,sister.lastName作为姓氏`)
)
.then(results=>results.records.map((record)=>{
返回{
Name:record.get('Name'),
姓氏:record.get('姓氏')
}
})
您可以保留session.run
,但是session.{read,write}Transaction
变量是因为它们在每个环境中都能工作(其中session.run
有时可能在集群环境中失败)
如果您的查询需要参数化,请确保使用参数字典(第二个参数是tx.run
),而不是使用字符串插值。如果foo.firstName
的值来自一个变量(比如someFirstName
),则tx.run
将变成:
tx.run(“匹配(foo:FamilyMember)-[:HAS\u SISTER]->(SISTER:familymber)
其中foo.firstName=$firstName
返回sister.firstName作为姓名,sister.lastName作为姓氏“,
{firstName:someFirstName})
这是一个很好的解决方案。谢谢!