Javascript Neo4j驱动程序Json解析express api

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

这可能不是问题,但我忍不住觉得有更好的方法来实现我的目标

我正在用存储在neo4j数据库中的数据编写一个Express API。 我使用官方的neo4j驱动程序与本地运行的neo4j进行接口。当我运行查询时,例如:

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})

这是一个很好的解决方案。谢谢!