翻译自:这里
在之前的入门教程中,我们学习了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> * .
}
}