About this video
What You'll Learn
- Set up and run a local Dgraph instance with Docker, then use Ratel to issue basic DQL queries.
- Model entities with DQL schemas, add index directives, and define types to support performant relationship queries.
- Compare Dgraph DQL and native GraphQL workflows, then run equivalent queries and mutations in Slash GraphQL.
Xuanyi Chew, community engineer at Dgraph, walks through running Dgraph in Docker, exploring the Ratel UI, writing queries and schemas in DQL versus native GraphQL, and using the hosted Slash GraphQL service.
Jump to a chapter
- 0:00 Holding screen
- 1:40 Introductions
- 1:50 Introduction
- 2:44 Guest Introduction & What is Dgraph?
- 3:40 Who is Xuanyi?
- 5:30 Why use a graph database?
- 9:42 Installation & Dgraph Architecture
- 9:45 Running Dgraph with Docker
- 13:30 Ratel - the Dgraph web interface
- 13:35 Introducing the Rattle UI
- 14:31 DQL Basics: Querying and Mutations
- 18:04 Working with DQL Schema and Indexing
- 18:40 Writing our first records
- 27:00 Adding relationships
- 27:01 Adding Data and Relationships in DQL
- 33:00 Adding type definitions
- 33:09 Structuring Data with DQL Types
- 37:25 Handling Schema Evolution & Data Conflicts in DQL
- 46:10 Visualizing DQL Results
- 48:36 Dgraph Cloud (Slash GraphQL)
- 48:40 Slash GraphQL managed service
- 51:59 Exploring Slash GraphQL with Sample App
- 55:20 Dgraph's Native GraphQL Benefits
- 1:03:10 DQL Functions & Advanced Features (Geo, Language)
- 1:08:50 Future of Dgraph & Community Resources
- 1:18:07 Conclusion
Full transcript
Generated from the English captions. Timestamps jump the player to that moment.
Read the full transcript
1:50 Introduction
1:50 Hello there and welcome to today's episode of Rawkode live. I'm your host, Rawkode. Now I wanna take a moment before we get started to just thank my employer providing the time for me to put a show together and produce learning materials for us all to learn together. If you want to try Equinix Medal, which is a bare metal cloud platform, then you can use the code Rawkode live. This will give you $50 in credit. That credit can be splurged over a few hours over n two x large x 86 machines with a whopping 400 gig of ram
2:22 almost. If you wish to be a little bit more conservative, then you can start at 50¢ an hour and you're still getting a fairly chunky machine. If you're not watching this live and you wanna have conversations or ask questions, feel free to join our discord community at Rawkode live slash chat And please remember to hit that subscribe button so that more people will find this content. Thanks. Today, we're gonna take a look at Dgraph and I am at the pleasure of being joined by Dgraph's community engineer, Swanee Chew. Hello. How are you? Good. Good. Good. Yourself?
2:44 Guest Introduction & What is Dgraph?
2:58 Yeah. Very well. Thank you. Good. I appreciate that it is a little bit late. This is the biggest time zone difference I've had to deal with so far in this show. Eleven hours, I believe. It is what? 9PM for you at the moment? It is. It is. And, know, thank you for for being so flexible. No. No. No. Thank you. I'm really looking forward to today's episode. You know, Dgraph I think is a really cool tool. I've used it very superficially and I'm hoping that you're gonna correct all of those bad habits that I potentially picked up as I've been experimenting.
3:31 So before we get started, do wanna just take a moment to maybe you know, introduce yourself, talk about what you do, and then we'll lead into what Dgraph is and what problem it's trying to solve. Yeah. So I'm Shanid. You very you you got my name quite well. Thank you. I'm the community engineer at Dgraph, and what I do is I wrangle the community. I basically I I'm the ear of the queue. I I listen to what the community says. I I provide feedback from the community back into the engineers. I also do outreach kind re related kind
3:40 Who is Xuanyi?
4:07 of works, which is why I'm here. Yeah. So previously, I was I was doing machine learning research, being a data scientist for more than fifteen ish years. And Dgraph is really interesting to me because it's it it comes from, knowledge knowledge graphs. You know those little boxes that you see on Google? Uh-huh. Yeah. Those those boxes were, like, created by the guy who founded Dgraph, Manish. Alright. Okay. Yeah. Yeah. So so so pretty much the same things that powered those little one boxes is what powers Dgraph. Okay. So to to confirm that, like, when I search for
4:49 Donald Trump, there's that little box on the right that says, this is all the information we have on this person and here are the links to the other sites. That but that is powered by a graph database and by the person who started to do It's powered by a knowledge graph, which Knowledge graph. You can build using Dgraph. The the underlying technologies would be quite the same as Dgraph. In fact, if if you look at Dgraph source code, you'll find a lot of terms that are related to search engines. Right? You got words like posting lists,
5:18 keywords like posting lists, and and these are ideas that came from from manage building a a search engine, essentially. Okay. So why don't we kind of kind of dive into that a little bit then? So when people are building their their applications, right, it's very easy and for people to reach to a database where they've got experience of using before. You know, I can think firsthand of many things where I or my team would pick MariaDB or would pick Postgres just because those are tools we've used before. So what is what is the decision process then when people
5:30 Why use a graph database?
5:54 are saying, okay, maybe I should start to look at using a graph database like Dgraph. Like, what what is there a certain type of data? Is there a certain type of problem that this really fits naturally to that people should make that leap out of their comfort zone? Right. So Rawkode has a has a very famous saying, something along the lines of if you structure your data right, the algorithms follow. Right? So if if you think about the data of the domain of the problem that you're trying to solve, right, if you're trying to build a Twitter
6:24 clone, for example, would you be would your data really be in form of tables, or would your table be graph like? Right? So your users will be following each other. You'll be posting tweets and stuff like that, for example. Now think about the the structure of the data in your head. Right? Are they tables? Naturally, as as they are. Right? Naturally, as they are. Are they tables or are they graphs? So so if you have a if you have a dataset if if you've got a bunch of data at the at your data structure, if if they're table format, like,
7:08 you know, they they are don't get me wrong. There are absolutely a lot of data where where tables are the best way to handle it. But a lot of data is best handled by something like a graph or a tree. In fact, graphs and trees are so ubiquitous. They're they're they're considered fundamentals in computer science. We we we Yeah. Talk about graphs and trees all the time in computer science and not anywhere else. Right? So, it's a very good way if you to to to to to figure out whether you should use graph databases to have to think
7:40 about what your data structure actually look like. Right? Yeah. What's the structure of your data in its in its natural form? Okay. Alright. So I guess when when people are making these sorts of decisions, mean, they should really start to understand what data model they're trying to accomplish, what kind of query workloads they're gonna have. They wanna understand that they need to, you know, as I get something that we all see time and time again, is we throw stuff into these traditional relational databases and we add all of these indices and all of these complex joins and then we have Yeah. We
8:15 complain about the mess when we try to build a SQL query to create that back out and the problem is we're just probably not using the right data structures. We're not using the right database technology Exactly. That's where Dgraph can hopefully, you know, the examples and the way that we're gonna play with it today will hopefully get people a more visual. Oh, like I get it now and this is why I should start using this technology and I think search like you said is a fantastic thing. Search is a graph that we wanna be able to
8:41 fill that down and present it in a way that is relevant to people. And I think Yeah. Fine. Based on my naive understanding so far, this is where this database technology really shines. Did it that's correct. Search is search is one of the things well, searching a knowledge graph. Right? So searching is often it's it's often when when it comes to search, it's often easier to search through tables because you take a table a table is essentially a list, and you split the list into half. You search the top half. You search the bottom half anywhere that
9:11 you find it. You just focus your area, you know, in in a binary search. Yep. Yeah. So search is often for for a lot of dataset, search is search fits with tables. But for the kinds of dataset that most web applications use, like the big, apps nowadays, well, they they they if you ask me to draw, I would draw a graph or a tree. You know, and that's where a graph database fits in. Alright. Why don't we get this installed and then show people what we're working with and then we'll start to model out some of this data. And again,
9:45 Running Dgraph with Docker
9:52 I think just the process of walking through this is gonna provide that they understand and that people need to get started here. So I will, through the power of the internet, share my screen. So this is the dgraph.io homepage. Yep. So I do also have the documentation and slash graph q l. Now I'm not sure what that is, but I'm sure we're gonna get to it shortly. Do you wanna explain right now or do you want do you want me to? Yeah. We'll bring it in naturally. Whenever you feel that we we wanna move towards whatever that is, then we'll just
10:29 we'll have to talk about it And just as a reminder to the people watching that there is very little done upfront. And the only thing that we have done upfront is pull the Dgraph Docker image. So that's Dgraph slash Dgraph and pull down the latest version. And I can see that in our shared buffer, you've very kindly provided me a very quick Docker run command just to get this started. Is that the first step? Is that what is well, hold on. Let me pull up the So so the the docs to install Docker is actually
10:59 in the front page. If you go to to deploy sorry. Click deploy. Yep. Yep. Yeah. And download. Right? You've got download on the left sidebar. There we go. Okay. Cool. Yeah. So is that step on then? We're just gonna run this image. I can see that it's exposing a bunch of ports so we can talk about what is going on there. Yes. Do want me to walk you through what's happening? Okay. So when you install Postgres, what do you expect? You when when you install Postgres, it's just one application that you run. Right? But Dgraph is is out of the box,
11:41 Dgraph is built to be, like, distributed so that one application will have to do several roles. So Dgraph itself is split into two things. It's called zero and alpha. Dgraph zero is the coordinator, so it coordinates the cluster, and alpha is where the data sits. Okay. So this standalone image has got all the the the configurations for, the alpha and zeros. What happens is when when you when you have things that are distributed out of the box, you've got to put a bit more thought into into how you're gonna deploy your application. Right? So on
12:23 a on a the standalone doc image basically gives you all that in in a standalone for you to play with. But when you deploy it, you need to actually give a lot more thought. Okay. So by default, Dgraph is a horizontally scalable graph database. Yep. That's right. Okay. Nice. I just need to tweak this a little bit. Yeah. I'm just gonna use a named volume so that I don't have to meant anything locally. Yeah. We're exposing port sixty eighty eighty eighty So sixty eighty would be the zero. That's the zero. 60 80. 80 80 and ninety eighty are the alphas,
13:05 and 8,000 is the clients. There's something there there is something called Rattle, which is the Dgraph clients. I'll show you how it looks like afterwards when when you get this running. Yeah. Let's get it started. Oh, it's the standalone image. Right. Okay. Cool. It was quick anyway. So we're good. So load the logs. It looks like it's starting up. I'm assuming it's just trying to do a leader election of its own. Yep. And it seems And there you go. It should be done. So if you go to your browser, go to local host 8,000. Welcome to Rattle. This is the interface of
13:35 Introducing the Rattle UI
13:43 Dgraph. Choose latest. Yep. So this is this is your interface to this is basically like a what's it called? P g p g admin. The PHP version of admin or or Yeah. Okay. What's it called? Seek SQL my admin. Oh, yeah. I don't Yeah. PHP my admin. That's the tool. This is just like a UI for the administration, and it's even got some query stuff built in for Dgraph. Oh, and and and it's got pretty some some pretty cool stuff. But you've essentially got Dgraph. You've got a database running just like that. Right? So so I need to explain to you a
14:31 DQL Basics: Querying and Mutations
14:31 bit, a bit more about about Dgraph right now. So Dgraph as a database supports two languages. Right? So this is DQL, also known as Dgraph query language and GraphQL. Okay. So GraphQL, I'm quite familiar with. So that should I'm assuming that's gonna feel oh, hopefully feel quite natural to me. But DQL, I'm not familiar with. So can we talk DQL looks like GraphQL. In fact, it was it it it was sort it sort sort of started off as a fork of GraphQL. There were things there are still things that GraphQL cannot do. So you keep extending it, extending it, extending
15:11 it, and and and suddenly it goes, oh, right. You know? It looks a bit different from, GraphQL now. Alright. So we've got no data. So like like in GraphQL, you you can you can write a query just like that. Look at your Versus code. So so in in in what what do you call it? Let's see. In in GraphQL, you you you say what you want. Right? Mhmm. So you name a function like that, And then, for example, okay. And then you tell me the fields that you want. So this is this is how DQL looks
16:19 like. Yep. It looks a bit like GraphQL, doesn't it? It's yeah. It's very, familiar for sure. Definitely. So the only difference are these. Right? Yeah. Some sort of, like, named parameter. Is that what's going on here? You pass it in and then there's a function or something. Right? I I don't know. I'll let you tell me. Okay. A funk is basically what's needed at the at the root note of the graph. Okay. So you say, I I wanna look at all the nodes, in a graph that has a type. This is what it says. Okay.
16:58 Now what is a node and what's a what what what's a what's a node in a graph? Well, this is where a graph database comes in. In a graph database, you store your your data in nodes. And and a node is is is an abstract thing. Right? It's not like a piece of something. The node in Dgraph is, it's a 64 bit integer, unsigned integer. Right? And and to give now imagine you've you've got a sea of little numbers everywhere. Right? They're not useful. You need to give it some structure. So the fundamentals of Dgraph is type system,
17:41 and, let's get to it. If you could could could pull up Rattle again. Yes. So if you query something like that, if you if you write a a similar query, you're not gonna get anything. Right? You've got no data. Yeah. So you go to click, click on schema, and and this is where it gets a bit interesting because, Dgraph Dgraph does not follow the GraphQL schema. Right? K. Oh, sorry. Charles crying. Right. So let's talk about schemas then. What what what data do you wanna write? What what do you want to So can we, like
18:04 Working with DQL Schema and Indexing
18:36 let's just make up something really trivial. I I I'd like to just get write some data, clean the data, see how that workflow works. So what what's the simplest can we just have a schema where we we just store my name? Like Actually, go go to console. You I I'll show you this even. You don't need, like, a strict schema. Just click mutate. Oh, okay. Open opens curly brace. Set, curly brace Curly brace. And then underscore colon node one, n o d e one, yes, space. Oh. Yeah. Yeah. Yeah. It can be any name. You just put a variable there. Right? So
18:40 Writing our first records
19:20 that's an variable space. Angle bracket, name, close bracket. Put put your name there. I got it. Space space before Yeah. Yeah. Space. Yep. Okay. David and space, full stop. Yep. And then the next line Yep. Underscore colon node one. Give yourself give her a property that you're interested in. Right. You know? Full stop. And run this. Okay. Go. Oh, What did I break? Alright. Sorry. You need to put put your age in in cut quotes. Oh, okay. So let's try and understand that. So there's a braces I understand. Right? This is a breaking into a JSON style object for GraphQL. We're using
20:27 some sort of set mutation function. Yep. I'm not sure. The underscore just mean I I don't know what the underscore means, but I'm assuming from other programming languages adopt an underscore. It just means I don't care about an ID. I don't Yeah. You're absolutely correct. You you don't have an ID. Okay. And then that's one. Yeah. You call it node one within this context of this query. Right? You call it node one, and you say we'll set a new relationship called David a name. Sorry. And the value of that that that relationship is called David. Full stop.
21:01 Right. Okay. And this is this is tied to my age based on that node one as a common identifier? Correct. Okay. So what does that look like? Can we query this now? Yeah. Sure. It could just write the same thing that I give it a name. Give it a name. No. Just do no. No. Listen. Give give it a name. Give your function a name. My funk or something. Okay. I just like to call it, yeah, fetch. And then inside the braces, just write funk. Oh, yep. Parenthes and parents func space colon. Sorry. E q,
21:44 open, paren, and let's see. E q name and then David. Like that? EQ name comma David. Name comma David. Alright. Okay. So EQ is a function. We're passing in the name as alright. Okay. Got it. Yep. And then you need to bring back some data. So UID. Okay. No no no comma. Name age. Name. So. Alright. Run it. You see some very interesting things on the right. I forgot. Ah, okay. Right. So instead if I okay. So I think I understand the error rate. It's saying that we haven't we haven't told it to index on any
22:37 of those properties. It's not. Yeah. Exactly. Can we just remove the the equals and pull back all data? I believe that will not I believe that will not run, but you can try it. Yeah. Yeah. So you you need something. So has, just func has type has yeah. Has, open brace type TIP. Yeah. Nothing's showing up because there's no type. Right? Okay. So you say you've not actually created a type. Alright. So you you can type func has instead of has type, you just type, let's see, any of terms, I guess. Oh, no. No. You cannot. You still need
23:30 you need you still need an index. So just go back to your schema. Yeah. Okay. Now you see age and type. Right? So you need to yep. Okay. You figured it out. So click index, update. It's very easy. Oh, type here. You should type this string. Yeah. I just keep clicking things and then see what happens. So, you know, just tell me when I do something. Okay. So you you want exact or hash? Yeah. But exact only basically allows you to match on on on EQ. Yeah. What we what we did there is we're modifying the schema. We set the type
24:08 of name to be a string and then in order to index it, it has to know how to index it for the lookup that I want. Kind of familiar with these terms a little bit. So exact, I'm assuming means if I do David, I could find it but I wouldn't be able to do a wild card match on DAV or anything like that. Correct. Okay. Cool. Well, I mean, I'm just gonna keep clicking on stuff. I'm gonna see that my age be an integer. I'll just index that too and then click update. So let's see.
24:39 Does that mean that I can go back to your EQ function? Yeah. And the the David. Okay. If you if you scroll down, you can see the history as well. So Oh, yeah. Cool. Nice. Tada. There you go. Alright. I was paying attention. Okay. So Now click on the click on the little thing that says showing one note and zero edges. Yeah. Yeah. Click on that. No. No. The little box. The the box. Click on David. There we go. There you go. So like I said, all all all nodes are basically an unsigned int, and we call that a
25:18 u UID. Right? And this UID has this node has pro related properties of age and name. Let's just add some more data into this. Okay. Just put my name, g x y, and put put a thousand for my age or something. Right? If you run this you see, it's still called node one. Yeah? Yep. But if you go to query and you run this Oh. Sorry. So has name. So it changes to has name. Yep. Ah. Nice. So so did you see the pop up that says has name and then, yes, like, angle angle brackets
26:13 in in the suggestion? Yeah. I did. So when I did this, we had these yeah. I did notice that. So so the the bottom one's the canonical form. That's the prefer that's the the good form that nobody actually uses. As far as I've seen people type code, people don't actually do that. But I personally do that. So Okay. So is there, like, are there any advantages to using the canonical form? Like, does a No. You you won't you won't run into, like, what's it called, escaping issues. Ah, right. Okay. Gotcha. So I see that we've got back two
26:54 nodes and I like that I can drag things about which is Yeah. You can see things. Superficial, but it's cool. But I noticed we don't have a relationship. It's Yep. Could say that one? Yeah. We can. So let's go back to mutate. Okay. Now this is this is where we need to think about it. Right? So instead of underscore, you need to know you can click on the image. You can click on your ID or my ID. Mhmm. So you can see u x UIDs OX 1, and then my my ID would be UIDOX 2. Uh-huh. Okay.
27:01 Adding Data and Relationships in DQL
27:37 So fill in the first underscore with u OX 1. Alright. Okay. Cool. And then change the name of the relationship. The o x one needs to be in in in Oh, yeah. Denise in in angle brackets. Oh, angle brackets. Sorry. Angle brackets. Oh, the canonical form. Yep. And, you don't need the colon thing already because you know the ID. Right? So Ah, yeah. Okay. Okay. So you only need one one. Right? And, say, live streams. And then instead of q x y, just put o x two. Yeah. Run it. That was quite intuitive. I I like
28:23 Okay. Now go back to the query. I run this query again. Oh, we have to that has to pull out livestreams? Yep. Yeah. You figured this out. Well, that's interesting. Ah, right. Sorry. Sorry. Instead of has name, just put has livestream. See? It's only one. So if you go to livestreams and open a curly brace there Mhmm. And put UID name and age. I knew you were gonna see that. Oh, there you go. Would I use the canonical form here too? No? If you want. I just I said it was an option. So I Yeah. Yeah. I don't I don't
29:14 use the canonical form in queries. But Ah, okay. Okay. I won't do that then. Alright. And then we have a lane. Yeah. And it's telling me, yep, we have a a livestream. Cool. Now we should learn how to constrain the data. Okay? Can you what do you what do you mean by constrain the data then? Well, put more structure. Introduce a notion of types, I guess. Ah, right. Okay. Gotcha. Okay. Alright. So so so this is the best part. Right? Go back to go back to mutate. Okay. Now if you go o x one, change livestream to reads,
30:05 and then put a book name, any book that you in in strings. Okay. Just click run. So now you can see that there's two separate sets of data. Two two two separate concepts. One's a livestream edge. One's the livestream of type edge. One's an edge of type livestream and the other's an edge of I see you've got good taste in science fiction. Very good. Very good. Yeah. I just had a I was I wanted to add too so that we could see because I I really like this view of the data, the very visual view of
30:44 the data. And I thought we'd add two so we we have a little bit more going on there. So and I do love tuning the body problems. So So if you click reads, you create a new so so you what you can do is you can create a new field, call call it reads. So you want me back on mute it? No. No. No. In in in the query stream. Right? So so k. So we're doing reads. Yeah. And then UID. Yep. Run it. But we still have this predicate here. Right? Oh, yeah. Yeah. Yeah. So I just changed
31:20 that predicate to to has type again. Oh, has type. Okay. I think has type will not work. Sorry. Yeah. Has you've not introduced type, so equals David. Okay. So name David. There we go. You click on David. See? There's only one reads. Yeah. I thought why? Types. We need types. Right. Okay. Anyway, so so if you go underscore go to UID under reads under reads and change that to underscore underscore underscore expand all x underscore underscore expand bracket all. Oh, wait. Pardon me? Pepper and oh, yeah. Yep. Yep. Run this. It should I think that's
32:19 the way the one second. That's okay. Expand predicates. Sorry. It's expand underscore all. I keep forget I keep forgetting where so it's expand the the the the the function is called expand Oh. Without an underscore? Yeah. Underscore underscore underscore. Okay. Expand and then open parens and then underscore underscore all? Is this one underscore? One underscore. Okay. Got it. One underscore all underscore. Underscore. Yep. So you should oh, okay. I'm surprised, but yeah. But the idea is that it should be able to give you all those. Anyways, we'll we'll come back to that later. We'll look
33:09 Structuring Data with DQL Types
33:09 at the schema right now. Yep. So so the schema is basically where your data lives. So if you click bulk edit, do you see bulk edit? Yep. Yep. Cool. So this is this is there you go. So line seven to line 10 is how a type definition looks like. Now this type definition is, line seven to line 10 is by default in all dgraph instances. It allows dgraph to manipulate, GraphQL natively. So I will talk about native GraphQL in a bit, but, let's talk about types first, shall we? So let's create a type called person
34:01 and create a type called book. Okay. Just follow the syntax above. Person. And then I have a name, so it's going to be a string index. Oh, no. No. That that's that's sorry. That's the you you're using the GraphQL syntax. For sorry. My bad. So this is this is just straight up GraphQL then. Right? Here. Yeah. That's that's straight up GraphQL. So we're not gonna do that. Let's see. Just just just type. Yeah. Well, that's that's a person type, and then we wanted to book, which has a name. No. No. You I'm sorry. My bad.
34:45 Yeah. So so move name out of the out of the type. Of the book type? So so move name out of that that I let me type it for you. Yeah. Let why don't we move this over to Versus Code, and then I can always paste oh, you're doing it. Okay. Yeah. So so it looks like this. Right? Okay. So you've already got name, so you don't have to write all those. Okay. Okay. So I understand. So basically what we're saying is these are the graph q l definitions of types. A person has a name
35:44 property, has an age property, the book has a name, and then we specify something in Dgraphy syntax, which just tells the the type semantics and the index semantics for each of those properties. Exactly. Okay. Exactly. My my my immediate question then is what if I have a common property across multiple types that need to be indexed differently? Ah, so you need to actually give it a separate namespace. So so I will walk you through that in the GraphQL example. Okay. Okay. So so if you use GraphQL, all you're working in right now is DQL. Right? So you're working in the lower level
36:21 stuff. We we've sort of moved away from that. We we we've started telling people that, you should start with GraphQL, and and when you need more power, move to DQL. I personally find that a bit disorienting because I start with DQL and then move to GraphQL. Right? So, yeah, so so you just basically create a new predicates on in France called person dot name, for example. Uh-huh. Index it one way, and then book dot name, you index it another way. So does that mean that I can just do book dot name like this? Yep. And then say it's also a string, but
37:01 I wanna do a different index semantics and say I do Hash. Hash. Yeah. Yep. Can I just hit apply on the schema? No. You have to actually change your book line 19. I thought does it become book dot name? Yep. Yep. Apply schema. Sorry. Can we go back to bulk edit? Oh, I wanna add the the edges. Oh, yeah. Yeah. Yeah. Sorry. So so so how did book fly out there? Was it Yeah. Think it's ordered it. Right? This is alphabetical order of the types. We can Yeah. Okay. Fair. So so under under type, under person. Sorry. Yep.
37:25 Handling Schema Evolution & Data Conflicts in DQL
37:45 Go down and then put reads. No. No. As in just above just above. Just just, yeah, under h and put livestream. No. No. You don't have to open that. Ah, okay. Livestreams. Yep. So livestreams already exist if you look up there. Yeah. So just change reads to the same as live streams as a as a co as a list of UIDs. Yep. Uh-huh. Right. So so, basically, that's it. You've basically created, a definition of what a person is, and note that you created the nodes before you created the schema. So if you click apply schema
38:33 Schema. Yeah. Okay. Fair. So you'll you'll need to you'll need to yep. That's that's understandable. So just let's just say read you you only read one book. Okay. So like that? Yep. Or no? Yeah. Yeah. That works. It it it still starts in the same. Schema change not allowed from scaler to your ID or base version, but there's data for the Okay. Just click cancel then. So we're gonna do a very dirty trick that you probably shouldn't do in in real life. So click, book. Click reads. Sorry. Reads in the predicates. Yep. Change it in here. So type change it
39:24 to straight, UID. List. Click list. Yep. Sorry. Sorry. You might wanna drop data first. You've got data as is, so just click drop. Yep. Okay. Sure. Right. Oh, dear. And just do that thing that you just did, like reads. Yep. And this is just because I've been kind of making you make this up as we go along and building the schema that we have not really thought about. Right? So this is Yeah. We really should have talked about what we were gonna model first. So yeah. Oopsie. No problem looks like. We've got a Okay. So just to understand what happened there is
40:10 that we were modifying our person. We wanted to associate the live streams and the books that we read here. And then when we were trying to add the index, I was just bailing because we arbitrarily throw in on some random data and it We just throwing the literal native stream. Right? So it's not like an not not a node. It's just literally a string. Exactly. Right. Okay. That that makes sense to me. I understand that the the I understand the problem there. So we've now got a schema where we're defined. So we're kind of cherry picking some of the fields that exist
40:40 in the DQL format. We're starting to encapsulate them in a type called a person in a book and we've now added a few indices that allow us to connect the dots on that. That's kinda where I think we are. Right? Okay. Yep. Now I'm assuming we were doing that so that when we come back to the reads here Yeah. You you need to go back to the mutate section too. Oh, We don't have any books anymore, do we? Yeah. Yeah. So so back up here, you just go align above it. Mhmm. Sorry. Align above. Yep. So underscore
41:13 press enter and underscore node one. Underscore colon node one. You're missing a colon. Yep. Yep. Yep. Okay. That syntax again. Okay. Yep. And book dot name? Yep. You might wanna angle angle bracket angle angle bracket. So Yep. Get it. Alright. So now we're creating our books. Right? So I can see book dot, and I can add in the three body problem again. Yep. And so that's gonna create two book dot name You need the different node ID. Node one, node two. Of course. Yeah. And I'm assuming we can't do this yet until we You can. That's that's what I'm
41:56 I want to tell you is that you can. So it just goes instead replace that empty empty thing with node one. Ah. Ah. Okay. So we're using the intermediate ID and the set syntax, and that's just gonna be propagated down to these. Mhmm. Right. Okay. Can I have go on this? Yeah. Yeah. You can run. Oh, I'm sorry. You need angle brackets, I believe. Oh, on the on the node one and node two. Okay. Node one and service center. Let me recall. I have I don't quite remember this. Sorry. My bad. Look. Listen. I usually remember these are things. I work on
42:46 these. I don't remember even what I had for breakfast, so I'm I'm very comfortable looking things up every time. Yes. Yes. Yes. Okay. So instead of this, you need to put underscore code underscore colon node one. There you go. And remove the angle bracket. No. No. Remove the angle brackets. Yeah. Because I'll okay. Right. There you go. And you can have node one that comes you can you can define node one and node two after after after that. It'll still work. It's just that practice too. Cool. That yeah. That makes that makes sense. So now
43:24 I'm gonna just make stuff up again. So I'm gonna say the book that'll be booked on them. Right? So Yep. We don't use the canonical in here. Livestreams hasn't changed. Ah, look at that. There you go. And to make it to make it like a proper graph, so you can add, you can add oh, I want to show you this as well. So go back to mutate. Yep. This is very important to know. Right? So keep the first two lines and change the change the third line to o x two. So that's me reading, Dune.
44:04 Mhmm. And close, yeah. And if you run and if you run the previous, run the query again, and under livestream We have to remove this. Right? No. No. No. You don't have to. Just under livestream, just put reads. Yep. And then UID and book that name. UID is not necessary. Right? So you'll note that I'm connected to a different different dune u 85. Sorry. It should be booked up name, not not name. Oh, yeah. Line 14. Yeah. Yeah. Right. So so you run. I'm connected to a different Dune, and you're connected to two different three body
44:57 problems. So if I understand that correctly, that's because this is also new in there every time? Correct. Correct. So this is something important to note. It it run you you will run file of it if you don't pay attention. So Okay. Let me I I guess I've got two questions then. It's that when we're using the mutate syntax to add new reads Yep. Can I also do a query to fetch the books that I'm looking for? And also, is it possible to add some sort of unique constraints so that I don't end up with two books with the same name?
45:40 Yeah. So those things are you you can do all those things, but you generally need some external help. Okay. So so you, like, you you you would not be doing this in Rattle. You would be doing this in via programming language. Yeah. I guess this is a very contrived situation right now just to kind of explore the tools. This is not a workflow that, by any means, we would suggest people do and Yeah. To manipulate their data, of course. So so I I personally use Rattle because of its crazy awesome graph. Like, I can visualize, and that's crazy.
46:10 Visualizing DQL Results
46:16 Right? So this is a graph database in in in its in its core is that you work on a graph. Right? Okay. Yep. Yep. Yep. And and and the thing about this is all nodes share the same ID route, like UIDs. So if you look at if you look at all your UIDs for each of the node, they're they're in increasing order. So you've got David as UID, o x one, me as u I u o I o x two and all that, so on and so forth. Yeah. So this is a graph database in a nutshell.
46:55 Now with with graph with Dgraph, because it's it's it's distributed from from out of box, it can get quite intimidating to to actually run it on your own. Mhmm. The the standalone docker image is fantastic for for experimenting, prototyping. You know? But, you kinda need to read carefully the, deploy section of the docs on on on we've got certain recommendations. So you need to have, like, three nodes of alphas at least in the production system. You need to have 32 gigabytes of RAM minimum. It's quite resource heavy. So 32 gig of RAM. Wow. Yeah. Yeah.
47:43 Yeah. We we we've got people running out of memory because graphs get very huge very quickly. And, one of the things that that is beneficial in in a in a SQL database is compaction. Right? Because it's table, you can very easily compact it. Whereas graphs are not so easy to compact. From from a graph have to store the indices in memory at all time, or does it fall back to disk? So it it falls back to disk. Behind the scenes, we use something called Badger. It's a key value store to store all the self information.
48:21 And we've got also Ristretto, which is a caching system, which is pretty awesome. If you're into if you're into systems programming, it's pretty awesome. But what I'm trying to say is that it and this is not a sales pitch. Sorry. It's it's gonna sound like a sales pitch, but it's not. Because I use slash myself. Right? Slash is the hosted version. Alright. Okay. This is the thing you asked me to open up earlier. Right? Yeah. Slash is the hosted version, and and the direction the business has gone is to to tell you that, hey. Guess what?
48:40 Slash GraphQL managed service
48:57 GraphQL is a first class citizen in a graph database. So think of slash GraphQL as as a as a, I don't know, RDS Amazon RDS, for example. But yeah. Like, you you you don't need to sell me on the merits of a of a SaaS based database product because, I mean, I used to work for a database company and and flux data who are Yeah. Founders and maintainers of influx dp. Like, running stateful workloads and production, especially if you if you don't have experience of what's going on underneath the hood. Like, I totally get it. It's
49:28 really difficult. And I would encourage people to use these test product as often as possible. So I I'm convinced like if if slash graph q l is just gonna make my database stateful site easier, then I'm all good. I'm hoping what you're gonna tell me though, there's a very generous free tier that I can check the table. Very generous. You've got 10,000 credits, and 10,000 credits is is is a lot. Right? So I managed to port over port over a a a a Postgres database, and I have, like, what, 9,000 credits remaining. So this is rate limited to one request a second
50:04 after. Oh, so I could still use it after those 10,000 credits. Yeah. Yeah. Yeah. I'm just I'm pretty sure my production applications are okay with one request a second. I mean, I can't surf at any traffic this other than, well, me. So that's fine. But what is the 10,000 queries mean? So so you saw those you saw those notes that you just queried earlier in Rattle? Yes. Every GraphQL query can be translated to a query that touches notes. Okay. So for yeah. I'm not quite sure what the exact numbers are, but I think for the first
50:40 hundred nodes that you touch is one credit. And for the for the one hundred and first to the first thousand nodes is the second credit or something like that. I leave those things to the bean counters. I'm Okay. So You know, I've I've got a degree in mathematics just to to avoid doing these tough things. So anyway, click launch new back end. Next to slash GraphQL. Yep. Yeah. I was trying to work out why all of this was grayed out, but I guess I need to tell it to do something. So Yep. Okay. So let's call this livestream.
51:18 It's optional. I think Frankfurt's closest to you. Yep. Let's go with Frankfurt. A free plan. Launch. So this is spinning up my own Dgraph instance on AWS for me. This is not like a shared multi tenancy global platform provided by It's your own. Main. Yes. Okay. And, I think if you if you put it nicely, they'll they'll actually connect you to anyway, the back ends. I think you need to refresh the page. It should be spun up by now. And I think this is where oh, no. Okay. This is where GraphQL, Dgraph actually really, really shines. Right? Once it's spun
51:59 Exploring Slash GraphQL with Sample App
52:09 up, just click schema. Okay. Click schema. Right. There's no schema right now, but the best part is you can write your own GraphQL schema. Okay. So so previously, you were writing, DQL schemas. Right? You you're writing. Right now, let's just write GraphQL schemas. Okay. If you want, we can do the same book example. So we start with type person. Do we is there a schema that's in the docs that's recommended to use or get a starter guide around for that rather than? Yeah. Sure. Just go to GraphQL, I guess. Click on GraphQL. Click quick start.
52:56 Oh, well, d graph sorry. Sorry. Go go back to slash. It's very interesting. Right? If you go back to slash, click one click apps on left. So Ah. I'm immediately drawn to the Pokedex, but Click on the Pokedex then. Yeah. Have a look at the schema. So deploy it. Oh, it's okay. So I'm gonna get a new Yeah. Yeah. Let's do that. Get my own Pokedex. So I I probably should have actually have clicked the view code, but just what this spins up. So these these one click apps are like schemas that are defined up front with some
53:49 data. I'm assuming that I can just immediately query, modify, etcetera, etcetera. I'm not sure about data. I think the schemas are there. Schema will be there. So I'm gonna have to create my own Pokemon, but I I Yeah. So you can just write your own mutations and write create own Pokemon Okay. Which is which is what every kid has done. Right. So I go to schema. So oh, right. So you've got wow. Okay. So we've got an enum so I can specify the type of the Pokemon, and then I can give it a name or images
54:26 and whether it's been captured. Yeah. That makes that's like a Pokedex. Yeah. It's a Pokedex. I just clicked on stuff now for the for the the sake of clicking on it. I'll stop. So let's I'm assuming you're just gonna tell me to go to API explorer. Yeah. Just just click on the API explorer and just write a query. You can you can I personally use the API explorer quite a lot? Oh. Data's there. Data. Yeah. And image URL. Oh, one credit. Yeah. So it touches all these things. So so dgraph supports two language. I I I two
55:13 languages I told you from the start. Right? DQ, and now you're seeing the, the killer feature, I I I would say, is that imagine you just write an an a schema, write the the GraphQL query, and then you go a front end that comes in and just points to slash GraphQL. Yep. That's that is power. You will eventually need to start using DQL because there are things that GraphQL cannot do just yet. And I think I well, let's see if my naive understanding of that is correct then. Like, even though GraphQL is called graph QL.
55:20 Dgraph's Native GraphQL Benefits
55:51 I mean, it was traditionally run against relational data structures or even JSON or document based infrastructure. It was never initially actually used against the graph DB to the best of my knowledge. This is why people always talk about the n plus one problem with GraphQL lookups is that when The over fetching bits. Yeah. When you when you do like subtype and then that has subtypes and then that could have subtypes. So it's like generally that query is then doing a lookup here, a subsequent lookup here to the database and then a subsequent lookup here. Does that problem go
56:23 away with Dgraph? Yes. Because, you know, your your underlying structure is a graph. Yeah. Unless you do something funny, which is like a take a table structure and try to structure it as a graph and and funny things happen. Okay. So I I understand why the DQL extensions need to exist because because GraphQL wasn't built on graph databases. There's a lot of that feature and functionality that just doesn't understand. As as the graphical spec being modified to accommodate some of these extensions or do you always see the the a DQL just being something that is required at a certain stage
56:59 of your adoption? So I think over time, you're gonna need custom resolvers for any any large enough system. You're gonna need custom resolvers for your for your GraphQL. Okay. And that's where you end up having to learn, write DQL, I guess. Okay. I guess that that yes. That that makes sense to me. So we've got our slash GraphQL. How do oh, I can just click and run DQL query? Yep. You you will get pulled onto Rattle. And yes. Oh, hang on. You're on play.dgraph.io. Okay. So if you go back to your own Rattle My own. Yep. Yep. Go back to your
57:44 own Rattle and click on local host a t a t on the top left. You can choose to say connect to to to your slash GraphQL. I don't remember the Yeah. I'm gonna find the Go go go to the other Rattle. Go to the play Rattle, the the the site the the new Rattle. Not I don't think that's the correct one. You go to the tab next to it, and then click on that, and it actually Alright. So that is the URL I copied, but there was API key. Yeah. That's oh, there we go. So now you are connected to your slash
58:28 DraftQO instance from Rattle. I don't believe it yet. Hold on. Let me copy where is it? Oh, sorry. Caveat. Rattle is only DQL. There are plans to there are plans for you to actually write GraphQL in Rattle soon, but the dev team's a bit swamped right now. Oh, yeah. Okay. So, like, does Rattle provide the same like, I'm I'm not sure what tools that's this looks like one of the, you know, various GraphQL explosions. Yeah. You can use GraphQL to connect to this. Yeah. Does Rattle provide some sort of query exposition thing or browser like we have here? You
59:14 know, I I I can see the filter. I can see the schema. Can I do that with Rattle? You can see the schema by clicking on schema, for example. Click refresh scheme. I don't think it like my random setup, so I'll just use this one. Yep. Schema. Okay. See? All all the Pokemon, like, schemas have been nicely namespaced for you. Okay. So I think the problem with my rattle then is that I just didn't have auto complete because it wasn't actually connected. So this Right. This this is actually working there. Yeah. Cool. Oh, no. Sorry. Sorry. You're Yeah. You're in a schema
59:57 query. You need to give a function name. Oh, yeah. Alright. Okay. Like like traditional. Pokemon. So that was something like this, and then we also had to do funk Funk. Has type? You don't have okay. So you you I can you can type instead of has type, you can just do type bracket poke type bracket Pokemon. Alright. Okay. Type Pokemon. Pokemon. Right? And you should run. Woah. There you go. Okay. Cool. So we do get quite a fair bit of data then. Yep. Let's see. Pokemon. That's not look like a 51. Yeah. I'm not sure. I don't know if
1:00:56 any of them are captured. So can I change this type? Like, what if I want only wanna put a captured true? So you can so in in DQL, you can you can do something called filters. Mhmm. So type Pokemon and then space filter. No. No. I sent the line two. Sorry. Oh, okay. And then after the after the close-up bracket Here? Yep. Add filter alias filter. Alias filter? The at symbol. Sorry. Yeah. The at the at symbol. At at filter. Yeah. And then open bracket. Yep. And then you can type things like, e q. You need e q. You need
1:01:53 a function in there. So e q, pokemon. Captured it true. Yep. Oh, I haven't captured any Pokemon. Yeah. So if you click on the JSON and request, on the right, so JSON, it'll actually tell you, okay. It there was no, like, hidden errors or anything. So, yeah, that you did not capture any Pokemon. Okay. Well well, I guess that gives me something I have to do at some point. So the DQL syntax then is we can just do filters. We can use any of the functions that are available. Did it offer to yeah. No. It doesn't auto complete the functions.
1:02:34 So you just It does. It does? It should auto it should auto complete, at least my my mind does. Yeah. Maybe it's just me. I'm not sure. How do I get a list then? At least in the is there a list of functions I can get from the documentation? So, yeah, it's a yeah. Go to documentation. Go to DQL. Go query language. Yeah. Functions. Ta da. See, I I love it when I can just go to the talks and kinda quickly find what I'm looking for. Okay. So we can link this all of the terms. There's the filters,
1:03:10 DQL Functions & Advanced Features (Geo, Language)
1:03:12 regular expressions. Alright. Okay. So there's There are a lot of crazy things that you can do, like aggregation, which you can't do in deep in GraphQL. There's also full text search language specific. Ah, yes. Yes. Yes. So so so if you put an alias, and then a language code after a string field So a string field can have multiple languages. I'm trying to see. Does it have an example of this? So yeah. Yeah. It should. You can go to Oh, yeah. Yeah. Okay. So we do all of. Let me zoom in on that a little bit.
1:03:58 Yeah. If we do all of match and then name and then at e n, so we can specify the language and that changes the semantics of the match, the equals, etcetera. Yep. Yep. That's very cool. So that's that's one of the extensions that that DQL has that GraphQL can't do, I guess. Yeah. That that definitely would not be possible using GraphQL things at all. But it's it's nice that that is there. Does that change the way that my strings, like, the index side, they have to specify the the language? Or Yeah. You do. If you go go to the original rattle, your
1:04:40 local host rattle you can go to rattle and any rattle. Go to schemas. Yeah. Go to this one because it's currently working. Yeah. Click on, click on the name, for example, and you can click on check on lang. So it it will now index based on how many languages it is. So if it's in there there is no language, then it's treated as a, I believe, English, I think. Okay. Yeah. I'm not sure. Okay. Cool. I like that. That's a very interesting thing that I hadn't really considered. Awesome. Yeah. Dgraph also supports things like geo,
1:05:23 like I did notice that on our was it on the console? Yeah. There was this geo thing here. I I'm assuming that just means that latitude, longitude, types of Correct. Properties are just naturally supported, natively supported? Natively supported. Yes. So this is saying that I'll read this. Objects must contain a predicate or alias location. Okay. So as long as I have something called location that looks like a lot long, it's gonna map that for me on this? Correct. Does that I I'm assuming that I can also query that and say, show me all of the
1:05:57 the nodes that have some property within a certain radius of this location. Like, I wanted to find all of the bars or restaurants near my city, this natively works. Right? Yep. Natively works. Cool. Awesome. Joe is pretty awesome. I've not actually had I've not actually personally had the the opportunity to play around with Joe, so I can't tell you much about it, but I know it works. Yeah. So I guess, I mean, I'm not gonna make you do it now because of of timing constraints here, but definitely something I wouldn't be playing with in the
1:06:34 future. But if I wanted to store if my capture of a Pokemon was an actual type, could store the latitude and longitude. Like I'm thinking of a Pokemon Go, if I'm walking down the street and I Yeah. Capture Pokemon, I could store that lat and long and then I could actually probably pull out what I caught within local vicinity. That is correct. Awesome. I think this is a really, really cool tool and I definitely understand the applications of a graph database for certain data models and how that is gonna give me a lot of benefits to the
1:07:03 way that I work in slice and dice the data and all of that. Very exciting tool. Maybe we could talk about sorry, before we move on, is there anything from the rattle side or the documentation or the slash side that you want to cover before I can move away? I guess I no. I'm I'm good. Alright. I I there there are a lot more in documentation. Like, you can do multiple query blocks, but you can do that in DraftQ as well. Yeah. I I the way I see it is if you want to launch your apps
1:07:36 fast and your data model is sane, use slash. Right? Okay. Sorry. That sounded very salesy. I'm not I'm not supposed to sell you anything. Yeah. So but that's what I've been doing. Right? So I've got some personal projects that I run, and I just use slash. And strangely, it's free. So you know? Yeah. I I mean, I think this has been a really cool introduction to to Dgraph and hopefully just the general concept of of GraphQL to the people that's new to it and then graph databases beyond that. I think I do have real world applications
1:08:12 for this that I think it would be really cool if I could start to build those out for our, you know, our team at Equinix Meta, we have our own tooling, our own platforms. And I think a graph DB would be really cool here. So maybe, you know you know, sometime next year once we have that working, maybe it would be cool to have you back on and do a bit of a deeper dive into some of the things that we're doing and optimize Absolutely. But I think it's an introduction. This was was fantastic. So I'll down a share and we'll
1:08:38 just, know, what's you know, what's is Dgraph a fast moving project? What's coming next? What's what's changing? What are the team working on? Like, what what is the focus right now for for Dgraph? So the the the main focus is to make GraphQL work even better. There are a lot of a lot of extensions, cascades, and stuffing that are coming in the next version. Supporting, for example, one of my biggest requests personal requests is supporting XIDs. So so in in Dgraph terms, XIDs are external IDs. So you've got you've got Postgres database with a int,
1:08:50 Future of Dgraph & Community Resources
1:09:19 and you can just annotate yours your your your your GraphQL schema with at ID, and then it will sort of in implement all the constraints of when ID is. Right now, the ID the at ID only works for strings, but I think in the future, integer types are coming. So so that that basically allows people to move from one database to another database quite easily. There's a lot of work done. Most of the work has been done most on on on on GraphQL and improving the things that you can do with GraphQL. If you if you go back to slash,
1:09:56 you you'll see that, like, Dgraph basically generates all the GraphQL functions for you. So so the the query, my Pokemon, for example, is generated by Dgraph. When you put when when you create a a GraphQL schema, it creates this function for you. Uh-huh. Okay. Yeah. And and more more being created. So so on later versions of of, dgraph, it also generates, for example, get Pokemon. It's self query Pokemon. It's get Pokemon where you can get just by an ID. And then if you if you look at the bottom Oh, where's the here? Yeah. At the bottom, it shows mutation. You
1:10:43 click at choose mutation and add. Click on the plus. So you can you all all these add, delete, and update, they're all automatically generated by Dgraph. Ah, so I can actually see captured let me run that first. Okay. So I'm gonna I'm gonna capture a Pokemon. You you want you want the EU IT? I was gonna add a new Pokemon and just mark it as captured. So now I'm I think I think what I'm doing is adding Pokemon called Rawkode, which is now being captured and I'll add the image URL Pokemon. I'll be a bug Pokemon. I don't
1:11:30 mind being a bug Pokemon. At least like that ID was actually maybe required. Yeah. It is. So I'll just be 32,000. I'll assume that's available. Too big. It is it is acceptable. Yeah. It the the reason why you're having that is because you need to yeah. It's no. UID is ID. Actually, it's it's ID. There we go. Yeah. I think this will fail because you forgot to put square brackets outside of the input, outside of the the object. So add Pokemon takes an input of a list. Okay. Right now, you've got a list of up you've you've got a single object. Yeah.
1:12:11 There you go. And and you should delete the top query Pokemon bit bit. Yep. So And now you need to you need to tell, you need to tell the GraphQL thing what you want out. So add Pokemon bracket. So Like that? Now you can type num UIDs. Sorry. I didn't understand that. I can type num UIDs, n u m. Okay. K. Yep. There you go. So that tells you how many was added. If you run that, that should tell you one was added. Oh, so I think this was supposed to be a left based on yeah. There we go. Yep. Alright.
1:12:57 Let's I'm gonna delete this. I'm going back to my query and and oh, no. I needed it from here because I want the geo no, not geo. I want a captured query which I already did. So I'm just gonna hit run. And recognize I I changed the the filter. We never actually run. We did one that filter, didn't we? Pokemon captured true. The the k. Go scroll down to your history, I guess. One of the filters work. The first first filter. Yeah. Click on it, and you should click run. Scroll up. Click on it and click run.
1:13:49 No. No. Don't yeah. There you go. I'm making things difficult for myself. Okay. There's a way that that's nice. I I like this this slash interface with, you know, the clicky bits. It makes it just a lot a little bit easier. And I actually really enjoyed that. But if we were to rebuild that query, right, if I were just to say show me captured, I can even just do the filter through this. Yeah. You can do the filter on on So I can just say, get me captured Pokemon. I want their ID, the image, their
1:14:21 name, and their types. So go Oh, you want to filter with captured false. So Oh, I could have changed it to here too. Oh, I updated it there too as well. Okay. There we go. There you go. And it cost me another credit, but you know, I've got I've got plenty left. It's not a big deal. Yeah. Yeah. So I think that that's last tooling is really nice and intuitive and just simplifies like, know, a lot of people have your especially if you're new to GraphQL and you wanna start experimenting this workflow. Is really nice. And I think it'll just
1:14:58 ease people into how they work and construct their own GraphQL queries over time. Yeah. Very cool. Awesome. Well, let me pop that away. That's been a really cool look at Dgraph. I can see a lot of power, lot of flexibility. I love the fact that I, you know, even as we were making stuff up at the start about what our queries were and what our schema was, it really did give me the flexibility to go in and add those indices retrospect, which I love. Yeah. The the ability for me to manipulate and change that schema. I think it's really
1:15:28 cool as well. Great. I'm gonna have to keep playing with us. I will definitely get something worked out for next year where we can do this deeper dive into DQL and more real world applications. But I think it's an introduction. This is fantastic. I just wanna say thank you for staying up so late. No problems. Now can I can I can I ask for something? Sorry. Yeah. Of course. So so there's a website called discuss.dgraph.io, which is where the community lives. Most of the questions are there. If you if you if you come to discuss.dgraph.io,
1:15:59 you ask a question, you're probably gonna get an answer within twenty four hours or so. It's quite active. So yeah. You know you've got a problem, just pop right in there. We're also running a conference, like Go system conference, if you do Go programming. You know? Go what's it called? I I don't know the URL. Sorry. Systems. So it's it's on the it's on the front page of of the discuss. There you go. Oh, it's right there in front of my face. Right. Yeah. Yeah. There you go. So we can click on yeah. Oh, that's an image. That's that's the
1:16:39 link. Yeah. But, again, this this is really spooky stuff. You know? Yeah. It's online. There are some really, really cool speakers that we've landed. Yeah. If you're into systems programming at all, check it out. Awesome. Okay. So, yeah, if you've got Dgraph questions and you want some help, go to the discourse forum at discuss.dgraph.io and systemsconf.io if you're interested in going systems programming. Awesome. I'll get registered for that after this episode. That's the thing with like with all these virtual conferences this year, there's been so many of them. It's been fantastic that I could just sit and watch so many conference talks
1:17:21 online. Really, it has downside as well and that there's no too many technologies that I wanna go play with. Yeah. Know. That's a good problem to have I think. Alright. Thank you for that. And and thanks again for staying up late. I know It was a pleasure doing this. It was fun. Quite fun. Yeah. Awesome. Then I look forward to having you back. Have a a great evening and I'll speak to you soon. Have a good day. Thanks. Bye.
Technologies featured
Meet the Cast
Stay ahead in cloud native
Tutorials, deep dives, and curated events. No fluff.
Comments