当前位置: 首页 > 知识库问答 >
问题:

neo4j graphql js:使用@cypher满足类型,而不返回具体节点

晋越彬
2023-03-14

我通常希望创建一个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注释来满足单个字段,这不适合这种情况。这个问题是关于满足整个结果类型。

如果答案需要在解析器数组中使用自定义处理程序,只要我可以在单个查询中收集满足该类型所需的数据,就可以了。或者,如果这是不可能的,那也是有用的信息。

共有1个答案

冯泓
2023-03-14

问题是,根据Person定义,查询输出中必须有一个对象。所以试试这个查询

WITH [["foo", 42], ["bar", 43]] AS x UNWIND x AS y
RETURN { name: y[0], age: y[1] } as Person
 类似资料:
  • 问题内容: 我正在玩Go,发现一个我无法解决的问题。假设我有如下代码: 我导入了软件包并开始使用它: 我真的很喜欢我的助手“运行”,但是我想使其更加慷慨:我不希望人们总是向我传递MySQL客户端。可以是具有“ RunQuery”和“ Result”方法的任何东西。所以我尝试使用接口: 可悲的是,这不再编译了。我收到此错误: Go不支持此功能吗,或者我做错了什么? 问题答案: 应该返回接口,否则你总

  • 问题内容: 在Kubernetes代码中,该函数具有以下两种类型的结果列表: 该函数的最后一行是: 进口: 我通过在该import语句上运行而得到,对象在中定义: (并且我在这里在网上找到了相同的代码。) 地址运算符会创建一个指针…更具体地说,Go规范指出: 对于类型T的操作数x,地址操作&x生成指向 T的类型 T的指针。 和指针的类型不同于其基本类型: 指针类型表示指向给定类型的变量的所有指针的

  • 希望我不会把事情搞复杂。我编写了以下SQL,返回用户他们最近的事务满足一个条件(TRANS_TYPE NOT IN(4,6,21,23)或DESTORIT_OPTION&64<>64)。 我通过使用 前面代码中的sub查询将返回所有用户的所有事务,并按DESC顺序对其进行排序,外部SELECT将通过检查rank 1事务来显示满足条件的用户。 我想要的是像这样的东西 FOREACH user如果用户

  • 我想基于泛型值返回不同的类型。例如: 但我有一个错误: 类型字符串[]不能分配给类型T扩展Base?String[]:字符串

  • 问题内容: 如果我将ABC和CDE类定义为A,B,C,D,E类的交集,如下所示: 如何查询SPARQL中给定的一组输入类满足其限制的所有交叉点类?例如,如果我将A,B,C,D,E,F,G输入到此查询中,那么我希望可以返回 还有两个皱纹:如果我查询A,Z,C,其中Z是B的等价类,那么这应该匹配并理想地返回 其次,结果应仅返回最大匹配项;因此,如果存在一个类ABCD,并且我在A,B,C,D中进行查询,