我正在通过解析器运行GraphQ1突变。它针对Neo4j数据库。查询工作正常,但是我无法以将结果显示回结果的方式来构造结果。我尝试了几种不同的结果和记录映射组合,但是无法获得返回结果集的属性以显示在输出中。
具体来说,您将在以下示例中看到响应(通过GraphiQL)中的name字段(当我希望将其设置为返回的值时)为空。
解析器:
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]
}
答案 0 :(得分: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();
})
而且