将反向链接和数据库结合的尝试

我并不喜欢数据库,主要是我不喜欢数据库代表的那种自顶向下生成的内容记录方式。我喜欢双链,喜欢的主要是双链那种自底向上,无压输入的轻便。

注:思源的数据库其实有一个很好的功能,点击块标,在菜单里选择「添加到数据库」。但对我来说,这个操作不够无压。

🔗 然而,我发现到双向链接虽然美好,但也存在一些问题:随着笔记内容和双向链接数量的逐渐增加,维护成本也随之升高

🤔 核心的问题在于,双链关系本身缺乏描述性的语义信息。 举例来说,同样是链接到“灵感”这个节点的链接,有的可能代表天马行空的联想,有的则可能是针对具体项目的工作思路。但在传统的反链面板中,这些链接在语义上并没有明显的区分。

最近接触了一下 Tana 的 super tag 后,有了一些新想法,并尝试把思源的双链和数据库结合在一起。在简单研究了 tana 一下之后,我认为 Super Tag 的核心要点在于:将自下而上的引用方式与自上而下的数据库管理逻辑融合,从而实现了自下而上地构建数据库

这里的关键点在于两个:

  1. 自下而上地生长: 表格结构的形成源于零散的笔记内容聚合积累,而不是在预先设定的顶层页面中手动逐行添加结构。
  2. 关联关系的元属性: 这是传统反向链接(包括思源的反向链接)所欠缺的。 传统反链只提供简单的链接关系,而缺乏对关系本身进行自定义属性描述的能力。

不管别人怎么描述和理解,在我看来,Tana 的 SuperTag 就是这样一种“高级双链”的方案。 它保留了传统双链自底向上生长的模式,还有效地弥补了传统双链在引用关系语义表达上的不足。

思源里面没有 SuperTag,但是思源有双链,有数据库(属性视图)。我想了想,也许可以尝试把这两个东西结合在一起,探索出一种类似 SuperTag 的解决方案。

基本设计思路

具体而言,通过以下步骤实现 “SuperRef” 的概念:

  1. 双向绑定: 将一个主题文档和与之关联的数据库绑定在一起,形成一个整体。
  2. 块引用: 在其他文档中可以通过块引用的方式链接到这个主题文档。
  3. 属性存储: 数据库则专门用于存放这些引用关系的相关属性信息。
  4. SuperRef 构成: 最终,被引用的 主题文档 + 与其绑定的数据库 共同构成一个 “SuperRef”。

image

一个简单的实现

尝试简单实现了一下(F-Misc >= v5.1.0)。

image

以下简单展示一个使用示例。

  1. 主题文档:「TODO」

    创建一个名为「TODO」的文档,作为我们的主题文档。

    虽然在思源中,双链引用可以应用到任意类型的块上,不过我还是做了简化设计:只有文档可以被当作一个 SuperRef 的目标。(我觉得这很合理)

    image

  2. 在其他文档中引用「TODO」

    在其他文档中编写内容时, 当需要引用 TODO 事项时,我们插入一个块引用链接到「TODO」文档。

    image

  3. 绑定到 SuperRef 数据库

    右键点击双链菜单中的引用链接,选择 “绑定到 SuperRef”。

    image

  4. 自动创建的 SuperRef 数据库

    返回「TODO」文档,会发现文档中已经自动创建了一个与该文档绑定的 SuperRef 数据库。 同时,在刚刚引用的块的右上角,也会出现一个数据库标识,表示该引用已关联到 SuperRef。

    image

    注:数据库和文档的双向绑定是通过设置块属性实现的。

    文档中会设置指向数据库的块属性;而数据库块也会设置指向文档的块属性。所以理论上你也可以把自动创建的数据库移动到别的文档位置,同样能生效。

  5. 编辑引用属性

    点击块右上角的数据库标识,即可打开属性面板,对该引用的属性进行编辑和管理。

    image

以上演示的是 自底向上 创建 SuperRef 的流程:从引用开始,逐步创建主题文档和数据库。

除了自底向上,也可以 自顶向下 的创建: 在主题文档中,通过文档菜单选择 “插入 SuperRef 数据库”并自动创建属性数据库,并将所有已有的双链引用自动添加到数据库中进行管理。

image

此外,如果在引用创建时没有立即绑定 SuperRef,也可以稍后在数据库中进行状态同步,将新的、尚未加入数据库的链接补充进来,确保所有引用都被纳入 SuperRef 的管理。

image


思源数据库的结构非常灵活,允许任意块同时加入多个不同的数据库。 这与双链的灵活性天然契合,意味着我们可以为同一个块绑定多个 SuperRef 数据库,从不同维度管理和分析引用关系。

image

image

重定向链接机制

考虑到我个人的使用习惯,在将引用的内容块绑定到数据库时,实际绑定的是重定向之后的块,而非直接引用所在的块。 这项机制的详细解释可以参考 QueryView 插件 - 链滴 文档中关于 “容器块传递” 部分的说明。

简单来说,重定向规则如下:

  • 容器块引用: 如果引用位于列表项块、引述块、超级块等容器的第一个段落块中,则整个容器块会被绑定到数据库。
  • 文档首段引用: 如果引用位于文档的第一个段落中,则整个文档会被绑定到数据库。
  • 标题下方首段引用: 如果引用位于标题下方的第一个段落中,则标题块会被绑定到数据库。

顶层管理

配合「书签 +」插件可以在侧边栏中统一管理这些 SuperRef 数据库。

在书签 + 中创建一个动态书签组,类型为 SQL,并使用如下的代码:

select * from blocks where type='av' and ial like '%custom-super-ref-db%' order by updated desc;

image

然后就可以在顶层直接查看所有数据库了。

image


🤔 长久以来,思源的双链和数据库之间的关系都非常割裂。以上我提到的算是一个抛砖引玉的想法,将双向链接和数据库功能结合起来试图实现 1 + 1 > 2 的效果。当然,这也仅是一个初步的尝试,还有细节需要优化。

插件代码遵循 GPL-v3 协议开源,欢迎有想法的朋友自行扩展和尝试。

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    24567 引用 • 100613 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • czr

    根据楼主分享的流程,为什么我添加到数据库后,块右上角并没有显示数据库?

  • 其他回帖
  • carethink via macOS

    这个是兼容标准的 OpenAI 格式的,我用 Open WebUI 试过,是成功的。

    我刚问了个问题“现在的时间是多少”,消息日志里是能正常显示的,说明火山 api 对接没问题,就是在正常的对话界面不能正常显示而已。日志里显示是"北京时间 2025-02-19 03:21:12",是因为火山的这个 api 已经打开了联网搜索功能,能实时联网查询

    image.png

    image.png

    1 回复
  • 不接单。

    我的意思是,父子关系本质上是一种单向的箭头关系。如果你平时不使用双链,完全可以将双链工具视为构建父子文档单向关系的辅助手段。例如,在一个文档中插入指向另一个文档的引用,那么在目标文档中显示的所有“反向链接”,都可以暂时视为该文档的“逻辑子文档”。

    如果你平时已经习惯使用双链功能,也参考我提到的 SuperRef 思路,在引用数据库中添加一个字段,用于标明引用的类型。对于父子关系的引用,你可以将类型明确标注为“父子文档”或其他类似的标识。

  • 你可以先引用输入,然后再 SuperRef 数据库的菜单里面点击‘更新’,这样会批量导入所有反向链接。

    image.png

    1 回复
  • 查看全部回帖