DQL-2.2.开始使用Dgraph-基本操作

翻译自:这里

之前的入门教程中,我们学习了Dgraph的一些基础知识。包括如何运行数据库、添加新节点和谓词以及查询它们。

在本教程中,我们将构建上面的Graph,并学习使用节点的UID(通用标识符)进行操作的更多信息。具体来说,我们将了解:

  • 使用它们的uid进行谓词的查询、更新和删除。
  • 在现有节点之间添加一条边。
  • 向现有节点添加新谓词。
  • 遍历Graph图

首先,让我们创建我们的Graph。

转到Ratel的突变选项卡,将下面的突变粘贴到文本区域中,然后单击Run。

{
  "set":[
    {
      "name": "Michael",
      "age": 40,
      "follows": {
        "name": "Pawan",
        "age": 28,
        "follows":{
          "name": "Leyla",
          "age": 31
        }
      }
    }
  ]
}

查询使用uid

可以通过节点的UID进行查询。内置函数uid以uid列表作为可变参数,因此您可以传递一个(例如uid(0x1))或您需要的任意多个(例如uid(0x1, 0x2))。

它返回作为输入传递的相同uid,无论它们是否存在于数据库中。但是,只有当uid及其谓词都存在时,才返回所请求的谓词。

让我们看看实际的uid函数。

首先,让我们复制名称为Michael节点的UID。

转到查询选项卡,键入下面的查询,然后单击Run。

{
  people(func: has(name)) {
    uid
    name
    age
  }
}

现在,从结果中复制Michael的节点的UID。

在下面的查询中,将占位符MICHAELS_UID替换为刚才复制的你自己实例中的UID(例如这里例子的是:0x8),然后运行查询。

{
    find_using_uid(func: uid(MICHAELS_UID)){
        uid
        name 
        age
    }
}

注意: MICHAELS_UID在图像中显示为0x8。您在机器上获得的UID可能有不同的值。

您可以看到uid函数返回与Michael的uid匹配的节点。

更新谓词

还可以使用UID更新节点的一个或多个谓词。

迈克尔最近庆祝了他的41岁生日。我们把他的年龄更新到41岁。

转到mutate选项卡并执行突变。同样,不要忘记将占位符MICHAELS_UID替换为你自己的Michael节点的实际UID。

{
  "set":[
    {
      "uid": "MICHAELS_UID",
      "age": 41
    }
  ]
}

我们之前使用set来创建新节点。但是在使用现有节点的UID时,它更新其谓词,而不是创建新节点

你可以看到迈克尔的年龄被更新到41岁。

{
    find_using_uid(func: uid(MICHAELS_UID)){
        name 
        age
    }
}

类似地,您还可以向现有节点添加新的谓词。因为对于Michael的节点来说谓词国家不存在,所以它创建了一个新的谓词国家。

{
  "set":[
    {
      "uid": "MICHAELS_UID",
      "country": "Australia"
    }
  ]
}

在现有节点之间添加一条边

您还可以使用现有节点的uid在它们之间添加一条边。

比方说,让Leyla跟随(指向)Michael。

我们知道它们之间的关系必须通过在它们之间创建下面的边来表示。

首先,让我们从Ratel中复制Leyla和Michael的节点uid。

现在,将占位符LEYLAS_UID和MICHAELS_UID替换为您复制的自己机器上的uid值,并执行突变。

{
  "set":[
    {
      "uid": "LEYLAS_UID",
      "follows": {
        "uid": "MICHAELS_UID"
      }
    }
  ]
}

遍历边

图数据库提供了许多不同的功能。遍历就是其中之一。

遍历可以回答与节点之间关系相关的问题或查询。因此,像这样的问题,Michael跟随谁?通过遍历下面的关系得到答案。

让我们运行一个遍历查询,然后详细理解它。

{
    find_follower(func: uid(MICHAELS_UID)){
        name 
        age
        follows {
          name 
          age 
        }
    }
}

这里是结果。

查询有三个部分:

  • 选择根节点。 首先,您需要选择一个或多个节点作为遍历的起点。这些被称为根节点。在上面的查询中,我们使用uid()函数选择为Michael创建的节点作为根节点。
  • 选择要遍历的边 您需要指定要遍历的边,从所选的根节点开始。然后,遍历,沿着这些边,从一端到另一端的节点。在我们的查询中,我们选择从Michael的节点开始遍历下面的边。遍历返回Michael通过下面这条边连接到该节点的所有节点。
  • 指定要返回的谓词 因为Michael只指向一个人,所以遍历只返回一个节点。这些是第2级节点。根节点构成了第1级的节点。同样,我们可以指定从第2级节点返回哪些谓词。

您可以扩展查询以利用2级节点,并进一步深入地遍历Graph。让我们在下一节中探讨这个问题。

多层次的遍历

第一级遍历返回people,跟着的是Michael。下一层的遍历进一步返回他们依次跟随的人(Michael跟随的人...)。

这个模式可以重复多次以实现多级遍历。当我们遍历Graph的每一层时,查询的深度将增加1。这时我们就说这个查询很深!

{
  find_follower(func: uid(MICHAELS_UID)) {
    name 
    age 
    follows {
      name
      age
      follows {
        name 
        age
      }
    }
  }
}

下面是最后一个查询扩展的另一个示例

{
  find_follower(func: uid(MICHAELS_UID)) {
    name 
    age 
    follows {
      name
      age
      follows {
        name 
        age
        follows {
          name 
          age
        }
      }
    }
  }
}

这个查询真的很长!查询有四个层次。换句话说,查询的深度是4。如果你问,难道没有一个内置的函数可以让多级深度查询或遍历变得简单吗?

答案是肯定的!这就是recurse()函数所做的。让我们在下一节中探讨这个问题。

递归遍历

递归查询使得执行多级深度遍历更加容易。它们让您轻松遍历Graph的一个子集。

通过下面的递归查询,我们实现了与上一个查询相同的结果。但是,有了更好的查询体验。

{
  find_follower(func: uid(MICHAELS_UID)) @recurse(depth: 4) {
    name 
    age
    follows
  }
}

在上面的查询中,递归函数从Michael的节点开始遍历图。您也可以选择任何其他节点作为起始点。depth参数指定遍历查询应该考虑的最大深度。

让我们在将占位符MICHAELS_UID替换为Michael的节点UID之后运行递归遍历查询。

删除一个谓词

可以使用删除突变语句删除节点的谓词。这是删除突变的语法,删除一个节点的任何谓词,

{
    delete {
        <UID> <predicate_name> * .
    }
}

使用上面的突变语法,让我们组成一个删除突变。让我们为Michael删除节点的年龄谓词。

{
  delete {
    <MICHAELS_UID> <age> * .
  }
}

posted @ 2021-12-07 14:46  KILLNPE  阅读(406)  评论(0编辑  收藏  举报