The reason for this series
Simply want to ask Viblo to note the knowledge learned in a single day. These are not complete blog posts, so people may not care about them
Reason to learn Dgraph
It rained today and COVID showed no sign of stopping. It is expected that there will be a long distance to avoid epidemic, so in addition to the daily work I still have to work, the time is quite a lot more (1-2 hours a day). So popping up on Github as a habit of checking Github discovery saw that this was trending in the GraphQL topic, so I decided to spend a few hours learning how it might be used later.
Start learning
Get started with Dgraph
- Install Dgraph with Docker
1 2 | docker run --rm -it -p 8000:8000 -p 8080:8080 -p 9080:9080 dgraph/standalone |
- The concept of nodes : In the Graph Database all entities or concepts are represented as nodes. It can be transactions, items, people … all of these entities are represented as nodes.
- The concept of edge edges : All relationships between notes are represented by edges. Example in the following image:
Then we have two nodes representing 2 people and an edge representing the follows relationship between them. It can be seen that these two nodes have two attributes, age
and name
. All properties in a node are collectively referred to as predicates
in Dgraph. The follows
edge between these two nodes is also called a predicate
although it is not a string or an integer but it points to another node.
Create a new node
All operations such as create, update, delete in Dgraph are called mutations. We try to add a new piece of data by going into the mutate tab
Add the following data:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token punctuation">{</span> <span class="token property">"set"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Karthic"</span> <span class="token punctuation">,</span> <span class="token property">"age"</span> <span class="token operator">:</span> <span class="token number">28</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Jessica"</span> <span class="token punctuation">,</span> <span class="token property">"age"</span> <span class="token operator">:</span> <span class="token number">31</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
This data segment will initialize two nodes representing 2 people. However, it does not show the relationship between the two nodes. To show that relationship, we need a little bit of change:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token punctuation">{</span> <span class="token property">"set"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Karthic"</span> <span class="token punctuation">,</span> <span class="token property">"age"</span> <span class="token operator">:</span> <span class="token number">28</span> <span class="token punctuation">,</span> <span class="token property">"follows"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Jessica"</span> <span class="token punctuation">,</span> <span class="token property">"age"</span> <span class="token operator">:</span> <span class="token number">31</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
Query with the has function
Try rdungj mode query
1 2 3 4 5 6 7 | <span class="token punctuation">{</span> people(func <span class="token operator">:</span> has(name <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> name age <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Will list all the lists of nodes with predicate name
and in the data returned will have people like RESTful
Create dynamic schema
As soon as predicates are added to the graph, the default Dgraph will generate corresponding schemas. This makes our application quite flexible, but if we want to bind the input fields must follow a fixed schema, there will be a way (will learn in the next article).
Basic data processing operations
Manipulate with UID
Once a node is created on the graph there will exist a corresponding uid
and the addition of predicate
or updates can be made to the uid
. This is similar to using the primary key in a relational database. Let’s try the following example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token punctuation">{</span> <span class="token property">"set"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"0x1"</span> <span class="token punctuation">,</span> <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Pham Van Toan"</span> <span class="token punctuation">,</span> <span class="token property">"age"</span> <span class="token operator">:</span> <span class="token number">28</span> <span class="token punctuation">,</span> <span class="token property">"follows"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"0x2"</span> <span class="token punctuation">,</span> <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Tran Duc Thang"</span> <span class="token punctuation">,</span> <span class="token property">"age"</span> <span class="token operator">:</span> <span class="token number">34</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
This example will create two users and let them follow each other. When we need to update, we also need to pass the corresponding uid
. To query we will use
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token punctuation">{</span> people(func <span class="token operator">:</span> has(follows <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> uid name age follows <span class="token punctuation">{</span> uid name age <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
and get the following result:
Add edges with uid
We want to add another user to the follow list of the user whose uid = 0x2
as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token punctuation">{</span> <span class="token property">"set"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"0x2"</span> <span class="token punctuation">,</span> <span class="token property">"follows"</span> <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"0x3"</span> <span class="token punctuation">,</span> <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Nguyen Trung Son"</span> <span class="token punctuation">,</span> <span class="token property">"age"</span> <span class="token operator">:</span> <span class="token number">34</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
Browse through the edges.
So we have seen User 1 follow User 2 and User 2 follow User 3. We can browse through these edges by following as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token punctuation">{</span> people(func <span class="token operator">:</span> has(follows <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> uid name age follows <span class="token punctuation">{</span> uid name age follows <span class="token punctuation">{</span> uid name age <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
We get the following result
But this way is really not very neat. We can use recursive to call
1 2 3 4 5 6 7 8 9 | <span class="token punctuation">{</span> people(func <span class="token operator">:</span> uid( <span class="token string">"0x1"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> @recurse(depth <span class="token operator">:</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> uid name age follows <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
We have the same result
Delete a predicate in the node
To delete an attribute in a node we use the following syntax
1 2 3 4 5 6 | { delete { <0x4> <age> * . } } |
Similarly, to delete a follow we can also use the syntax
1 2 3 4 5 6 | <span class="token punctuation">{</span> delete <span class="token punctuation">{</span> < <span class="token number">0x3</span> > <follows> * . <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
The basic data types in DGraph
To illustrate this section, we will build a small blog application with the following model:
The graph above consists of 3 entities: Author, Blog Post and Tags. There are several constraints in this graph as follows
- All authors in graph may have one or more blog posts. The
published
edge represents the relationship between a post and its author. This edge has root in Author and vertex in Blog node - All blog posts may have one or more tags. The
tagged
edge shows the relationship between blog posts and their tags. This edge starts from theblog post node
and points to thetag node
.
Now let’s build the graph
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | <span class="token punctuation">{</span> <span class="token property">"set"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"author_name"</span> <span class="token operator">:</span> <span class="token string">"John Campbell"</span> <span class="token punctuation">,</span> <span class="token property">"rating"</span> <span class="token operator">:</span> <span class="token number">4.1</span> <span class="token punctuation">,</span> <span class="token property">"published"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"title"</span> <span class="token operator">:</span> <span class="token string">"Dgraph's recap of GraphQL Conf - Berlin 2019"</span> <span class="token punctuation">,</span> <span class="token property">"url"</span> <span class="token operator">:</span> <span class="token string">"https://blog.dgraph.io/post/graphql-conf-19/"</span> <span class="token punctuation">,</span> <span class="token property">"content"</span> <span class="token operator">:</span> <span class="token string">"We took part in the recently held GraphQL conference in Berlin. The experience was fascinating, and we were amazed by the high voltage enthusiasm in the GraphQL community. Now, we couldn’t help ourselves from sharing this with Dgraph’s community! This is the story of the GraphQL conference in Berlin."</span> <span class="token punctuation">,</span> <span class="token property">"likes"</span> <span class="token operator">:</span> <span class="token number">100</span> <span class="token punctuation">,</span> <span class="token property">"dislikes"</span> <span class="token operator">:</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token property">"publish_time"</span> <span class="token operator">:</span> <span class="token string">"2018-06-25T02:30:00"</span> <span class="token punctuation">,</span> <span class="token property">"tagged"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:graphql"</span> <span class="token punctuation">,</span> <span class="token property">"tag_name"</span> <span class="token operator">:</span> <span class="token string">"graphql"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:devrel"</span> <span class="token punctuation">,</span> <span class="token property">"tag_name"</span> <span class="token operator">:</span> <span class="token string">"devrel"</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"title"</span> <span class="token operator">:</span> <span class="token string">"Dgraph Labs wants you!"</span> <span class="token punctuation">,</span> <span class="token property">"url"</span> <span class="token operator">:</span> <span class="token string">"https://blog.dgraph.io/post/hiring-19/"</span> <span class="token punctuation">,</span> <span class="token property">"content"</span> <span class="token operator">:</span> <span class="token string">"We recently announced our successful Series A fundraise and, since then, many people have shown interest to join our team. We are very grateful to have so many people interested in joining our team! We also realized that the job openings were neither really up to date nor covered all of the roles that we are looking for. This is why we decided to spend some time rewriting them and the result is these six new job openings!."</span> <span class="token punctuation">,</span> <span class="token property">"likes"</span> <span class="token operator">:</span> <span class="token number">60</span> <span class="token punctuation">,</span> <span class="token property">"dislikes"</span> <span class="token operator">:</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token property">"publish_time"</span> <span class="token operator">:</span> <span class="token string">"2018-08-25T03:45:00"</span> <span class="token punctuation">,</span> <span class="token property">"tagged"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:hiring"</span> <span class="token punctuation">,</span> <span class="token property">"tag_name"</span> <span class="token operator">:</span> <span class="token string">"hiring"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:careers"</span> <span class="token punctuation">,</span> <span class="token property">"tag_name"</span> <span class="token operator">:</span> <span class="token string">"careers"</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"author_name"</span> <span class="token operator">:</span> <span class="token string">"John Travis"</span> <span class="token punctuation">,</span> <span class="token property">"rating"</span> <span class="token operator">:</span> <span class="token number">4.5</span> <span class="token punctuation">,</span> <span class="token property">"published"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"title"</span> <span class="token operator">:</span> <span class="token string">"How Dgraph Labs Raised Series A"</span> <span class="token punctuation">,</span> <span class="token property">"url"</span> <span class="token operator">:</span> <span class="token string">"https://blog.dgraph.io/post/how-dgraph-labs-raised-series-a/"</span> <span class="token punctuation">,</span> <span class="token property">"content"</span> <span class="token operator">:</span> <span class="token string">"I’m really excited to announce that Dgraph has raised $11.5M in Series A funding. This round is led by Redpoint Ventures, with investment from our previous lead, Bain Capital Ventures, and participation from all our existing investors – Blackbird, Grok and AirTree. With this round, Satish Dharmaraj joins Dgraph’s board of directors, which includes Salil Deshpande from Bain and myself. Their guidance is exactly what we need as we transition from building a product to bringing it to market. So, thanks to all our investors!."</span> <span class="token punctuation">,</span> <span class="token property">"likes"</span> <span class="token operator">:</span> <span class="token number">139</span> <span class="token punctuation">,</span> <span class="token property">"dislikes"</span> <span class="token operator">:</span> <span class="token number">6</span> <span class="token punctuation">,</span> <span class="token property">"publish_time"</span> <span class="token operator">:</span> <span class="token string">"2019-07-11T01:45:00"</span> <span class="token punctuation">,</span> <span class="token property">"tagged"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:annoucement"</span> <span class="token punctuation">,</span> <span class="token property">"tag_name"</span> <span class="token operator">:</span> <span class="token string">"annoucement"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:funding"</span> <span class="token punctuation">,</span> <span class="token property">"tag_name"</span> <span class="token operator">:</span> <span class="token string">"funding"</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"title"</span> <span class="token operator">:</span> <span class="token string">"Celebrating 10,000 GitHub Stars"</span> <span class="token punctuation">,</span> <span class="token property">"url"</span> <span class="token operator">:</span> <span class="token string">"https://blog.dgraph.io/post/10k-github-stars/"</span> <span class="token punctuation">,</span> <span class="token property">"content"</span> <span class="token operator">:</span> <span class="token string">"Dgraph is celebrating the milestone of reaching 10,000 GitHub stars ?. This wouldn’t have happened without all of you, so we want to thank the awesome community for being with us all the way along. This milestone comes at an exciting time for Dgraph."</span> <span class="token punctuation">,</span> <span class="token property">"likes"</span> <span class="token operator">:</span> <span class="token number">33</span> <span class="token punctuation">,</span> <span class="token property">"dislikes"</span> <span class="token operator">:</span> <span class="token number">12</span> <span class="token punctuation">,</span> <span class="token property">"publish_time"</span> <span class="token operator">:</span> <span class="token string">"2017-03-11T01:45:00"</span> <span class="token punctuation">,</span> <span class="token property">"tagged"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:devrel"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:annoucement"</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"author_name"</span> <span class="token operator">:</span> <span class="token string">"Katie Perry"</span> <span class="token punctuation">,</span> <span class="token property">"rating"</span> <span class="token operator">:</span> <span class="token number">3.9</span> <span class="token punctuation">,</span> <span class="token property">"published"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"title"</span> <span class="token operator">:</span> <span class="token string">"Migrating data from SQL to Dgraph!"</span> <span class="token punctuation">,</span> <span class="token property">"url"</span> <span class="token operator">:</span> <span class="token string">"https://blog.dgraph.io/post/migrating-from-sql-to-dgraph/"</span> <span class="token punctuation">,</span> <span class="token property">"content"</span> <span class="token operator">:</span> <span class="token string">"Dgraph is rapidly gaining reputation as an easy to use database to build apps upon. Many new users of Dgraph have existing relational databases that they want to migrate from. In particular, we get asked a lot about how to migrate data from MySQL to Dgraph. In this article, we present a tool that makes this migration really easy: all a user needs to do is write a small 3 lines configuration file and type in 2 commands. In essence, this tool bridges one of the best technologies of the 20th century with one of the best ones of the 21st (if you ask us)."</span> <span class="token punctuation">,</span> <span class="token property">"likes"</span> <span class="token operator">:</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token property">"dislikes"</span> <span class="token operator">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token property">"publish_time"</span> <span class="token operator">:</span> <span class="token string">"2018-08-25T01:44:00"</span> <span class="token punctuation">,</span> <span class="token property">"tagged"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:tutorial"</span> <span class="token punctuation">,</span> <span class="token property">"tag_name"</span> <span class="token operator">:</span> <span class="token string">"tutorial"</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"title"</span> <span class="token operator">:</span> <span class="token string">"Building a To-Do List React App with Dgraph"</span> <span class="token punctuation">,</span> <span class="token property">"url"</span> <span class="token operator">:</span> <span class="token string">"https://blog.dgraph.io/post/building-todo-list-react-dgraph/"</span> <span class="token punctuation">,</span> <span class="token property">"content"</span> <span class="token operator">:</span> <span class="token string">"In this tutorial we will build a To-Do List application using React JavaScript library and Dgraph as a backend database. We will use dgraph-js-http — a library designed to greatly simplify the life of JavaScript developers when accessing Dgraph databases."</span> <span class="token punctuation">,</span> <span class="token property">"likes"</span> <span class="token operator">:</span> <span class="token number">97</span> <span class="token punctuation">,</span> <span class="token property">"dislikes"</span> <span class="token operator">:</span> <span class="token number">5</span> <span class="token punctuation">,</span> <span class="token property">"publish_time"</span> <span class="token operator">:</span> <span class="token string">"2019-02-11T03:33:00"</span> <span class="token punctuation">,</span> <span class="token property">"tagged"</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:tutorial"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:devrel"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token property">"uid"</span> <span class="token operator">:</span> <span class="token string">"_:javascript"</span> <span class="token punctuation">,</span> <span class="token property">"tag_name"</span> <span class="token operator">:</span> <span class="token string">"javascript"</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> |
After erecting the graph to the query to test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token punctuation">{</span> people(func <span class="token operator">:</span> has(published <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> author_name rating published <span class="token punctuation">{</span> title url tagged <span class="token punctuation">{</span> tag_name <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Then obtain the graph as follows:
In the graph above we see there
- 3 node author blue
- Each author has 2 blog posts green color
- Each post has some pink tags, maybe individual tags or multiple post shares with some common tags
The data type for predicates
Normally, the data types for predicates will be automatically detected after graph creation is successful. Can see on the picture
The basic data types including string, float, int
or uid
and Dgraph also have many other data such as geo, datetime, boolean
in it.
- The
uid
type provides the linking edge between the two nodes - The array
[uid]
represents a collection ofuid
representing the representation of multiple relationships
Query the value of predicates
In addition to using the has
function as above, we also have other functions used to query data with the meaning as shown below.
Let’s try the example of finding the best_author with the rule that the ratings are higher than 4.0
1 2 3 4 5 6 7 8 | <span class="token punctuation">{</span> best_authors(func <span class="token operator">:</span> ge(rating <span class="token punctuation">,</span> <span class="token number">4.0</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> uid author_name rating <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
However, we see the results of the rating field have not been indexed
Note : We cannot query the value of a predicate unless the predicate has been indexed
Type the index for predicate
Indexx is a technique that enables queries on predicates to be performed at a faster rate and is required when querying the value of a predicate. Dgraph provides different index types for each specific data type as shown in the following table
To set the index can use the Schema tab on the interface
After indexing, we run the query again and we will get a successful result
Filter edges on the query
The above query helps us retrieve author information. Now we want to get more corresponding blog posts of that author
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token punctuation">{</span> authors_and_ratings(func <span class="token operator">:</span> ge(rating <span class="token punctuation">,</span> <span class="token number">4.0</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> uid author_name rating published <span class="token punctuation">{</span> title content dislikes <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
We obtained the following result
Now I want to filter articles with dislike number less than 12 then how. We use @filter
it is like a Python decorator. At this point the query will become
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token punctuation">{</span> best_authors(func <span class="token operator">:</span> ge(rating <span class="token punctuation">,</span> <span class="token number">4.0</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> uid author_name rating published @filter(lt(dislikes <span class="token punctuation">,</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> title content dislikes <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
And we also need to index this predicate dislikes. The following result is obtained:
Query with string predicate
For predicates that the data type is string
, it is first necessary to index them. However, this predicate string index has many different types
in which the meaning of each type is as follows:
fulltext, term, trigram
are some of the more superior types (like tokenizer in NLP)exact
index is only used for queries likeeq, gt, lt, ge, le
hash
index will make querying foreq
faster but only foreq
Then query to try
1 2 3 4 5 6 | <span class="token punctuation">{</span> tags(func <span class="token operator">:</span> eq(tag_name <span class="token punctuation">,</span> <span class="token string">"devrel"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> tag_name <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Query with reverse edges
In the graph we see at the beginning, the relationship is one-way. So if you want to tag tagged posts from node tags, the following query will not work
1 2 3 4 5 6 7 8 9 10 | <span class="token punctuation">{</span> devrel_tag(func <span class="token operator">:</span> eq(tag_name <span class="token punctuation">,</span> <span class="token string">"devrel"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> tag_name tagged <span class="token punctuation">{</span> title content <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
To do so, you need to add reverse mode to the tagged by adding ~tagged
. Query has encountered an error because the user has not reversed
After finishing rerverse, the result is obtained
Summary and comments
- Using Dgraph is quite easy
- Operation on RavelUI is very convenient and intuitive
- The operation of the data is quite simple
- Expect something better, but the general feeling is that it is quite easy to use and intuitive