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.