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个人: Karthic和jessica。也能看到这些nodes有2个关联的属性: name 和 age。在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)) {nameage}}
进入 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使你快乐!




