首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dgraph深度过滤

Dgraph深度过滤
EN

Stack Overflow用户
提问于 2019-03-16 15:17:59
回答 2查看 675关注 0票数 0

我有一个模式

代码语言:javascript
复制
<friend>: uid .
<owns_pet>: uid .
<person.age>: int @index(int) .
<person.name>: string @index(fulltext, term, trigram) .
<pet.name>: string @index(fulltext, term) .

使用数据

代码语言:javascript
复制
{
  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“的宠物?我期望看到结果

代码语言:javascript
复制
"result": [
  {
    "name": "A1",
    "age": 43
  }
]

现在,我可以查询:

代码语言:javascript
复制
{
  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")) {
      }
    }
  }
}

但这也返回person "A3“

EN

回答 2

Stack Overflow用户

发布于 2019-03-17 23:47:27

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

代码语言:javascript
复制
{
  var (func: eq(pet.name, "P3")) {
    ~owns_pet {
      ~friend {
        u as uid
      }
    }  
  }

  result (func: uid(u)) {
    name: person.name
    age: person.age
  }
}

但我不知道这是不是一个正确的方法。

票数 1
EN

Stack Overflow用户

发布于 2019-04-05 01:52:42

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

代码语言:javascript
复制
{
  personWithFriendPetP3(func: has(person.name)) @normalize @cascade {
    name: person.name
    age: person.age
    friend {
      owns_pet @filter(eq(pet.name, "P3")) {
        pet.name
      }
    }
  }
}

响应:

代码语言:javascript
复制
{
  "data": {
    "personWithFriendPetP3": [
      {
        "name": "A1",
        "age": 43
      }
    ]
  }
}

假设您在owns_petfriend的模式类型中设置了反向边缘,那么Your answer将非常有效。它做的工作比上面的查询要少,因为它在根func中使用了一个索引查询,首先对特定的宠物名字进行相等检查,然后遍历其他朋友。

这个答案中的查询将首先查找在根func中有名字的所有人,然后检查他们朋友的昵称是否为P3。

Dgraph文档:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55194380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档