name: 读取-Logseq-数据 version: 1.0.0 description: > 专家级技能,通过HTTP API或CLI从Logseq DB图数据库读取数据。 当用户想要从Logseq获取页面、区块或属性, 对图数据库执行Datalog查询,搜索内容,或检索 反向链接和关系时自动触发, 提供logseq-client库进行操作。 allowed-tools: 读,Bash,Grep,Glob
读取Logseq数据
使用此技能的场景
此技能在以下情况下自动触发:
- 用户想要从他们的Logseq图数据库中读取页面或区块
- 从Logseq实体中获取属性或元数据
- 对图数据库执行Datalog查询
- 在Logseq中搜索内容
- 查找反向链接或引用
- 用户提及“从Logseq获取”,“获取页面”,“查询Logseq”
客户端库: 请参阅{baseDir}/scripts/logseq-client.py了解统一API。
可用操作
| 操作 | 描述 |
|---|---|
get_page(标题) |
获取页面内容和属性 |
get_block(uuid) |
获取带有子区块的区块 |
search(查询) |
图数据库全文搜索 |
datalog_query(查询) |
执行Datalog查询 |
list_pages() |
列出所有页面 |
get_backlinks(标题) |
查找链接到此页面的页面 |
get_graph_info() |
获取当前图数据库元数据 |
快速示例
获取一个页面
from logseq_client import LogseqClient
client = LogseqClient()
页面 = client.get_page("我的页面")
print(f"标题: {页面['title']}")
print(f"属性: {页面['properties']}")
执行Datalog查询
# 查找所有评分>=4的书籍
结果 = client.datalog_query('''
[:find (pull ?b [:block/标题 :用户.属性/评分])
:where
[?b :block/标签 ?t]
[?t :block/标题 "书籍"]
[?b :用户.属性/评分 ?r]
[(>= ?r 4)]]
''')
for 书籍 in 结果:
print(f"{书籍['block/标题']}: {书籍['用户.属性/评分']} 星")
搜索内容
# 搜索提及“项目”的内容
结果 = client.search("项目")
for 区块 in 结果:
print(f"在: {区块['page']}找到")
print(f"内容: {区块['content'][:100]}...")
Datalog查询模式
查找所有页面
[:find (pull ?p [:block/标题])
:where
[?p :block/标签 ?t]
[?t :db/ident :logseq.class/页面]]
查找带有标签的区块
[:find (pull ?b [*])
:where
[?b :block/标签 ?t]
[?t :block/标题 "书籍"]]
按属性查找
[:find ?标题 ?作者
:where
[?b :block/标题 ?标题]
[?b :用户.属性/作者 ?作者]
[?b :block/标签 ?t]
[?t :block/标题 "书籍"]]
按状态查找任务
[:find (pull ?t [:block/标题 :logseq.属性/状态])
:where
[?t :block/标签 ?标签]
[?标签 :db/ident :logseq.class/任务]
[?t :logseq.属性/状态 ?s]
[?s :block/标题 "进行中"]]
查找反向链接
[:find (pull ?b [:block/标题 {:block/页面 [:block/标题]}])
:in $ ?页面-标题
:where
[?p :block/标题 ?页面-标题]
[?b :block/引用 ?p]]
聚合
;; 按作者统计书籍数量
[:find ?作者 (count ?b)
:where
[?b :block/标签 ?t]
[?t :block/标题 "书籍"]
[?b :用户.属性/作者 ?作者]]
使用客户端库
初始化
from logseq_client import LogseqClient
# 自动检测后端
client = LogseqClient()
# 强制特定后端
client = LogseqClient(backend="http")
# 自定义URL/令牌
client = LogseqClient(
url="http://localhost:12315",
令牌="your-token"
)
错误处理
try:
页面 = client.get_page("不存在的页面")
except client.NotFoundError:
print("页面不存在")
except client.ConnectionError:
print("无法连接到Logseq")
except client.AuthError:
print("无效的令牌")
批量操作
# 高效获取多个页面
页面列表 = ["页面1", "页面2", "页面3"]
结果 = [client.get_page(p) for p in 页面列表]
# 或使用单个查询
查询 = '''
[:find (pull ?p [*])
:in $ [?标题 ...]
:where
[?p :block/标题 ?标题]]
'''
结果 = client.datalog_query(查询, [页面列表])
性能提示
- 使用特定查询 - 不要获取比需要的更多
- 优先使用pull语法 -
(pull ?e [:需要 :字段])vs[*] - 将选择性条款放在首位 - 在查询中尽早过滤
- 使用参数 - 通过
:in子句传递值 - 尽可能批量处理 - 一次查询多个项目
CLI备用
如果HTTP API不可用,客户端将回退到CLI:
# CLI模式(如果HTTP失败则自动)
client = LogseqClient(backend="cli", 图形路径="/path/to/graph")
# 查询仍然以相同的方式工作
结果 = client.datalog_query("[:find ?标题 :where [?p :block/标题 ?标题]]")
输出格式
原始(默认)
直接从API返回Python字典/列表。
标准化
# 获取标准化输出
页面 = client.get_page("我的页面", 标准化=True)
# 返回: {"标题": "...", "uuid": "...", "属性": {...}, "区块": [...]}
参考材料
- 请参阅
{baseDir}/references/读取操作.md了解所有操作 - 请参阅
{baseDir}/templates/查询模板.edn了解查询模式