neo4j-graphql-js @cypher查询的自定义返回类型

问题描述

我正在尝试扩展由neo4j-graphql-js自动生成的graphql模式

这是我的graphql模式

typeDefs

type Person {
   _id: Long!
   addresslocation: Point!
   confirmedtime: DateTime!
   healthstatus: String!
   id: String!
   name: String!
   performs_visit: [Visit] @relation(name: "PERFORMS_VISIT",direction: OUT)
   visits: [Place] @relation(name: "VISITS",direction: OUT)
   VISITS_rel: [VISITS]
}

type Place {
   _id: Long!
   homelocation: Point!
   id: String!
   name: String!
   type: String!
   part_of: [Region] @relation(name: "PART_OF",direction: OUT)
   visits: [Visit] @relation(name: "LOCATED_AT",direction: IN)
   persons: [Person] @relation(name: "VISITS",direction: IN)
}

type Visit {
   _id: Long!
   duration: String!
   endtime: DateTime!
   id: String!
   starttime: DateTime!
   located_at: [Place] @relation(name: "LOCATED_AT",direction: OUT)
   persons: [Person] @relation(name: "PERFORMS_VISIT",direction: IN)
}

type Region {
   _id: Long!
   name: String!
   places: [Place] @relation(name: "PART_OF",direction: IN)
}

type Country {
   _id: Long!
   name: String!
}

type Continent {
   _id: Long!
   name: String!
}



type VISITS @relation(name: "VISITS") {
  from: Person!
  to: Place!
  duration: String!
  endtime: DateTime!
  id: String!
  starttime: DateTime!
}

现在,我扩展了人员以执行自定义查询,以便使用@cypher指令

typeDefs2

type Person {
        potentialSick: [Person] @cypher(statement: """
            MATCH (p:this)--(v1:Visit)--(pl:Place)--(v2:Visit)--(p2:Person {healthstatus:"Healthy"})
            return *
        """)
  }

我通过合并两个typeDef创建模式,并且按预期工作

export const schema = makeAugmentedSchema({
    typeDefs: mergeTypeDefs([typeDefs,typeDefs2]),config: {
        debug: true,},});

问题

可以从我的自定义查询potentialSick返回自定义类型(映射在graphql中)吗?

我的目标是返回与此类似的类型

type PotentialSick {
    id: ID
    name: String
    overlapPlaces: [Place] 
}

在neo4j查询中,pl是重叠的位置

MATCH (p:this)--(v1:Visit)--(pl:Place)--(v2:Visit)--(p2:Person {healthstatus:"Healthy"})

解决方法

我意识到neo4j-graphql-js是一个查询生成器,因此我可以仅通过使用主模式使用graphql来获取数据。我的查询将是:

{
  Person(filter: { healthstatus: "Sick" }) {
    id
    visits {
      _id
      persons(filter: { healthstatus: "Healthy" }) {
        _id
      }
    }
  }
}

考虑到这一原则,对于需要@cyper的更复杂的查询,我可以扩展每种类型的基本架构并依靠graphql功能

作为示例

type Person {
        potentialSick: [Place] @cypher(statement: """
            MATCH path =(this)-[:VISITS]->(place:Place)<-[:VISITS]-(p2:Person {healthstatus:"Healthy"})
            return place
        """)

potentialSick返回places,然后获得访问那个地方的人,我可以使用graphql

{
  Person(filter: { healthstatus: "Sick" }) {
    id
    potentialSick {
      persons (filter: { healthstatus: "Healthy" }){
        _id
      }
    }
  }
}