【问题标题】:Dgraph deep filteringDgraph 深度过滤
【发布时间】:2019-04-05 01:52:41
【问题描述】:

我有一个架构

<friend>: uid .
<owns_pet>: uid .
<person.age>: int @index(int) .
<person.name>: string @index(fulltext, term, trigram) .
<pet.name>: string @index(fulltext, term) .

有数据

{
  set {
    _:a1 <person.name> "A1" .
    _:a1 <person.age> "43" .
    _:a2 <person.name> "A2" .
    _:a2 <person.age> "33" .
    _:a3 <person.name> "A3" .
    _:a3 <person.age> "37" .
    _:a1 <friend> _:a2 .
    _:a1 <friend> _:a3 .
    _:a3 <friend> _:a2 .
    _:p2 <pet.name> "P2" .
    _:p3 <pet.name> "P3" .
    _:a2 <owns_pet> _:p2 .
    _:a3 <owns_pet> _:p3 .
  }
}

是否可以创建一个只返回有朋友的人的查询,并且这个朋友有一只名为“P3”的宠物?我希望看到结果

"result": [
  {
    "name": "A1",
    "age": 43
  }
]

现在我可以查询:

{
  result (func: has(person.name)) @filter(has(friend)) {
    name: person.name
    age: person.age
    friend @filter(has(owns_pet)) {
      owns_pet @filter(eq(pet.name, "P3")) {
      }
    }
  }
}

但这也返回人“A3”

【问题讨论】:

    标签: graphql dgraph


    【解决方案1】:

    找到一个解决方案,返回所需的结果:

    {
      var (func: eq(pet.name, "P3")) {
        ~owns_pet {
          ~friend {
            u as uid
          }
        }  
      }
    
      result (func: uid(u)) {
        name: person.name
        age: person.age
      }
    }
    

    但我不知道这是否正确。

    【讨论】:

      【解决方案2】:

      这是另一个查询,您可以考虑使用 @normalize 仅返回别名谓词,使用 @cascade 仅返回包含查询中所有边的结果:

      {
        personWithFriendPetP3(func: has(person.name)) @normalize @cascade {
          name: person.name
          age: person.age
          friend {
            owns_pet @filter(eq(pet.name, "P3")) {
              pet.name
            }
          }
        }
      }
      

      回复:

      {
        "data": {
          "personWithFriendPetP3": [
            {
              "name": "A1",
              "age": 43
            }
          ]
        }
      }
      

      Your answer 可以很好地工作,因为您会在 owns_petfriend 的架构类型中设置反向边缘。它比上面的查询做的工作更少,因为它在根 func 中使用索引查询,首先对特定宠物名称进行相等性检查,然后遍历其他朋友。

      这个答案中的查询会首先找到所有在根func中有名字的人,然后检查他们朋友的宠物名字是否是P3。


      Dgraph 文档:

      https://docs.dgraph.io/query-language/#normalize-directive

      https://docs.dgraph.io/query-language/#cascade-directive

      【讨论】:

        猜你喜欢
        • 2012-10-13
        • 1970-01-01
        • 2022-10-02
        • 2023-03-21
        • 1970-01-01
        • 2015-02-20
        • 2015-04-25
        • 1970-01-01
        相关资源
        最近更新 更多