我有一个模式
<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")) {
}
}
}
}但这也返回person "A3“
发布于 2019-03-17 23:47:27
找到一个解决方案,返回所需的结果:
{
var (func: eq(pet.name, "P3")) {
~owns_pet {
~friend {
u as uid
}
}
}
result (func: uid(u)) {
name: person.name
age: person.age
}
}但我不知道这是不是一个正确的方法。
发布于 2019-04-05 01:52:42
下面是另一个查询,您可以考虑使用@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
}
]
}
}假设您在owns_pet和friend的模式类型中设置了反向边缘,那么Your answer将非常有效。它做的工作比上面的查询要少,因为它在根func中使用了一个索引查询,首先对特定的宠物名字进行相等检查,然后遍历其他朋友。
这个答案中的查询将首先查找在根func中有名字的所有人,然后检查他们朋友的昵称是否为P3。
Dgraph文档:
https://stackoverflow.com/questions/55194380
复制相似问题