I'm trying to represent the following real world situation:
- "Document Alfred" contains the following annexes: "Document Zoey" as "Annex 1" and "Image 1" as "Annex 2"
- "Document Betty" contains the following annexes: "Song Rocky" as "Annex A" and "Document Zoey" as "Annex B"
I expected this to be fairly straightforward, but instead I ended up in making a mess, even to the point of having:
- A class "Document"
- A class "AnnexionID"
- An inverse functional object property "identifiesAnnexOf"
- An inverse functional object property "identifiesAsAnnex"
- Two inverse object properties for the latter two
- An object property "hasAnnex", which is a subproperty of the transitive one "hasPart", plus its inverse property "isAnnexOf".
This looks over-complicated to me, but is it? I would expect this to be a typical design pattern. What is (are) the relevant best practices?