当网页链接时,我们只知道页面 A 链接到页面 B。我们不知道哪些页面链接到页面 B(有多少箭头指向页面 B)。
Logseq、Neurite、Obsidian、Foam、SiYuan 等笔记应用程序具有双向链接功能。因此,我们可以说当前笔记 C 具有来自笔记 N1、N2 的链接...这是个人知识图谱和基于 Zettelkasten 的笔记应用程序的重要功能。
鉴于笔记应用程序使用标准 Markdown 语法
[[page-B]]
来创建笔记之间的链接。我可以使用什么算法在此类应用程序中实现双向链接。唯一的限制是,我需要实现双向链接,而不需要将更改写回文件。一项不错的功能是不使用任何外部数据库。
要使用标准 Markdown 语法在笔记应用程序中实现双向链接
[[page-B]]
无需将更改写回文件或使用外部数据库,您可以使用内存中索引,在加载笔记时动态映射链接或编辑。这种方法利用了双向链接信息可以在会话期间保留在内存中的事实,允许您有效地创建、访问和管理双向链接。
这是实现此目的的分步方法:
使用两个字典来维护链接:
forward_links
:该词典将每个注释映射到它链接到的注释列表。backward_links
:该词典将每个注释映射到链接到它的注释列表。加载或编辑注释时,解析内容以识别链接。为简单起见,您可以使用正则表达式提取
[[page-B]]
格式的链接。
解析注释时相应更新
forward_links
和 backward_links
字典。
编辑注释时,您应该删除旧链接并添加新链接以保持词典更新。
这是 Python 中的基本实现:
import re
from collections import defaultdict
class NoteLinkManager:
def __init__(self):
self.forward_links = defaultdict(list)
self.backward_links = defaultdict(list)
def parse_links(self, note_name, content):
# Use regex to find links in the form [[page-B]]
links = re.findall(r'\[\[([^\]]+)\]\]', content)
return links
def add_note_links(self, note_name, content):
# Parse the links in the note
new_links = self.parse_links(note_name, content)
# Remove old links if note already exists
if note_name in self.forward_links:
old_links = self.forward_links[note_name]
for linked_note in old_links:
self.backward_links[linked_note].remove(note_name)
# Update forward links
self.forward_links[note_name] = new_links
# Update backward links
for linked_note in new_links:
self.backward_links[linked_note].append(note_name)
def get_forward_links(self, note_name):
return self.forward_links.get(note_name, [])
def get_backward_links(self, note_name):
return self.backward_links.get(note_name, [])
# Example usage
note_manager = NoteLinkManager()
# Add some notes
note_manager.add_note_links('Note1', 'This is a link to [[Note2]] and [[Note3]].')
note_manager.add_note_links('Note2', 'This is a link to [[Note3]].')
note_manager.add_note_links('Note3', 'No outgoing links.')
# Query links
print("Forward links from Note1:", note_manager.get_forward_links('Note1'))
print("Backward links to Note3:", note_manager.get_backward_links('Note3'))
# Output:
# Forward links from Note1: ['Note2', 'Note3']
# Backward links to Note3: ['Note1', 'Note2']
数据结构:
forward_links
存储从一个笔记到其他笔记的链接。backward_links
存储从其他笔记到给定笔记的链接。解析链接:
parse_links
函数使用正则表达式查找格式为 [[page-B]]
.更新链接:
add_note_links
函数同时更新 forward_links
和 backward_links
词典。它首先删除与注释关联的所有旧链接,以保持词典更新。查询链接:
get_forward_links
和 get_backward_links
函数检索给定注释的相应链接。此方法可确保您以高效且动态的方式管理双向链接,而无需将更改写回文件或使用外部数据库。内存中的字典维护必要的链接信息,这些信息会随着笔记的加载或编辑而更新。