⚡️ Ideas
Winston Winston Mar 4, 2023

Bidirectional Fields

Explain the problem as you see it

Using an example, when we create Alice in Wonderland #book with the Author field as Lewis Carroll #author, currently we are unable to automatically populate Lewis Carroll #author such that its Books field shows Alice in Wonderland #book.

Why is this a problem for you?

The only way to access what books Lewis has written is to look at the References section below the page when we zoom into the node, or when we shift click > click the number of references. Way too many clicks. And also, it is only contextualised one way - this means that Tana only has the ability to contextualise in one direction.

Suggest a solution

Allow bidirectional fields.

⁨31⁩ ⁨Comments⁩

No, because the point I'm raising here is that there should be a way to have bidirectional context. Using a search field is a workaround, not a solution to that inconsistency. Not to also mention the pain of having to toggle open the search node, and adding new entries under the search node - clearly different to fields, because nodes live locally under fields, while search nodes do not house nodes locally - they get automatically housed under the daily page.

The advantages may not be as clear with just two types of supertags. But they become clearer when we start to involve multiple supertags and relationships become more complex. Some form of bidirectional context must exist... A close parallel to this are Relational Databases in Notion.

In reply to Winston Winston

No, because the point I'm raising here is that there should be a way to have bidirectional context.

Sounds good. Thanks for the clarification

I posted a duplicate request before realizing this already existed. Here’s what I said:

Explain the problem as you see it

If you reference a node from within a field, that reference shows up in the “References” section of that node, not in a field within that node.

When specifying structured data (i.e. fields) on a record (i.e. a Tana node), one expects relations between two records to be handled consistently on both sides of the relationship.

In other words:
If a relation is defined as a field on a record, then the relation should show up as a field on both the incoming and outgoing side of said relation.

Instead, the current status quo uses a backlinks-style UI which is borrowed from last-generation tools like Roam, LogSeq or Obsidian which is optimized for handling relations found within unstructured text.

It feels strange that the fields and views UI are borrowed from Notion and Airtable, but bidirectional fields didn’t carry over. This mismatch of UI idioms is frustrating.

Why is this a problem for you?

This is a problem only because Notion and Airtable handles this so gracefully, and Tana does not.

Since Tana is attempting to implement a superset of Notion and Airtable’s databases, this can be classified as a feature regression of sorts, especially if a user (i.e. me) were to migrate from using one of those tools to using Tana.

Example scenario:

Let’s say I have a field inside #Task called “Projects” that is of type “Instance” referencing nodes of type #Project

Inside a #Project, I might have a field called “Tasks”, where I want to see nodes of type #Task that reference said project

This example scenario works out of the box with Notion and Airtable, and doesn’t work with Tana’s fields, which is a crying shame!

Suggest a solution

  • The easy solution: Make relationships between nodes that are defined inside a field bidirectional. This probably only makes sense for nodes that have a schema inherited from a supertag.

  • The ideal solution: A better way to define cross-schema relations, replete with the ability to visualize fields and how they relate across #Supertags, probably using some kind of boxes-and-arrows no-code UI that looks like an ER Diagram.

From a discussion I had with Matt (from Tana):

Olli Tiainen
[10:07 AM]
I'm in specific very very very (did I say very) interested in your work regarding bidirectional fields Stian mentioned you were experimenting with
[10:08]
And by bidirectional fields, I mean, that if there are two #organization s A and B and organizations have a field [Competitors: #organization] - then if I insert B as a competitor to A's field, A would appear as competitor in B's field too.

Olli Tiainen
10:09 AM
Or similarly, i.e. Project - Client - Team member relationships would show up in all of them without needing

[10:10 AM]
Well, I think it's really the most important additional feature I could imagine having in Tana. It would basically replace my needs for Airtable.

Olli Tiainen
[10:11 AM]
If I tag connect a team member to a project, then if I look at a list of projects, I'd like to see the team members listed
[10:11]
Or if I have a client A that is having a problem B, if I look at the list of problems, I can see all of the clients that have that specific problem
[10:12]
Almost all fields with instances are, in my mind, bidirectional.
[10:13]
References at the bottom help yes, but they are not the same thing at all and don't really help structure and work with the information. They only make the connections somewhat visible.

Quite simply: I am a cousin to my cousin. And that relationship should be expressed only once, not twice, like the current ontology structure requires.

Similarly, if John is working on a project, then the project has a contributor John.

There may be better solutions, but one way to implement this is to create automation/mirroring rules to instance fields of two supertags i.e. "When #person is added to #project's field Team, add that #project to #person's field Working on".

A question I'm pondering: Should the connections between supertag instance fields contain information?

So for example:

  • If "A" (#solution) is a solution to "B" (#problem), The question of "why" it is a solution belongs in my mind more to the connection between A and B than to either of the nodes.
In reply to Olli Tiainen Olli Tiainen

I think it matters. Annotated edges are an essential component of graphs.

With Roam-style backlinks, there aren’t any annotated edges between pages that link to each other, but at least the unstructured text does that job of adding context.

With fields, the field label does all the heavy-lifting, but the problem is that they behave like columns in a relational DB than they do edges in a property graph.

What is a desirable mental model here? Is it analogous to relational DB joins, with automatic backlinks, like how Airtable and Notion have implemented it?

Or is it analogous to a property graph where any node can have any type of edge and you can optionally annotate that edge with properties?

Tana seems closer to the latter right now, but end-users are more familiar with Notion/Airtable style UX.

Not sure how to reconcile these differences, but my preference is err on the side of flexibility, which means figuring out a good UX for property graphs where nodes can have properties, but edges can also have properties.

Edge properties could perhaps work like “contextual content”, or that feature could be expanded and rethought to better fill this role. Certainly, that’s the only way you can annotate context when you link between two nodes right now. It works for unstructured data, but there must be a better way for structured data which hopefully isn’t yet another new concept.

I think backlinks make a ton of sense, too, since it’s just backward traversal in a graph, but they need to be rethought (shouldn’t use Roam-style backlinks UX as they’re suited only for unstructured data, and shouldn’t also use Airtable-style backlinks as they’re suited only for relational DBs).

The current “Appears as X on Y” UX, where X and Y are static strings defined by the user, worked in a pre-GPT world, but perhaps backlinks can be semantically transformed by GPT, so “[Person] appears as a [Client] on [Projects]” can instead show up as a magic backlink field on Person that automatically parses that the field label should be called something like “Client for Projects”, or whatever GPT deems fit.

In reply to Maciej Smoła Maciej Smoła

In simple relationships, yes, such as:

  • Person (supertag) is a member of a Project (Field instance for Projects)
  • Project (supertag) has a Team member (Field instance for Persons)

But in more complex relationships, this doesn't work anymore:

  • Nutrient (supertag) "Lack thereof causes" (Field title for #symptoms)
  • Symptom (supertag) "Is caused by the lack of these nutrients" (Field title for #nutrients)

It doesn't work because field titles don't capture the context of these relationships (the edges). For example, Vitamin D (#nutrient) reduces osteoporosis risk (#symptom). But the context is that this is because Vitamin D helps the intestines absorb calcium from your food. However, neither the fields nor the field titles can capture this explanation of the connection. Instead, the information must be recorded either "under" the medicine or the symptom node, where it doesn't directly explain the relationship and isn't available bidirectionally through the fields or even via backlinks.

In reply to Olli Tiainen Olli Tiainen

I see, so then we would be able to for example explain the mechanism of Vitamin D by describing the relation itself.
Have you seen that implemented in UI anywhere? Where should it go in the app like Tana? Curious to see if there are any which could be helpful for devs