问题描述
我在A
文件中定义了B
和schema.graphql
的类型定义。这些解析器是自动生成的,并且可以很好地工作(在其他地方)。
要创建一种评分机制,以将具有标签B的节点相对于具有标签A的节点进行排名,我正在编写一个Customresolver
查询,该查询执行密码查询并返回bs的集合和定义的计算分数scoredBs
类型。
schema.graphql
文件如下所示。
type Query {
Customresolver(idA: ID!,idsB: [ID!]!): [scoredBs]
}
type A {
id: ID! @id
# and some more stuff of course
}
type B {
id: ID! @id
# more fields that use the @relation or @cypher decorator
}
type scoredBs {
bs: [B]
score: Float
}
这是定义自定义解析器的地方:
const resolvers = {
Query: {
Customresolver: async (
parent,{ idA,idsB },context,info
) => {
const cypher = `
MATCH (a:A {id: $idA})
MATCH (a)<--(b:B) WHERE b.id IN $idsB
WITH
b
RETURN disTINCT collect(b) AS bs,rand() AS score
ORDER BY score DESC
`
const session = context.driver.session()
const results = await session
.run(cypher,idsB })
.then((result) => {
return result.records.map((record) => {
return {
bs: record.get('bs'),score: record.get('score')?.low || null,}
})
})
.catch(console.log)
.then((results) => {
session.close()
return results
})
return results
},},}
当我在apollo服务器graphql操场上运行查询时,我收到一个错误:
“ message”:“未定义的“ B.id”解析函数返回”,
query {
Customresolver(
idA:"2560886f-654b-4047-8d7a-386cd7d9f670",idsB: ["01ec8367-a8ae-4600-9f88-ec141b2cae2c","032f9a88-98c3-4968-8388-659ae26d63b3"]
) {
bs {
id
}
score
}
}
解决方法
我通过重写部分代码来解决了这个问题:
const results = await session
.run(cypher,{ idA,idsB })
.then((result) => {
return result.records.map((record) => {
// diff start
const obj = record.toObject()
const bs = obj.bs.map((b) => b.properties)
return {
bs,// diff end
score: record.get('score')?.low || null,}
})
})
.catch(console.log)
.then((results) => {
session.close()
console.log(results)
return results
})
return results