嵌套JSON列表中的模式

嵌套JSON列表中的模式,json,graphql,apollo,Json,Graphql,Apollo,我有一个JSON列表,它捕获一对多关系 例如,学校可以有多个班级对象,班级可以有多个学生对象,但学生只属于一个班级和一个学校: { "School": [ { "id": 1, "name": "Grad School", "Class": [ { "name": 101, "Student": [ { "name": 501, "propertyA": "test"

我有一个JSON列表,它捕获一对多关系

例如,学校可以有多个班级对象,班级可以有多个学生对象,但学生只属于一个班级和一个学校:

{
  "School": [ {
    "id": 1,
    "name": "Grad School",
    "Class": [ {
         "name": 101,
         "Student": [ {
              "name": 501,
              "propertyA": "test"
         }]
     }]
  }]
}
我试图将这个JSON示例转换为一个适当的模式,但是嵌套导致了问题。阿波罗似乎能够提供帮助,但下面的例子不太具有描述性:


我正在寻找关于如何处理这种情况的建议,无论是通过JSON模式转换器(处理嵌套情况)还是其他方式。

我认为您提出的问题并不是真正的模式,在我看来,这很简单:

您有以下类型(所有虚拟代码,因为您没有指定要提供GraphQL Api的语言/框架):

那么我们需要一个入口

classQueryType
  name "school"
  argument :id, ID
  resolve do
    schools.where(id: argument["id"])
所以我们有了模式。更大的工作可能是让不同的类型以上述类型的工作方式访问JSON模式

比如说,我们以某种方式读取JSON数据,使用您拥有的结构

 const DATA = JSON.parse("your-example.json")
我们需要将其转换为不同的对象集合,以便动态查询:

 schools = []
 classes =  []
 people = []

  def build_schools(data)
    data.schools.for_each do |school|
       schools.push(
         name: school.name, 
         id: school.id, 
         classes: build_classes(school)
       )
    end
 end

 def build_classes(school)
   ids = []
   school.classes.for_each do  |class|
     ids.push(class.id)
     classes.push(
       id: class.id
       name: class.name
       school_id: school.id # you create your own references, to associate these objects
       students: build_students(class)
     )
   end
   return ids
 end

 ...
但是你仍然需要把它和你的打字系统连接起来。这意味着要编写解析程序:

例如在StudentType上

StudentType
 id ID
 name String
 class Class
 school School
   resolve(object) ->
     school_id = students.where(id: object.id).class_id.school_id
     schools.where(id: school_id)

我认为你的问题并不是真正的模式,在我看来这很简单:

您有以下类型(所有虚拟代码,因为您没有指定要提供GraphQL Api的语言/框架):

那么我们需要一个入口

classQueryType
  name "school"
  argument :id, ID
  resolve do
    schools.where(id: argument["id"])
所以我们有了模式。更大的工作可能是让不同的类型以上述类型的工作方式访问JSON模式

比如说,我们以某种方式读取JSON数据,使用您拥有的结构

 const DATA = JSON.parse("your-example.json")
我们需要将其转换为不同的对象集合,以便动态查询:

 schools = []
 classes =  []
 people = []

  def build_schools(data)
    data.schools.for_each do |school|
       schools.push(
         name: school.name, 
         id: school.id, 
         classes: build_classes(school)
       )
    end
 end

 def build_classes(school)
   ids = []
   school.classes.for_each do  |class|
     ids.push(class.id)
     classes.push(
       id: class.id
       name: class.name
       school_id: school.id # you create your own references, to associate these objects
       students: build_students(class)
     )
   end
   return ids
 end

 ...
但是你仍然需要把它和你的打字系统连接起来。这意味着要编写解析程序:

例如在StudentType上

StudentType
 id ID
 name String
 class Class
 school School
   resolve(object) ->
     school_id = students.where(id: object.id).class_id.school_id
     schools.where(id: school_id)

我是否正确理解你有一个JSON数据源,你自己没有DB访问权限?我希望我的回答给了你一个方向指示。我是否正确理解你有一个JSON数据源,你自己没有DB访问权限?我希望我的回答给了你一个方向指示。啊,谢谢你提供的详细信息。我在Neo4J中已经有了对象集合部分,这是我无法理解的解析器部分。我计划使用的工作流是Neo4J->GraphQL/Apollo->React。我说你提供的解析器方法可以在阿波罗发射台内使用,对吗?啊,谢谢你提供的详细信息。我在Neo4J中已经有了对象集合部分,这是我无法理解的解析器部分。我计划使用的工作流是Neo4J->GraphQL/Apollo->React。我说你提供的解析器方法可以在阿波罗发射台中使用,对吗?