【问题标题】:neo4j-graphql-js custom return type for @cypher queryneo4j-graphql-js @cypher 查询的自定义返回类型
【发布时间】:2020-10-23 21:53:22
【问题描述】:

我正在尝试扩展使用 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!
}

现在我扩展 Person 来执行自定义查询,为此我使用了@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 neo4j-graphql-js


    【解决方案1】:

    我意识到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
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 2017-08-24
      相关资源
      最近更新 更多