Datascript入门
最后更新于
最后更新于
datascript是一种匹配
查询的语言,我们从最简单的语句开始,一步一步提高直到学会`datascript`。
什么是匹配呢?我们设想Logseq
的数据库是长这样的
E-id | Attribute | Value |
---|---|---|
这个表在Logseq
中看起来是什么样的呢?是这样。微积分和线代的父节点是大学数学。大学数学和大学英语同层级。
我们构造这个命令
ps:这是datascript
的语法,在logseq
中使用还需要加上特定的语法,例:
[?e :block/parent 50]
意思就是匹配所有block
中parent
是50
的节点。在我们这里表里面,结果有两个,分别是51
和52
。那么这个?e
就是变量
,它的值来源于与:block/parent 50
相匹配行的e-id
,现在的?e
的值是51
、52
。
(pull 变量名 [*])
这个方法
的作用是把变量名
所对应的block
显示出来:
还可能通过多个匹配语句去选择我们想要的block
。
现在我们假设我们有一个这样的logseq
库。
看起来像这样
我们构造一个筛选出目前还是TODO
的任务
的条件语句。
我们来看看这两个条件语句是怎么起作用的。
当匹配条件一[?e :block/marker ?m]
执行时,能与:block/marker
相匹配的行有三个。 ?e
的值有三个50
、51
、52
。同时?m
的值有TODO
和DONE
两个。
我们用第二个匹配条件[(contains? #{"TODO"} ?m)]
,要求这个?m
是在#{"TODO"}
其中。所以?m
是DONE
的52
就被排除了。现在?e
只有50
和51
。
我们用(pull ?e [*])
把E-ID
为50
和51
的block
显示出来:
block
有多少如果我们想通知一共有多少个TODO
,而不是把他们列出来,我们应该使用 (count 变量名)
去替换(pull )
。
例:
note 如果想在console中执行datascript可以使用
在logseq
中我们还可以使用更多的限制条件去筛选block
,比如日期
等等。
在:input [:today :today]
这两个参数传给?start
和?end
两个变量。然后 [?p :page/journal-day ?d]
则把日期赋予?d
变量。
最后再把?d
与?start
和?end
进去对比。
可以传入:inputs
日期的值非常丰富可以自由组合,比如:today
、:7d
、:56d
、:7d-after
等等。
Logseq
插件中使用logseq
提供了logseq.DB.datascriptQuery
去执行datascript
语句。
比如当我们执行
我们尝试执行这个命令并console.log
出来看看:
在开发中我们只为api提供:query
而没有:inputs
。我们应该如何限制查询条件呢?
其实在插件中限制条件还可以更加的灵活与多样。因为可以使用js去往[:find ]
中动态的使用的变量。不仅是如[(>= ?d 日期)]
还可以在(contains? )
中对block内容进行匹配。
只要我们了解相应的格式就行。如日期格式应该满足yyyyMMdd
,如果[(>= ?d 20220218)]
我的logseq中微积分是72, 线代是73。
E-id | Attribute | Value |
---|---|---|
:Namespace/Attribute | 可能的值|示例 |
---|---|
50
:block/marker
TODO
50
:block/content
学习英语
51
:block/marker
TODO
51
:block/content
学习数学
52
:block/marker
DONE
52
:block/content
学习语文
53
:block/parent
49
53
:block/content
今天天气真好
:block/uuid
:block/parent
50
:block/left
:block/collapsed?
:block/format
:block/refs
:block/_refs
:block/path-refs
:block/tags
:block/content
:block/marker
"DONE"、"TODO"、 "NOW" 、"LATER"
:block/priority
:block/properties
:block/pre-block?
:block/scheduled
:block/deadline
:block/repeated?
:block/created-at
1644037172307
:block/updated-at
1644037172307
:block/file
:block/heading-level
50
:block/parent
49
50
:block/content
大学数学
51
:block/parent
50
51
:block/content
微积分
52
:block/parent
50
52
:block/content
线代
53
:block/parent
49
53
:block/content
大学英语