0

我正在通过解析器运行 GraphQl 突变。它针对 Neo4j 数据库。查询工作正常,但我无法以将结果显示在结果中的方式构造结果。我尝试了几种不同的结果和记录映射组合,但我无法让返回的结果集的属性显示在输出中。

具体来说,您将在下面的示例中看到,响应中的 name 字段(通过 GraphiQL)为 null,而我希望它被设置为返回的值。

解析器:

 AddIdiomHasChildIdiom(object, params, ctx, resolveInfo) {
      //************************************************************************************************************************************
      //** Author:        MOS
      //** Date:          22/07/2019
      //** Description:   Add a child Idiom         
      //************************************************************************************************************************************

      //Build the cypher query across multiple lines so that we can adjust the query depending on which parameters are passed
      let query = new StringBuilder();

      query.appendLine("MATCH (p:entity:Idiom {id:'" + params.from.id + "'}), (c:entity:Idiom {id:'" + params.to.id + "'})")
      query.appendLine("MERGE (p)-[r:HAS_CHILD_IDIOM]->(c)")
      query.appendLine("RETURN p,c")

      console.log(query)
      //Execute the query and send the results back to the user
      return ctx.driver.session().run(query.toString(), {props:params})
        .then(result => {
          return {
            from: result.records.map(record => { return record.get("p").properties}),
            to: result.records.map(record => { return record.get("c").properties})
          }  
          }) 
        .catch(error => {
          //ToDo: Error handling code need to go here
        })
    }

GraphQL 查询

mutation{
  AddIdiomHasChildIdiom(from:{id:"d94676b0-ac6c-11e9-a7a1-edf120d553ac"},to:{id:"e730a720-ac74-11e9-a45f-df629a6df5e1"})
  {
    from{
      name
    }
    to{
      name
    }
  }
}

输出:

{
  "data": {
    "AddIdiomHasChildIdiom": {
      "from": {
        "name": null
      },
      "to": {
        "name": null
      }
    }
  }
}

相关架构部分

type Mutation{
  AddIdiomHasChildIdiom(
    from: _IdiomInput!
    to: _IdiomInput!
  ): _AddIdiomHasChildIdiomPayload
}

type _AddIdiomHasChildIdiomPayload {
  from: Idiom
  to: Idiom
}
input _IdiomInput {
  id: ID!
}

type _AddIdiomHasChildIdiomPayload {
  from: Idiom
  to: Idiom
}
type Idiom {
    id: ID
    name: String 
    type: IdiomType
    description: String
    lifecycle: IdiomLifecycle
    quality: Float
    numStates: Int
    numChildIdioms: Int
    hasChildIdiom: [Idiom]
    first: Int
    offset: Int
    orderBy: [_IdiomOrdering]
}
4

1 回答 1

0

您的代码中的问题是您的 graphql 模式和解析器的实现之间的类型不匹配。

您的突变查询应返回:

type _AddIdiomHasChildIdiomPayload {
  from: Idiom
  to: Idiom
}

你的解析器返回这个:

return {
  from: result.records.map(record => { return record.get("p").properties}),
  to: result.records.map(record => { return record.get("c").properties})
}

这里你使用了一个map函数,它的结果是一个数组。所以你正在返回类似的东西:

{
  from : [ { id:'', name:'', ... } ]
  to : [ { id:'', name:'', ... } ]
}

并且[ { id:'', name:'', ... } ]不验证Idiom您的模式的类型,它是一个数组 : Idiom[]

因此,您需要更改解析器以仅返回from&的一个元素to

而且,您的实现很奇怪:由于使用了两张地图,您正在对 Neo4j 的结果进行两次循环,并且您没有关闭会话。

你应该尝试这样的事情:

const session = ctx.driver.session();
return session.run(query.toString(), {props:params})
  .then(result => {
    return result.records.map(record => {
      return {
        from:record.get("p").properties
        to:record.get("c").properties
      }
    })[0]
  })
  .catch(error => {
      //ToDo: Error handling code need to go here
  })
  .finally(() => {
    session.close();
  })

而且

于 2019-07-25T08:40:42.707 回答