"Soft Linking" is the idea of being able to mention another note in a vault without creating a line in the graph view or showing up in the referent's backlinks. The use case is specifically for disambiguation like `not to be confused with X`, or for examples where linking doesn't make sense `this technique is used by note Y`. It is useful to have a an easy way to navigate between them for ergonomics, but it is not ideal for that navigation aid to pollute the graph. # Implementation I have started ([[2023-04-26]]) generating UUIDs on every new note using the Templater plugin and my [[Z. Preset - Default]] template. This template sets the UUID property in the frontmatter, as well as adding the UUID to the list of aliases as note creation. # Techniques ## Inline Dataview Link Simply using an inline Dataview query to generate a link to a named note prevents backlinks and graph view pollution. ```markdown Soul is unrelated to the `dv:link("SOUL")` programming language. ``` >[!NOTE] Rendered Example > Soul is unrelated to the `dv:link("SOUL")` programming language. The downside is that is the linked note name changes, then the link breaks. The upside is that it is very simple to implement. ## UUID >[!ERROR] Broken > Inline dataview with a link function to an alias as shown below is currently [broken](https://github.com/blacksmithgu/obsidian-dataview/issues/2041). Instead of specifying a note by name, UUIDs would be generated on the notes (ideally all notes), and then linked by that instead. This still requires dataview, but is resilient against note name changes. ``` Soul is unrelated to the `dv:link("6ccc558f-4fe9-4dea-b8ce-2a0226aa75d5")` programming language. ``` >[!NOTE] Rendered Example > Soul is unrelated to the `dv:link("6ccc558f-4fe9-4dea-b8ce-2a0226aa75d5")` programming language. ### Using DataviewJS Code Block ```js dv.span(dv.pages().where(p => p.UUID == '6ccc558f-4fe9-4dea-b8ce-2a0226aa75d5').file.link[0]) ``` ```dataviewjs var page = dv.pages().where( p => p.UUID == '6ccc558f-4fe9-4dea-b8ce-2a0226aa75d5' ).file.link[0] var callout = dv.el("div", "", { cls: "callout" }) var title = dv.el("div", "", { cls: "callout-title", container: callout }) var header = dv.el("div", "Rendered Example", { cls: "callout-title-inner", container: title }) var content = dv.el("div", "", { cls: "callout-content", container: callout }); var p = dv.el("p", "", { container: content }); dv.span("Soul is unrelated to the ", { container: content }); dv.span(page, { container: content }); dv.span(" programming language.", { container: content }); ``` (example looks weird due to an [issue](https://forum.obsidian.md/t/live-preview-support-code-blocks-in-quotes/30783) with Obsidian's Markdown parser which prevents code blocks from working inside quotes) ### Using DataviewJS Inline ```js dv.pages().where(p => p.UUID == '6ccc558f-4fe9-4dea-b8ce-2a0226aa75d5').file.link ``` >[!NOTE] Rendered Example > Soul is unrelated to the `dvjs:dv.pages().where(p => p.UUID == '6ccc558f-4fe9-4dea-b8ce-2a0226aa75d5').file.link` programming language. # Original Thread I originally asked about this on the official Obsidian Discord. Thread edited down to reduce forks and false starts. ```chat {} [me=purple, Y=indigo, Z=red] > me | I did find myself wishing for an "anti-link" for all the situations where I need to explain "these things seem similar but aren't related". < Y | ![:emoji_17:](https://cdn.discordapp.com/emojis/820730590872469555.webp?size=44&quality=lossless) well you could make a note about these things and link that note in both subjects. > me | Right now I have just "X, not to be confused with Y" or similar. So if I end up on the wrong one I can easily get to the other. But by linking them, they become associated in the graph view etc < Y | makes sense > me | Maybe using the button plugin would allow me to jump between notes without cross linking them 🤔 < Y | you could also use dataview with a simple inline code like `=link(name)` > me | Oh like inline? > Yeah interesting! > The only downside of these strategies is it also breaks the rename functionality, so they could get out of sync, but I think it's a worthy tradeoff < Z | You could implement a UID and link based on that with a bit of effort. < Y | it is just < `$=dv.span(dv.pages("").where(p => p.UUID === '4258630a-102c-40cb-baf1-2e02a5048686').file.link)` < Z | Oh true, I forgot that dataview's MD output has a lot of nice auto-format features < Actually span creates a list < ![Image](https://media.discordapp.net/attachments/710585052769157141/1087704278308761682/image.png) ![Image](https://media.discordapp.net/attachments/710585052769157141/1087704278573011006/image.png) < Link does not > me | That's pretty cool, is there something built in to do UUIDs or would I need to hand roll that? > I can generate them, I just meant if there was some kind of thing like blockId that could uniquely identity a note besides it's name < Z | Templater to the rescue ^ ``` ```yaml --- UUID: 3049c619-c653-4bea-a5d7-3a5377d178eb --- ```