0

我想测试通过从“neo4j-graphql-js”调用 makeAugmentedSchema 创建的自动生成的 CRUD 突变。创建节点没有问题,但创建关系对我不起作用。请告知我在这里做错了什么。

架构:

type Bio{
    id: ID!
    description: String
}

type Person{
    id: ID!
    name: String
    dob: Date
    gender: String
    bioRelation: [Bio] @relation(name: "HAS_BIO", direction: "OUT")
}

突变:我遵循接口突变指南https://grandstack.io/docs/graphql-interface-union-types来创建突变。

mutation {
    p: CreatePerson(
        name: "Anton",
        gender: "Male") {
    name
    gender
    id
  }
    b: CreateBio(
        description: "I am a developer") {
    description
        id
  }
  r: AddPersonBioRelation(
    from: {id: "p"},
    to:{id: "b"}
  ){
    from{
      name
    }
    to{
      description
    }
  }
}

它创建 Person 和 Bio 节点,但两者之间没有创建任何关系:

{
  "data": {
    "p": {
      "name": "Anton",
      "gender": "Male",
      "id": "586b63fd-f9a5-4274-890f-26ba567c065c"
    },
    "b": {
      "description": "I am a developer",
      "id": "a46b4c22-d23b-4630-ac84-9d6248bdda89"
    },
    "r": null
  }
}

这是 AddPersonBioRelation 的样子: 在此处输入图像描述

谢谢你。

4

2 回答 2

1

我是 GRANDstack 的新手,我自己也一直在努力解决这些类型的问题。我通常将其分解为单独的突变(在 javascript 中),并将每个突变的返回值用作下一个突变的值。例如:

await createIncident({
  variables: {
    brief: values.brief,
    date,
    description: values.description,
    recordable: values.recordable,
    title: values.title
  }
}).then((res) => {
  addIncidentUser({
    variables: {
      from: user.id,
      to: res.data.CreateIncident.id
    }
  });
});

我在您提供的示例中看到的问题是,您将 from 和 to 的字符串值分别指定为“p”和“b”,而不是父突变的 p.id 和 b.id 返回值。

我可以指出这一点,但我一生都无法弄清楚如何在突变本身中正确引用 p.id 和 b.id 。换句话说,您正在尝试发送

from: { id: "586b63fd-f9a5-4274-890f-26ba567c065c"}
to: { id: "a46b4c22-d23b-4630-ac84-9d6248bdda89" } 

但实际上你正在发送

from: { id: "p"}
to: { id: "b" } 

这实际上不是 neo4j 中的引用,因此它失败了。

如果我们能弄清楚如何正确引用 p.id 和 b.id,我们应该可以正常工作。

于 2020-07-14T19:53:15.133 回答
0

谢谢你,@dryhurst。似乎没有办法引用新创建的节点的 id,但我通过引入 temp id 属性找到了解决方案。请参阅有关此问题的讨论和最终解决方案:

https://community.neo4j.com/t/auto-generated-mutation-does-not-create-relationship/21412/16

于 2020-07-16T17:26:36.677 回答