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

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

萧奇
2023-03-14

我正在尝试扩展使用neo4jgraphqljs自动生成的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"})

共有1个答案

宗政霄
2023-03-14

我意识到neo4jgraphqljs是一个查询生成器,因此我可以使用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
        """)

潜在生病返回地点,然后要获取访问该地点的人,我可以使用graphql

{
  Person(filter: { healthstatus: "Sick" }) {
    id
    potentialSick {
      persons (filter: { healthstatus: "Healthy" }){
        _id
      }
    }
  }
}
 类似资料:
  • Cypher对我来说似乎比Gremlin要清楚得多,总的来说,Neo4j的家伙似乎都在和Cypher一起。但是--如果Cypher与Gremlin相比是有限的--我真的想提前知道这一点。

  • 使用neo4j 1.9。2,我试图在我的图中找到所有与另一个节点有一对一关系的节点。假设我的图表中有人,我想找到所有人,他们只有一个朋友(自2013年以来),而这一个朋友只有另一个人作为朋友,没有其他人。作为回报,我希望有所有这些“孤立”的朋友对。 我尝试了以下方法: 但是这个查询并不是它应该做什么——它只是不返回任何内容。 注:两人之间只有一种关系。因此,一个朋友有一个新的关系,另一个是一个外向

  • 我通常希望创建一个GraphQL类型,它表示跨越多个节点的Cypher查询的结果。在这种情况下,我无法从返回具体节点,因为不存在这样的节点。我试图从顶级查询返回适当命名的字段,但这种方法不起作用。 查询: 产生以下错误: 我知道我可以用每个字段的注释来满足单个字段,这不适合这种情况。这个问题是关于满足整个结果类型。 如果答案需要在数组中使用自定义处理程序,只要我可以在单个查询中收集满足该类型所需的

  • 为了计算添加到DB表名称中的项数,我使用了一个带有Spring JPA的本机查询: DTO对象,应该包含在返回的列表中: 我似乎没有正确定义dto?如何正确定义dto,以便返回对象列表?

  • 我有以下CPT: 以及以下出现在CPT条款下的自定义分类法: 现在,我试图创建一个single-articles.php,在其中我查询一个文章,以包括所有自定义分类法信息。 我已经尝试了所有的变体: 我对PHP比较陌生 但是我不明白为什么php/wp没有显示对象中包含的所有数据。理想情况下,我只想查询一篇文章并返回所有数据,以包含所有附加分类法的信息。我不想按分类法查询文章,因此我有两个问题: 1

  • 下面是我的上下文的概念示例: 我有一个抽象类,名为:(包含一个属性为String) 我有一个子类,名为: 我有一个子类,名为: 使用Spring-Data-Neo4j,我将a。 我创建了一个测试类,以便在图中插入一个和一个<整口井都发生了= 现在,我想进行这种密码查询: 检索id=123的用户 因此,我必须找到更有效的方法来检查所有用户节点(FacebookUser和TwitterUser的联合)