读取Logseq数据Skill reading-logseq-data

这是一个专门用于从Logseq图数据库通过HTTP API或命令行接口读取数据的技能,支持页面、区块内容获取,属性和元数据检索,Datalog查询执行,全文搜索以及反向链接查找。

低代码开发 0 次安装 0 次浏览 更新于 3/3/2026

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(查询, [页面列表])

性能提示

  1. 使用特定查询 - 不要获取比需要的更多
  2. 优先使用pull语法 - (pull ?e [:需要 :字段]) vs [*]
  3. 将选择性条款放在首位 - 在查询中尽早过滤
  4. 使用参数 - 通过:in子句传递值
  5. 尽可能批量处理 - 一次查询多个项目

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了解查询模式