Maybe this is already sorted out:
I am not sure about the underlying database used for this, but it seems people centric. I am familiar with N-hierarchical data stored in a relational DB and using recursive queries against indexes and partition-indexes. With the right data structure you should be able to map every sort of connection that anyone could care about. Like Person A is seen here at a party with Person B and we know that they were both on the same plane back in X Date/time.
The structure is fairly simple. I call it BEERS. Usually, the B is Business, but it can also be B Basic.
Basic Entity to Entity Relationship System
Any time you uniquely identify a Person, Place, Thing, Group, Concept - pretty much any noun, you add it to an Entity table with a unique cryptoguid id (or BIGINT if you aren’t at all concerned about security). It is an optimistic model where it is presumed unique and if it is later determined to be a duplicate, it is merged and references replaced. Not hard, as there is only 2 foreign keys (described below).
There is a Entity Type table which is also an optimistic auto-add. Person, Party, Pool, Plane, Photograph etc. They needn’t start with the letter P, that’s pure coincidence mmhmm, yes.
Any time you have a relationship you want to explain like PARTY and ATTENDEE or PLANE and PASSENGER, the relationship is optimistically added to a relationship table that has the 2 entities/things in 2 columns. You would have a nomenclature standard for the relationship Description like [Plane/Passenger] such that if there is a larger/smaller it is generally described in that order. Each these relationships gets a BIGINT identifier (or cryptoguid but indexing becomes harder).
The “Tall/Skinny” table comes in last. This is where every entity relationship is recorded with some minor metadata and a time frame.
Entity1ID, Entity2ID, RelationshipID, UTCStartDateTime, UTCEndDateTime
The entities are indexed and the table has partition indexes based on RelationshipID to manage index size.
Queries are recursive, checks for infinite loops (This series seems familiar! eject eject), and can connect the dots between a great many things. PersonA was in a Town hall meeting that previously attended a party with another person who is a member of a group that has ownership of property that includes a pool that a pool party was held at and Person B swam in it. Significant? Maybe. Maybe not. But it allows for the systematic collection of the information in an organized way.
But, maybe you have that all sorted out already. If so, that’s wonderful.
-SyntheticJester