问题描述
通常,我想创建一个GraphQL类型来表示跨越一个以上节点的Cypher查询的结果。在这种情况下,我无法从@cypher
返回具体节点,因为不存在这样的节点。我试图从顶级@cypher
查询中返回适当命名的字段,但是这种方法不起作用。
import { makeAugmentedSchema,neo4jgraphql } from 'neo4j-graphql-js';
import { ApolloServer } from 'apollo-server';
import neo4j from 'neo4j-driver';
const typeDefs = `
type Person {
name: String
age: Int
}
type Query {
persons: [Person] @cypher(
statement: """
WITH [["foo",42],["bar",43]] AS x UNWIND x AS y
RETURN y[0] AS name,y[1] AS age
"""
)
}
`;
const driver = neo4j.driver(
'bolt://localhost:7687',neo4j.auth.basic('neo4j','password')
);
const resolvers = {
};
const schema = makeAugmentedSchema({ typeDefs,resolvers });
const server = new ApolloServer(
{
schema,resolvers,context: {driver}
}
)
server.listen(4000,'0.0.0.0').then(({ url }) => {
console.log(`GraphQL API ready at ${url}`);
});
查询:
{
persons {
name
age
}
}
产生错误:
{
"errors": [
{
"message": "String(\"foo\") (of class org.neo4j.values.storable.StringWrappingStringValue)","locations": [
{
"line": 2,"column": 3
}
],"path": [
"persons"
],"extensions": {
"code": "INTERNAL_SERVER_ERROR","exception": {
"code": "Neo.DatabaseError.General.UnkNownError","name": "Neo4jError","stacktrace": [
"Neo4jError: String(\"foo\") (of class org.neo4j.values.storable.StringWrappingStringValue)",""," at captureStacktrace (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/neo4j-driver/lib/result.js:277:15)"," at new Result (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/neo4j-driver/lib/result.js:68:19)"," at newCompletedResult (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/neo4j-driver/lib/transaction.js:449:10)"," at Object.run (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/neo4j-driver/lib/transaction.js:287:14)"," at Transaction.run (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/neo4j-driver/lib/transaction.js:123:32)"," at _callee2$ (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/neo4j-graphql-js/dist/index.js:222:35)"," at tryCatch (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/regenerator-runtime/runtime.js:63:40)"," at Generator.invoke [as _invoke] (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/regenerator-runtime/runtime.js:293:22)"," at Generator.next (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/regenerator-runtime/runtime.js:118:21)"," at asyncGeneratorStep (/home/amoe/dev/neo4j-graphql-js-return-aggregate-type/node_modules/@babel/runtime-corejs2/helpers/asyncToGenerator.js:5:24)"
]
}
}
}
],"data": {
"persons": null
}
}
我知道我可以使用每个字段@cypher
的注释来满足各个字段的要求,这不适用于这种情况。这个问题是关于满足整个结果类型的。
如果答案需要在resolvers
数组中使用自定义处理程序,那也可以,只要我可以在单个查询中收集满足该类型所需的数据即可。或者,如果这不可能,那也将是有用的信息。
解决方法
问题是,根据Person
定义,查询输出处必须有一个对象。所以尝试这个查询
WITH [["foo",42],["bar",43]] AS x UNWIND x AS y
RETURN { name: y[0],age: y[1] } as Person