In our Relational Datastores, we use "Extrinsics" instead of NULLs. We have specific values for "«Nothing», «Unknown», «Not applicable», «Missing»", etc. We can set the value of properties (columns) and use them for key values. This means that our joins will ALWAYS have a target, and if our joins are incorrect and return Extrinsic rows that shouldn't be there - they are "in your face".
We are looking to use a similar concept in our Neo4j DB. Our thought was to create Nodes whose primary label was :Extrinsic but which would also have the labels of the other categories of nodes that they are also applicable to. Thus to allow a relationship to an «Uknown» person, the (x:Extrinsic {name:'«Unknown»'}) node would be extended to become (x:Extrinsic : Person {name:'«Unknown»'}).
We could then use it appropriately:
match (u:Extrinsic{name:'«Unknown»'})
merge (m:Person {name:'Marty'})-[p:PARTNERED]->(u) return m,p,u
and
match (o:Person)-[r:PARTNERED]->(d:Person) return o,r,d
would return
│{"name":"Marty"} │{}│{"name":"«Unknown»"} │
i.e., Marty has a partner, but we don't know who they are.
Is this a viable mechanism for simulating extrinsic values?
TIA,
Paolo