{"body":{"post":{"id":"5n6w6k3f094g0c1a6b1t","createdAt":"2022-10-07T23:15:53.864Z","updatedAt":"2022-10-08T11:37:25.150Z","title":"笔记组织思路","content":"---\ncreated: 2022-10-07 23:31:51\nupdated: 2022-10-08 19:20:55\ntags: \n  - Note/Obsidian\n  - Note/Note\n  - Published\n---\n\n首先，我认为知识是『多维网状结构』，关系图谱是把这种结构拍扁后的一种二维表现。这些认知是准确的，但是却并不利于笔记的组织、管理和检索。\n\n所以要借助文件夹、标签和搜索。于是进一步产生问题，如何设定文件夹，如何管理标签。而这些设定则是为日后更方便地搜索服务的。\n\n## 文件夹的设定\n\n- 量少\n- 明确\n\n简单说就是用文件夹区分几个大类就好，每篇笔记都能够非常明确的找到它所应归属的文件夹，不存在骑墙情况。比如 `/Life`、`/Work` 等。\n\n笔记数量较多时，单靠文件夹去归类笔记效率是很低的。所以只用文件结构做最明确直接的树状管理，算是最基础的“粗”分类。\n\n一个必须项是 `/Inbox`，用来存放未整理的笔记。等有时间的时候进行进一步整理，添加合适的标签，放入合适的文件夹内。\n\n因为上面设定中默认笔记是会被移动的，并且，我个人的习惯上也不太习惯笔记之间链接，所以双链等方式基本是被废弃的。这种取舍是否值得，也要做一下考量。当然结构确定好之后，归档的笔记内使用链接问题是不大的。\n\n## 标签的设定\n\n一个必然的结果是标签的数量会很大，然后变得不便于管理。当我们想要使用某个标签的时候，不确定是否有过类似的标签，查找的时候不知道标签的具体用词。所以标签必须获得和笔记同级别的管理，才能保证条理性。\n\n然而，一般来说工具并不会提供这种程度的标签管理。而我对于笔记严格要求不依赖平台。所以这部分得自己做一个合理的设定。\n\n我的方法是自己加了一个标签（索引）页，将标签登记进去，并使用 `嵌套标签`（Nested tags） 对标签进行分类。比如对于软件相关的一些标签我会这样登记：\n\n![TagsIndex.jpg](https://global.cdn.blingwang.cn/2022/10/06/633e942a044a2.jpg)\n\n这样便于查找，而且回避了一些可能产生歧义的情况。\n\n这时候我想登记一个付费软件，就可以在这个列表里快速的找到我需要的标签。而当我想要查看付费软件标签下的文章时，也可以在这里快速找到需要的标签，并且点击即搜索。\n\n确实，这种用法有一定的平台依赖性，但是，可以将其理解为关键字，直接使用单词搜索也是没问题的，比如搜索 `Android`。\n\n### 关于子标签\n\n当这个标签特属于某个分类时，比如 Android 特属于软件分类下，表示 Android 系统下的软件。而这个标签如果独立出现在其他地方，则含义与上述表达显著不同。即，所属于某一分类的特定标签，如果出现在其他分类中，会表达显著不同的涵义的标签。\n\n### 关于标记类标签\n\n为了增加关键字而增设的标签，可能有各种重叠，不规范，不过这就是关键字。\n\n## 一点增强\n\n方案制定下来了，下一步就是整理以前的笔记。但是哪篇笔记、哪个标签未被这种方案索引到呢？我需要进行一个查找。\n\n这时候就需要 Obsidian 中的神级插件 [Dataview](https://github.com/blacksmithgu/obsidian-dataview) 出场了。本来我以为这么复杂的工具，而我这么清心寡欲的用户是用不上的。但是，它可以用 JS 直接写，这就没办法了，对于前端来说也太爽了吧。\n\n先来一个简单的，输出所有无标签的文章：（Dataview 代码的具体用法请自行查阅文档）\n\n```js\n// dataviewjs\n// 获取所有无标签页面\nlet pages = dv.pages().where(b => !b.tags);\n// 输出标题\ndv.header(2, \"无标签笔记 - \"+pages.length)\n// 输出笔记列表\ndv.list(pages.file.link);\n```\n\n这样我就可以从这个列表入手，逐条整理这些内容了。\n\n然后再列出所有没有在此文件中进行登记的标签：\n\n```js\n// dataviewjs\n// 获取当前页面中所有标签\nconst IndexTags = dv.current().file.etags;\n// 查询所有包含标签的页面\nconst pages = dv.pages().where(b => b.tags && b.tags.length);\n// 准备一个标签对象\nconst tags = {};\n// 便利所有标签，并计数\nfor(let t of pages.file.tags){\n  if(IndexTags.indexOf(t)===-1){\n    tags[t] = tags[t] ? tags[t]+1 : 1\n  }\n}\n// 准备一个标签数组\nconst tagsList = []\n// 将标签整理后存入数组\nfor(let t in tags){\n  tagsList.push(t+' '+tags[t])\n}\n// 输出标题\ndv.header(2, \"未整理标签 - \"+tagsList.length)\n// 输出标签列表\ndv.list(tagsList)\n```\n\n![noIndexTags.jpg](https://global.cdn.blingwang.cn/2022/10/06/633e942b72d30.jpg)\n\n这样慢慢整理起来很方便，也不用担心错过什么。当然，这种查询是具有平台依赖的，不过这不算长期应用，笔记整理完这些查询就废弃了。而且即便修改成 js 脚本去进行本地查询问题也不大，所以，算是很可以接受的方案。\n\n整理过程中有一点感慨，这其中很多时候借助了正则表达式和 JS 脚本，以前没想过记笔记居然还需要这些技能，有点认知上的反差。\n\n---\n## 进一步思考\n\n这时候文件夹起到的是类似分类的作用，是一个树状结构。\n\n标签其实也是一个类似分类的存在，也是一个树状结构，所以用两层树状结构管理笔记就可以实现较高的复杂度。不过这只是理论，实际如何构建这套体系发挥它的最大实力还是个很复杂的问题。\n\n标签虽然被当作分类去使用了，但是它具有可交叉性，这比传统分类灵活得多。\n\n但当标签向分类偏移的时候，就开始出现了一个空白——关键字（keyword），如何去填补还需要进一步思考。\n\n---\n\n我想到一套更复杂的方案，有趣捏，写下来供讨论：\n\n我纠结的点在于没有分类这个功能。这有很多表现，但本质上是分类的缺失。对比一下博客系统，用分类组织内容，用标签增加关键字，现在只有标签，就缺失了一个维度。如果用标签组织内容，那么标签最好是有限的，没有重叠的，总之是接近于“分类”这个功能的定义的。但标签移位到了分类，关键字的需求又无法填补。\n\n当然可以用文件结构，这在一定程度上可以充当分类，但是并不够，因为一篇内容是可以同属于多个分类的，这很合理，而文件结构显然不具有这样的灵活性。\n\n而且无论标签还是文件结构，都有一个问题，分类的数量。“软件”算作一个分类，“硬件”呢，应该也是一个平行的分类，“工作”、“生活”……这样展开去，又陷入了标签（或者分类，或者文件夹）的海洋。到后期，我们觉得笔记不好管理大概也都是陷于相近的矛盾之中。\n\n如果，有虚拟路径呢？用虚拟路径来充当分类的角色，一下子就合理了起来。对，就是 aliases。\n\n问题也是有的，不好管理。而且要添加这个属性就不说了，还得在其中加入标题。\n\n好消息是用了这种方法可以很放肆的使用双链，因为可以任意移动笔记，修改标题而不影响链接了。"}}}