暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【译】Dgraph 入门(系列一)

背井 2021-03-03
3441


Dgraph是一个开源的、支持事务以及分布式的原生graph database。本文是关于Dgraph系列文章的第一篇。


本文将介绍如何在Dgraph中构建如下graph:


在这个过程中,我们将学到:

  • 使用 dgraph/standalone docker镜像运行Dgraph

  • 在Dgraph UI Ratel中执行以下基本操作

    • 创建node

    • 创建一个连接2个nodes的edge

    • 查询node


运行Dgraph


对于快速入门来说,使用 dgraph/standalone docker镜像是最快的方式。这个镜像是为快速入门而建的,不建议在生产环境中使用。


首先确保你的电脑已经安装并启动了Docker。


现在只需要运行以下命令,Dgraph服务就起来了。


docker run --rm -it -p 8000:8000 -p 8080:8080 -p 8090:8090 dgraph/standalone:latest


Nodes 和 Edges


我们将构建一个简单的graph,它有2个nodes以及一个关联这2个nodes的edge。



在graph database中,概念(concepts)或实体(entities)都是以nodes的形式来表达。不管它是一次拍卖、一笔交易、一处地点或一个人,所有这些实体在graph database中都以nodes的形式存在。


而edge则是2个nodes间的关联关系。上图中2个nodes代表了2个人: Karthicjessica。也能看到这些nodes有2个关联的属性: nameage。在Dgraph中,这些属性(properties)叫作 predicates


Karthic关注了Jessica。名为 follows 的edge代表了他们的关系。在Dgraph中,连接了2个nodes的edge也叫作 predicate,尽管它指向的是一个node而不是一个string或integer。


dgraph/standalone 镜像配备了一个有用的Dgraph UI,叫做 Ratel。在浏览器中打开http://localhost:8000,你就能访问它了。



我们使用Ratel最新的稳定版本。



使用Ratel执行Mutations操作


在Dgraph中,新建、更新和删除操作都叫作 mutations


Ratel让query和mutations变得更加简单。在后续的系列文章中,我们会探索它的更多特性。


在刚才打开的浏览器页面中选中 Mutate 标签,在文本框中粘贴以下内容。注意先不要执行!


    {
    "set": [
    {
    "name": "Karthic",
    "age": 28
    },
    {
    "name": "Jessica",
    "age": 31
    }
    ]
    }


    上述查询创建了2个nodes,每个node对应set数组中的一个元素。然而,它并没有为2个nodes创建edge。


    我们调整该mutation以进行修复,好让它也创建edge。


      {
      "set": [
      {
      "name": "Karthic",
      "age": 28,
      "follows": {
      "name": "Jessica",
      "age": 31
      }
      }
      ]
      }



      让我们执行这个mutation。点击Run。



      从响应可以看到有2个UIDs(Universal IDentifiers)被创建了。uids字段中的2个值对应了2个新建的nodes,即 Karthic 和 Jessica。


      使用 has 函数进行查询


      现在,让我们执行一项查询,对刚才创建的nodes进行可视化。我们将使用Dgraph的 has 函数。表达式 has(name) 返回所有带有 name predicate的nodes。


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


        进入 Query 标签,键入以上查询。然后点击 Run 按钮。



        Ratel将结果以图形化的形式渲染了出来。


        点击任意一个node,注意nodes的uid,和上面mutation的响应一致。


        也可以在 JSON 标签下,以JSON的形式查看查询结果。



        理解上面的查询



        查询的第一部分是用户定义的函数名。在上面例子中,我们把它命名为 people。当然,你也可以使用其它名字。


        func参数所关联的必须是Dgraph内置的函数。Dgraph提供了各种用途的内置函数。has 便是其中之一。可以在这里(https://docs.dgraph.io/query-language)检索更多的Dgraph内置函数。


        内部的查询字段(即下面代码块的第3行)和SQL select语句中的列名或GraphQL查询中的类似。


        可以利用它们指定你想要返回哪些predicates。


          {
          people(func: has(name)) {
          name # 想要返回哪些predicates
          }
          }


          同理,你也可以使用 has 函数查询出所有带有 age predicate的nodes。


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


            灵活的schema


            Dgraph并不强制你定义schema(节点的结构、数据类型等),你可以随时插入数据,并在需要时添加约束。


            让我们看一下下面这个mutation。


              {
              "set": [
              {
              "name": "Balaji",
              "age": 23,
              "country": "India"
              },
              {
              "name": "Daniel",
              "age": 25,
              "city": "San Diego"
              }
              ]
              }


              它创建了2个nodes,其中一个node包含了 name、age和country predicates,而另一个node的predicates则是name、age和city。


              Schema并不是初始化所必需的。Dgraph会根据mutation自动添加新的predicates。这种灵活性常常是有益的,但是如果你想让mutations遵守某个既定的schema,后续的文章中也会介绍其它的可用选项。


              结束语


              本文介绍了Dgraph的一些基础知识,包括如何运行Dgraph、如何添加新的nodes和predicates以及如何查询。


              在结束前,我们也大致说一下下篇文章将要讲述的内容。你知道我们也能根据UID来查询nodes吗?UID也可用于在已有nodes间添加edge!


              听起来有趣吧?


              下回见。希望学习Dgraph使你快乐!

              文章转载自背井,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论