微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Javascript Neo4j 驱动程序 Json 解析 express api

如何解决Javascript Neo4j 驱动程序 Json 解析 express api

这可能不是问题,但我不禁觉得有更好的方法来完成我想要实现的目标。

我正在用 Express 编写 API,我的数据存储在 neo4j 数据库中。 我正在使用官方的 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],_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],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,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很陌生。如果答案显而易见,我们深表歉意。

解决方法

基于 existing examples,关于:

session
    .readTransaction((tx) => 
       tx.run(`MATCH (foo:FamilyMember)-[:HAS_SISTER]->(sister:FamilyMember)
               WHERE foo.firstName = 'bar'
               RETURN sister.firstName AS Name,sister.lastName AS Surname`)
    )
    .then(results => results.records.map((record) => {
       return {
              Name: record.get('Name'),Surname: record.get('Surname')
       }
    })

您可以保留 session.run,但 session.{read,write}Transaction 变体是 usually recommended,因为它们适用于所有环境(其中 session.run 在集群环境中有时可能会失败)。>

如果您的查询需要参数化,请确保使用参数字典(tx.run 的第二个参数)而不是使用字符串插值。如果 foo.firstName 的值来自一个变量(比方说 someFirstName),则 tx.run 将变成:

tx.run("MATCH (foo:FamilyMember)-[:HAS_SISTER]->(sister:FamilyMember)
               WHERE foo.firstName = $firstName
               RETURN sister.firstName AS Name,sister.lastName AS Surname",{firstName: someFirstName})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。