WEBVTT captioned by sachac 00:00:00.000 --> 00:00:08.555 Hello. I'm Andrew Hyatt. I've been working on Emacs, 00:00:08.556 --> 00:00:10.539 with Emacs, and to some extent 00:00:10.540 --> 00:00:15.272 on Emacs for a while. I've written the WebSockets library 00:00:15.273 --> 00:00:20.045 and Emacs calc tutorials. I've enjoyed use of 00:00:20.046 --> 00:00:24.640 many of everyone's incredible packages. 00:00:24.640 --> 00:00:27.132 So my thesis for this talk, why I'm giving this talk, 00:00:27.133 --> 00:00:29.060 is that I'm interested in SQLite. 00:00:29.061 --> 00:00:34.953 I think we should be exploring SQLite for applications 00:00:34.954 --> 00:00:37.482 in ways I think the community has shied away from. 00:00:37.483 --> 00:00:41.950 I'd like to introduce the triples package as a way, 00:00:41.951 --> 00:00:47.664 both easy and with interesting functionality, 00:00:47.665 --> 00:00:49.153 that will allow us to build extensible databases 00:00:49.154 --> 00:00:52.582 in a way that is, I think, 00:00:52.583 --> 00:00:56.220 a little bit unusual and perhaps compelling, I hope. 00:00:56.220 --> 00:00:59.226 So first of all, why SQLite? 00:00:59.227 --> 00:01:06.080 Why is this good? Well, SQLite is now built into Emacs. 00:01:06.080 --> 00:01:12.216 So you get a few things out of this when you use it for data. 00:01:12.217 --> 00:01:14.580 First of all, it's a database. 00:01:14.580 --> 00:01:16.369 It's extremely good for data, of course. 00:01:16.370 --> 00:01:19.918 There's a simplicity to data manipulation 00:01:19.919 --> 00:01:22.027 using a database, compared to data manipulation, 00:01:22.028 --> 00:01:25.196 that is, manipulating data in a text file. 00:01:25.197 --> 00:01:31.033 Text files are really not built for data. 00:01:31.034 --> 00:01:33.140 So when typically when you need to do this, 00:01:33.140 --> 00:01:35.026 like I know Org Mode is-- 00:01:35.027 --> 00:01:38.116 which I'm a huge, huge Org Mode fan-- 00:01:38.117 --> 00:01:41.044 it's all about sort of data in text. 00:01:41.045 --> 00:01:45.375 It does work, but you certainly would be 00:01:45.376 --> 00:01:47.360 hard pressed to make sweeping changes 00:01:47.360 --> 00:01:51.953 to your database that is represented in text. 00:01:51.954 --> 00:01:53.060 It's just not well suited for this sort of thing. 00:01:53.061 --> 00:01:54.963 It would take a long time, 00:01:54.964 --> 00:02:00.220 where the speed of SQL is incredibly impressive. 00:02:00.220 --> 00:02:04.429 I think certainly Emacs is not known 00:02:04.430 --> 00:02:06.752 for being extremely speedy. 00:02:06.753 --> 00:02:11.905 I think the overuse of text 00:02:11.906 --> 00:02:14.613 is part of this. Of course, text and using text, 00:02:14.614 --> 00:02:18.467 using files has awesome advantages as well. 00:02:18.468 --> 00:02:20.510 I'm really here to talk about 00:02:20.511 --> 00:02:22.717 the other side of the coin, right? 00:02:22.718 --> 00:02:23.961 Everyone can judge 00:02:23.962 --> 00:02:24.645 those advantages and disadvantages 00:02:24.646 --> 00:02:25.416 and make their own trade-offs, 00:02:25.417 --> 00:02:26.020 but I want to kind of 00:02:26.021 --> 00:02:29.869 make the pitch for SQLite. 00:02:29.870 --> 00:02:32.860 So let's talk about the triples package. 00:02:32.860 --> 00:02:35.488 The triples package is a package 00:02:35.489 --> 00:02:40.419 that is designed to give you a very generic schema. 00:02:40.420 --> 00:02:42.005 You don't have to do, 00:02:42.006 --> 00:02:43.291 for most of the common operations, 00:02:43.292 --> 00:02:45.516 you don't have to write SQL yourself. 00:02:45.517 --> 00:02:47.924 A lot of stuff is built in 00:02:47.925 --> 00:02:51.035 and is based on a very generic schema. 00:02:51.036 --> 00:02:53.840 That is, it's a single table. 00:02:53.840 --> 00:02:55.229 That table has, of course, fixed schema. 00:02:55.230 --> 00:02:57.478 It basically has three columns. 00:02:57.479 --> 00:03:00.867 It actually has four columns. 00:03:00.868 --> 00:03:01.193 In this talk, I'm not going to get into 00:03:01.194 --> 00:03:04.123 the fourth column and why, but it's useful. 00:03:04.124 --> 00:03:07.710 So the three columns are subject, predicate, 00:03:07.711 --> 00:03:10.361 and object. This is what it's related to 00:03:10.362 --> 00:03:13.908 what we call an RDF format. 00:03:13.909 --> 00:03:17.139 These things basically describe a link. 00:03:17.140 --> 00:03:20.007 The link is from the subject to the object. 00:03:20.008 --> 00:03:23.955 The link type is a predicate. 00:03:23.956 --> 00:03:26.085 That sounds overly theoretical, 00:03:26.086 --> 00:03:28.032 but the point is that you can describe 00:03:28.033 --> 00:03:32.005 a lot of things with this format. 00:03:32.006 --> 00:03:33.329 You probably describe everything with it. 00:03:33.330 --> 00:03:39.226 It's very simple because the schema is fixed. 00:03:39.227 --> 00:03:42.773 It's only this kind of data. That means 00:03:42.774 --> 00:03:44.140 for your application, you define a schema 00:03:44.140 --> 00:03:47.326 in subject, predicate, object format. 00:03:47.327 --> 00:03:50.072 That defines what data you can use, 00:03:50.073 --> 00:03:56.069 what types there are, what properties they have, 00:03:56.070 --> 00:03:57.214 how you can use the system, 00:03:57.215 --> 00:04:01.006 and what is legal to do. And this is stored as data. 00:04:01.007 --> 00:04:03.890 I think as Lisp people, 00:04:03.891 --> 00:04:07.540 I think we're all very onboard 00:04:07.540 --> 00:04:13.912 with the fact that you have a simple way 00:04:13.913 --> 00:04:17.660 to express everything, and you don't have these 00:04:17.660 --> 00:04:18.924 two systems. In this way, 00:04:18.925 --> 00:04:20.871 you don't have to have code as a system. 00:04:20.872 --> 00:04:24.825 Do you have to load code to use the triples package 00:04:24.826 --> 00:04:27.916 to make sure your schema is obeyed? 00:04:27.917 --> 00:04:35.213 No, it's all just built in to this database. 00:04:35.214 --> 00:04:37.036 I'll describe this. As I said, 00:04:37.037 --> 00:04:39.860 it's a little bit abstract right now, 00:04:39.860 --> 00:04:42.048 but it will become a lot clearer 00:04:42.049 --> 00:04:46.778 when we go through an example, 00:04:46.779 --> 00:04:50.208 which we're going to do now. 00:04:50.209 --> 00:04:56.660 As an exercise, let's create Emacs bookmarks, 00:04:56.660 --> 00:04:57.345 which basically are three things: 00:04:57.346 --> 00:05:01.038 a name, a file, and an annotation. 00:05:01.039 --> 00:05:02.364 I may be missing out on functionality. 00:05:02.365 --> 00:05:04.772 Of course, everything in Emacs, 00:05:04.773 --> 00:05:05.140 everything has lots and lots of functionality, 00:05:05.140 --> 00:05:08.049 but let's just start with this simple thing. 00:05:08.050 --> 00:05:11.100 First of all, we're going to open up a database. 00:05:11.100 --> 00:05:12.103 Pretty simple. 00:05:12.104 --> 00:05:15.014 I think there's nothing to explain there. 00:05:15.015 --> 00:05:19.106 But here on this line that I'm on right now, 00:05:19.107 --> 00:05:21.432 we are saying, okay, there's going to be 00:05:21.433 --> 00:05:24.839 a type called bookmark. 00:05:24.840 --> 00:05:26.826 It's going to have the following properties. 00:05:26.827 --> 00:05:29.178 First, a file, which is unique and a string. 00:05:29.179 --> 00:05:31.764 The second is an annotation, 00:05:31.765 --> 00:05:34.317 which is again unique and a string. 00:05:34.318 --> 00:05:37.864 Then we're going to have another type called named. 00:05:37.865 --> 00:05:39.808 First of all, why is it named as part of bookmark? 00:05:39.809 --> 00:05:45.562 As I'll get into, it's interesting 00:05:45.563 --> 00:05:48.511 when you start sharing this database 00:05:48.512 --> 00:05:51.365 with other things, not just bookmarks, but other types. 00:05:51.366 --> 00:05:54.616 Bookmarks are very similar to many other things 00:05:54.617 --> 00:05:56.723 that you might want to expand into. 00:05:56.724 --> 00:05:57.086 Those other things have names, 00:05:57.087 --> 00:05:58.269 but they're not bookmarks. 00:05:58.270 --> 00:06:04.123 It's nice to separate these concerns out 00:06:04.124 --> 00:06:08.372 and just have another type called named, 00:06:08.373 --> 00:06:12.780 which just basically has a name. 00:06:12.780 --> 00:06:15.746 We can execute this. 00:06:15.747 --> 00:06:21.798 It's not interesting to look at these. 00:06:21.440 --> 00:06:25.907 that is not all that useful for anything, 00:06:21.799 --> 00:06:21.439 It outputs something 00:06:25.908 --> 00:06:28.014 but that's okay. What's done is, actually, 00:06:28.015 --> 00:06:32.262 it's created a database 00:06:32.263 --> 00:06:34.045 and it's populated it with the schema. 00:06:34.046 --> 00:06:41.478 We can look at this. 00:06:41.479 --> 00:06:43.602 We won't go through all of this 00:06:43.603 --> 00:06:44.188 because it's a little bit too much 00:06:44.189 --> 00:06:46.036 for a short presentation like this, 00:06:46.037 --> 00:06:48.185 but you could see that there's something here 00:06:48.186 --> 00:06:52.500 that's like, oh, we have a subject bookmark. 00:06:52.500 --> 00:06:56.031 We have a property base/type. 00:06:56.032 --> 00:06:58.878 That just means that there's a property 00:06:58.879 --> 00:07:00.562 that's defined by the base. 00:07:00.563 --> 00:07:02.248 This means this is from the triples package itself. 00:07:02.249 --> 00:07:08.940 It's not some other package. 00:07:08.940 --> 00:07:11.525 Third is, what is the type of this object? 00:07:11.526 --> 00:07:17.060 It's a schema. This thing could be many types. 00:07:17.060 --> 00:07:19.150 As I said, if you have a-- 00:07:19.151 --> 00:07:20.235 we haven't seen an example yet, 00:07:20.236 --> 00:07:21.100 but if you have a bookmark, 00:07:21.100 --> 00:07:23.686 it's going to have a name type 00:07:23.687 --> 00:07:25.694 and a bookmark type. 00:07:25.695 --> 00:07:26.719 Everything is multi-typed 00:07:26.720 --> 00:07:28.146 and that's kind of a feature 00:07:28.147 --> 00:07:32.137 of this kind of storage system. 00:07:32.138 --> 00:07:33.140 I'm not going to go through everything, 00:07:33.140 --> 00:07:35.865 but you can see it's all there in triples, 00:07:35.866 --> 00:07:40.740 the whole schema, everything we just did. 00:07:40.740 --> 00:07:42.645 Let's create a bookmark. Again, 00:07:42.646 --> 00:07:46.997 we're going to connect to our database 00:07:46.998 --> 00:07:49.246 and we're going to basically set 00:07:49.247 --> 00:07:52.552 an entire subject. 00:07:52.553 --> 00:07:54.239 The subject is, it's basically like an entity. 00:07:54.240 --> 00:07:56.105 We're going to define a whole entity 00:07:56.106 --> 00:08:00.676 or you could refer to it as an object. 00:08:00.677 --> 00:08:03.909 That's a perfectly fine way to look at it, I think. 00:08:03.910 --> 00:08:04.356 It's going to have some identifier. 00:08:04.357 --> 00:08:06.723 That identifier could be anything. 00:08:06.724 --> 00:08:07.431 It doesn't have to be a string. 00:08:07.432 --> 00:08:09.260 It could really be anything, but we're going 00:08:09.260 --> 00:08:11.369 to give it a string called emacs-init. 00:08:11.370 --> 00:08:13.298 It does not matter what this identifier is, 00:08:13.299 --> 00:08:17.808 at least for our purposes. 00:08:17.809 --> 00:08:19.914 It does matter when you're linking to it, 00:08:19.915 --> 00:08:22.263 but I think nothing that I'm about to show you. 00:08:22.264 --> 00:08:25.830 This could truly be anything 00:08:25.831 --> 00:08:28.180 because it has a separate name. 00:08:28.180 --> 00:08:32.131 I'm giving it a name here, which is init. 00:08:32.133 --> 00:08:34.917 I'm just specifying the named type here 00:08:34.918 --> 00:08:38.047 and I'm specifying the bookmark type here 00:08:38.048 --> 00:08:43.219 and its values. We're going to do that. 00:08:43.220 --> 00:08:47.769 Now, if we look, we see everything we saw before, 00:08:47.770 --> 00:08:52.246 but now we have subject emacs-init. 00:08:52.247 --> 00:08:55.973 It has a type and it's named. 00:08:55.974 --> 00:08:57.220 We also see the same thing two lines down. 00:08:57.220 --> 00:08:58.264 This type is also a bookmark, 00:08:58.265 --> 00:09:02.819 but the name is init in the named/name, 00:09:02.820 --> 00:09:05.966 which is like the type is name, named, 00:09:05.967 --> 00:09:08.752 and the property is name. It's init. 00:09:08.753 --> 00:09:12.661 As you can see, this is just 00:09:12.662 --> 00:09:16.331 how everything looks. 00:09:16.332 --> 00:09:18.356 It's pretty straightforward 00:09:18.357 --> 00:09:19.318 and you can retrieve it. 00:09:19.319 --> 00:09:21.603 Now, we're looking at the database, 00:09:21.604 --> 00:09:22.689 but you don't really have to 00:09:22.690 --> 00:09:23.218 look at the database for... In fact, 00:09:23.219 --> 00:09:24.222 I think we're done looking 00:09:24.223 --> 00:09:25.105 at the triples format, 00:09:25.106 --> 00:09:29.718 because I think it's very simple. 00:09:29.719 --> 00:09:31.365 You've already got the hang of it, I think. 00:09:31.366 --> 00:09:33.069 Let's retrieve that just to make sure, yes, 00:09:33.070 --> 00:09:37.980 we can retrieve it. 00:09:37.981 --> 00:09:38.247 We're going to retrieve it and say, okay, 00:09:38.248 --> 00:09:43.286 what do we get when we load the emacs-init subject? 00:09:43.287 --> 00:09:48.697 Well, we get a plist of all of its properties, 00:09:48.698 --> 00:09:55.630 which then you can use in your application. 00:09:55.631 --> 00:09:57.455 There's many more ways to retrieve 00:09:57.456 --> 00:09:59.379 and there's many more ways to save. 00:09:59.380 --> 00:10:01.904 In fact, I think the way I did it here 00:10:01.905 --> 00:10:04.015 with set subject is probably not 00:10:04.016 --> 00:10:06.781 the right way to do it most of the time. 00:10:06.782 --> 00:10:08.127 It's usually because it'll erase everything. 00:10:08.128 --> 00:10:13.740 It's only really to be used when 00:10:13.740 --> 00:10:15.710 you're sure you control all the data, 00:10:15.711 --> 00:10:16.399 but you're never sure because there could be 00:10:16.400 --> 00:10:19.610 other packages that are also using this database, 00:10:19.611 --> 00:10:20.695 they could have their own data. 00:10:20.696 --> 00:10:21.342 You don't want to erase 00:10:21.343 --> 00:10:25.014 all the other Emacs init subject data. 00:10:25.015 --> 00:10:27.699 In this case, we did because 00:10:27.700 --> 00:10:30.810 we are confident it was a new entity, 00:10:30.811 --> 00:10:31.335 but in most cases, the right thing to do is 00:10:31.336 --> 00:10:34.289 just set it by type. Just say, 00:10:34.290 --> 00:10:36.676 we're just going to set the bookmark type, 00:10:36.677 --> 00:10:37.222 which is... The properties are this, 00:10:37.223 --> 00:10:38.104 and then the name type 00:10:38.105 --> 00:10:42.814 and the properties are that. 00:10:42.815 --> 00:10:44.900 That's a way that you could do things. 00:10:44.900 --> 00:10:48.526 There's also many retrieval types. 00:10:48.527 --> 00:10:53.755 The retrieval types: 00:10:53.756 --> 00:10:56.403 you can retrieve by a number of different ways, 00:10:56.404 --> 00:10:58.869 which I'm not going to get into, 00:10:58.870 --> 00:11:01.241 but you can read about in either the source 00:11:01.242 --> 00:11:10.033 or the readme in the package. 00:11:10.034 --> 00:11:14.539 We have backlinks as well. 00:11:14.540 --> 00:11:15.862 Let me explain what backlinks are. 00:11:15.863 --> 00:11:17.172 There's another feature of the triples. 00:11:17.173 --> 00:11:19.860 As I mentioned, these things 00:11:19.861 --> 00:11:21.849 can be thought about as links, 00:11:21.850 --> 00:11:23.797 but what could be a link in one direction 00:11:23.798 --> 00:11:25.804 could also be a link in the other direction, 00:11:25.805 --> 00:11:28.395 and we basically get this for free. 00:11:28.396 --> 00:11:33.807 Here's an example where we are again 00:11:33.808 --> 00:11:35.752 connecting toward bookmark. Here we're going to 00:11:35.753 --> 00:11:38.223 add a new type called tagged. 00:11:38.224 --> 00:11:41.613 We're going to give everything in tags. 00:11:41.614 --> 00:11:45.524 Here we're saying, okay, there's a type called tagged 00:11:45.525 --> 00:11:49.234 and it has a property called tags. 00:11:49.235 --> 00:11:52.060 This is not unique, so it's a list basically. 00:11:52.060 --> 00:11:54.326 It's a list of string. 00:11:54.327 --> 00:11:58.675 There also is a type called tag. 00:11:58.676 --> 00:12:01.402 This is for things that are tags themselves. 00:12:01.403 --> 00:12:06.127 Then it has a type called numbers 00:12:06.128 --> 00:12:18.003 and it has what we call a virtual reversed property. 00:12:18.004 --> 00:12:21.075 It's virtual because it's not actually stored. 00:12:21.076 --> 00:12:23.741 We just compute it by reversing 00:12:23.742 --> 00:12:24.306 the subject and the object. 00:12:24.307 --> 00:12:29.260 This is on tagged tags. When we query this, 00:12:29.260 --> 00:12:32.006 we can just say, okay, 00:12:32.007 --> 00:12:33.268 what are all the subjects 00:12:33.269 --> 00:12:38.859 that have tagged tags of me, the tag? 00:12:38.860 --> 00:12:39.365 In fact, let me demonstrate that for you. 00:12:39.366 --> 00:12:42.139 We're going to set the type on emacs-init. 00:12:42.140 --> 00:12:45.070 We're going to add the "tagged" type. 00:12:45.071 --> 00:12:47.017 This is the alternate way of setting data 00:12:47.018 --> 00:12:48.740 that I mentioned. 00:12:48.740 --> 00:12:49.924 This won't erase anything else. 00:12:49.925 --> 00:12:51.752 We're just adding something here. 00:12:51.753 --> 00:12:54.742 We're adding this type "tagged" 00:12:54.743 --> 00:12:59.953 to our previous bookmark emacs-init. 00:12:59.954 --> 00:13:01.058 We're going to add emacs and config 00:13:01.059 --> 00:13:06.866 as the tags. We're going to then 00:13:06.867 --> 00:13:11.095 set emacs as a tag and config as a tag. 00:13:11.096 --> 00:13:15.385 That just lets us have this virtual property. 00:13:15.386 --> 00:13:16.389 You have to do something. 00:13:16.390 --> 00:13:18.733 You can't get it out of thin air. 00:13:18.734 --> 00:13:23.426 The design decision we've made is: 00:13:23.427 --> 00:13:25.508 you at least need to tag it 00:13:25.509 --> 00:13:32.660 before you get the free property. 00:13:32.660 --> 00:13:35.631 What you should see... Let's try it out. 00:13:35.632 --> 00:13:36.037 We got the subject config, 00:13:36.038 --> 00:13:37.261 which we've set no data on. 00:13:37.262 --> 00:13:40.668 You can tell we're not sending any data. 00:13:40.669 --> 00:13:44.820 If I get that subject, the result is that 00:13:44.821 --> 00:13:46.068 it says its members are emacs-init. 00:13:46.069 --> 00:13:49.878 That's what a virtual reverse property. 00:13:49.879 --> 00:13:53.606 As we tag more things, this just 00:13:53.607 --> 00:13:55.151 continues to work because it's just doing 00:13:55.152 --> 00:13:59.380 a SQL query here. 00:13:59.380 --> 00:14:01.985 Besides showing off the backlinks function, 00:14:01.986 --> 00:14:04.175 this also shows off the general way 00:14:04.176 --> 00:14:07.863 you can have extensible entities. 00:14:07.864 --> 00:14:09.391 That is, it's possible that someone writes 00:14:09.392 --> 00:14:13.062 a bookmarks package that stores everything 00:14:13.063 --> 00:14:18.054 in a database, in the triples database, 00:14:18.055 --> 00:14:21.521 but then someone else can come and say, 00:14:21.522 --> 00:14:23.590 okay, I'm going to define my own types 00:14:23.591 --> 00:14:25.739 that's meant to work with this database, 00:14:25.740 --> 00:14:28.507 just like someone could do what I did here, 00:14:28.508 --> 00:14:30.874 just to add simple tagging. 00:14:30.875 --> 00:14:32.900 It's very easy to do. 00:14:32.901 --> 00:14:35.931 This stuff is not that easy to do otherwise. 00:14:35.932 --> 00:14:38.961 To do this in Lisp, I would say it's a little awkward. 00:14:38.962 --> 00:14:42.673 With databases, again, it's not only possible, 00:14:42.674 --> 00:14:43.498 it's relatively trivial, 00:14:43.499 --> 00:14:49.828 especially with this kind of database. 00:14:49.829 --> 00:14:53.056 The benefit is it's super easy to work with. 00:14:53.057 --> 00:14:56.041 With this kind of generic database, 00:14:56.042 --> 00:15:00.311 the drawback is it's not all that efficient 00:15:00.312 --> 00:15:04.381 as a special purpose table 00:15:04.382 --> 00:15:06.191 that is really built for efficiencies. 00:15:06.192 --> 00:15:08.820 A lot of times you have to do multiple lookups 00:15:08.820 --> 00:15:09.442 and things like that. 00:15:09.443 --> 00:15:11.985 Again, it's a trade-off for various things. 00:15:11.986 --> 00:15:19.900 As you can see, this is like 00:15:19.901 --> 00:15:22.066 one database for everything. 00:15:22.067 --> 00:15:29.178 That means that we don't have to all 00:15:29.179 --> 00:15:31.944 contribute to one giant database. 00:15:31.945 --> 00:15:33.052 All the packages that use triples, 00:15:33.053 --> 00:15:35.180 it doesn't have to be one database, 00:15:35.180 --> 00:15:37.086 but it's cool if it does. 00:15:37.087 --> 00:15:39.393 I don't know what I want to happen 00:15:39.394 --> 00:15:41.220 or what I expect to happen, 00:15:41.220 --> 00:15:43.068 but I think an interesting property is that 00:15:43.069 --> 00:15:45.400 this is a way for lots of data to live together 00:15:45.400 --> 00:15:49.606 and build off each other in ways that I think 00:15:49.607 --> 00:15:55.780 are hard to do with other forms of table layouts 00:15:55.780 --> 00:15:57.007 and things like that. 00:15:57.008 --> 00:15:59.653 Let's talk about a use of it, 00:15:59.654 --> 00:16:02.643 which is the EKG package. 00:16:02.644 --> 00:16:04.589 The EKG package is something I've written 00:16:04.590 --> 00:16:07.780 to demonstrate the triples library 00:16:07.780 --> 00:16:09.409 and use it for something I think is interesting, 00:16:09.410 --> 00:16:12.420 which is personal knowledge management systems 00:16:12.420 --> 00:16:14.384 of the same type, of the same genre 00:16:14.385 --> 00:16:15.286 that Org Roam is, 00:16:15.287 --> 00:16:18.433 but with different design decisions. 00:16:18.434 --> 00:16:26.531 I'll show it in action for a little bit. 00:16:26.532 --> 00:16:28.359 Let's just look at... it's all tag-based, 00:16:28.360 --> 00:16:30.185 same kind of tags we saw before 00:16:30.186 --> 00:16:32.232 when we were playing around 00:16:32.233 --> 00:16:35.560 with the bookmarks example application, 00:16:35.224 --> 00:16:37.475 What I want to show is: I can look at a tag. 00:16:35.560 --> 00:16:35.223 but everything here is... 00:16:37.476 --> 00:16:40.287 I could see notes with that tag. 00:16:40.288 --> 00:16:42.632 Everything you see here is in the database, 00:16:42.633 --> 00:16:43.198 no files involved. 00:16:43.199 --> 00:16:46.404 All of this is just a thing 00:16:46.405 --> 00:16:49.390 that's an entire object, the entire string. 00:16:49.391 --> 00:16:56.081 It works. It has tags. 00:16:56.082 --> 00:16:59.229 You can see not only this tag, 00:16:59.230 --> 00:17:01.354 but all the other tags associated with it 00:17:01.355 --> 00:17:04.860 and their notes. 00:17:04.860 --> 00:17:10.255 It's kind of an interesting way to do things. 00:17:10.256 --> 00:17:12.260 When you capture it, I think it's interesting. 00:17:12.260 --> 00:17:22.275 There's a lot of interesting design elements here. 00:17:22.276 --> 00:17:25.819 This tags thing is not part of the buffer. 00:17:25.819 --> 00:17:28.751 It's not like Org Roam. 00:17:28.752 --> 00:17:29.116 You see here in this other tags, 00:17:29.117 --> 00:17:31.924 these are things I've imported from Org Roam. 00:17:31.925 --> 00:17:32.230 This is why they look like they do. 00:17:32.231 --> 00:17:34.020 They have their own titles because 00:17:34.020 --> 00:17:37.889 I just wrote them all in Org Roam. 00:17:37.890 --> 00:17:39.457 What it looks like, really, for these notes 00:17:39.458 --> 00:17:41.023 is that it's just text. 00:17:41.024 --> 00:17:44.615 You really don't have to bother with this metadata. 00:17:44.616 --> 00:17:46.282 If I want another tag like pancakes, 00:17:46.283 --> 00:17:53.654 I can just add it here. Again, these tags 00:17:53.655 --> 00:17:56.740 will turn into data, triple data. 00:17:56.740 --> 00:17:59.825 The text is just a triple date[??] as well, 00:17:59.826 --> 00:18:01.969 but different to triple data. 00:18:01.970 --> 00:18:08.362 All these things are like that. 00:18:08.363 --> 00:18:12.771 You can open up any of these things, et cetera. 00:18:12.772 --> 00:18:16.682 I think the interesting thing here 00:18:16.683 --> 00:18:22.596 is to see the code. It's not super interesting 00:18:22.597 --> 00:18:23.980 to look at code for too long, 00:18:23.980 --> 00:18:26.991 but we don't have that long. 00:18:26.992 --> 00:18:27.654 Whenever we connect-- 00:18:27.655 --> 00:18:28.819 I just want to point out a few things. 00:18:28.820 --> 00:18:29.205 Whenever we connect, we have a schema. 00:18:29.206 --> 00:18:31.175 We just do this. Every time we connect, 00:18:31.176 --> 00:18:33.163 we just make sure it has the right schema. 00:18:33.164 --> 00:18:36.314 This way, the user is up to date. 00:18:36.315 --> 00:18:38.300 This schema just looks exactly like 00:18:38.301 --> 00:18:41.687 stuff I showed you in the triples 00:18:41.688 --> 00:18:43.532 when we were looking at bookmarks. 00:18:43.533 --> 00:18:45.100 It's not complicated. 00:18:45.100 --> 00:18:48.210 I even have stuff here with people 00:18:48.211 --> 00:18:51.538 to use this as a person database. 00:18:51.539 --> 00:18:52.104 I haven't figured out how I'm going to use this yet, 00:18:52.105 --> 00:18:54.273 but you can see just to do this, 00:18:54.274 --> 00:19:01.913 it's really trivial and it's pretty easy. 00:19:01.914 --> 00:19:02.498 Let's show a few other things, 00:19:02.499 --> 00:19:05.844 like getting all the tags. 00:19:05.845 --> 00:19:07.990 Here, we could just say, 00:19:07.991 --> 00:19:10.379 let's get the subjects of type tag. 00:19:10.380 --> 00:19:12.902 We have all the triples, 00:19:12.903 --> 00:19:15.849 all the ones that are of type tag, 00:19:15.850 --> 00:19:18.777 all the things that have a subject. 00:19:18.778 --> 00:19:22.145 All the subjects that have links, 00:19:22.146 --> 00:19:28.337 that have this type, this tag in it, 00:19:28.338 --> 00:19:30.660 we can return them all. 00:19:30.426 --> 00:19:32.674 of all these objects. 00:19:30.660 --> 00:19:30.425 Basically, it just gives you a list 00:19:32.675 --> 00:19:33.243 Again, you can think of these things as objects. 00:19:33.244 --> 00:19:35.433 All the objects of type tag, 00:19:35.434 --> 00:19:37.320 we'll just get them all. Super, super simple. 00:19:37.321 --> 00:19:39.585 Triples gives you this functionality 00:19:39.586 --> 00:19:43.780 out of the box. It's not that complicated. 00:19:43.780 --> 00:19:45.167 What I would like to show, 00:19:45.168 --> 00:19:49.518 and that shows my thesis for this whole talk, 00:19:49.519 --> 00:19:52.785 is this rename tag. Now, think about 00:19:52.786 --> 00:19:54.150 how you would rename a tag in Org Roam 00:19:54.151 --> 00:20:03.013 or anything where the tag is part of the files. 00:20:03.014 --> 00:20:05.280 It's like how you would re-tag everything 00:20:05.280 --> 00:20:09.869 in Org Mode. It's complicated and error-prone 00:20:09.870 --> 00:20:12.556 and slow. This is anything, 00:20:12.557 --> 00:20:14.763 this is instantaneous and super easy. 00:20:14.764 --> 00:20:17.255 Look, that's it. There's not that many places 00:20:17.256 --> 00:20:19.540 for an error to live here. 00:20:19.540 --> 00:20:21.507 One thing I would like to point out 00:20:21.508 --> 00:20:23.337 is that we are doing direct, 00:20:23.338 --> 00:20:24.320 not everything has to go through 00:20:24.321 --> 00:20:28.292 the triples package. Maybe it should, 00:20:28.293 --> 00:20:31.660 but the triples package is a fixed format, 00:20:31.660 --> 00:20:33.906 which is why it's okay-- 00:20:33.907 --> 00:20:34.069 whether it's a good idea, I'm not sure, 00:20:34.070 --> 00:20:39.863 but it's okay for client packages 00:20:39.864 --> 00:20:42.833 to just directly manipulate the tables. 00:20:42.834 --> 00:20:43.937 Here, we're just doing it just to 00:20:43.938 --> 00:20:45.265 update all the tags 00:20:45.266 --> 00:20:47.891 and then remove and set types 00:20:47.892 --> 00:20:49.119 so that the correct thing happens. 00:20:49.120 --> 00:20:52.146 As you can see, it's super, super simple. 00:20:52.147 --> 00:20:55.374 I think this proves my thesis about 00:20:55.375 --> 00:21:01.526 the advantages of applications with SQLite. 00:21:01.527 --> 00:21:02.430 Thank you for listening. 00:21:02.431 --> 00:21:05.876 I hope this puts ideas in your minds 00:21:05.877 --> 00:21:09.827 about taking advantage of this functionality. 00:21:09.828 --> 00:21:11.935 I hope to see more things 00:21:11.936 --> 00:21:12.180 using the triples library 00:21:12.180 --> 00:21:16.017 or otherwise that take advantage of this. 00:21:16.018 --> 00:21:17.660 Thank you for your time.