ga4gh / pedigree_family_history_terminology

Apache License 2.0
4 stars 3 forks source link

Should people be allowed to express the same relationship in six ways? #14

Closed julesjacobsen closed 2 years ago

julesjacobsen commented 2 years ago

@ametke @buske Currently the ontology has a bunch of inverse relationships namely is <-> has. Is there a good reason for this? Allowing this level of flexibility seems to be asking for trouble. For example the father - child relationship has these terms:

# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_003> (isBiologicalParent)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_003> "isBiologicalParent")
EquivalentObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_033>)
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_002>)
InverseObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_032>)
InverseObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_034>)
ObjectPropertyDomain(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_998>)
ObjectPropertyRange(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_998>)
DisjointObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_032>)

# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_028> (isBiologicalFather)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_028> "isBiologicalFather")
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_028> <http://purl.org/ga4gh/kin.owl#KIN_003>)
InverseObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_028> <http://purl.org/ga4gh/kin.owl#KIN_040>)
FunctionalObjectProperty(<http://purl.org/ga4gh/kin.owl#KIN_028>)
ObjectPropertyDomain(<http://purl.org/ga4gh/kin.owl#KIN_028> <http://purl.org/ga4gh/kin.owl#KIN_998>)
ObjectPropertyRange(<http://purl.org/ga4gh/kin.owl#KIN_028> <http://purl.org/ga4gh/kin.owl#KIN_994>)

# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_032> (isBiologicalChild)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_032> "isBiologicalChild")
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_032> <http://purl.org/ga4gh/kin.owl#KIN_002>)
InverseObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_032> <http://purl.org/ga4gh/kin.owl#KIN_033>)

# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_033> (hasBiologicalChild)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_033> "hasBiologicalChild"@en)
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_033> <http://purl.org/ga4gh/kin.owl#KIN_002>)

# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_034> (hasBiologicalParent)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_034> "hasBiologicalParent"@en)
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_034> <http://purl.org/ga4gh/kin.owl#KIN_002>)

# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_040> (hasBiologicalFather)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_040> "hasBiologicalFather"@en)
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_040> <http://purl.org/ga4gh/kin.owl#KIN_034>)

This will allow the same father - child relationship to be expressed in six (!!!) different ways:

    {
    "subject": "Homer",
    "relative": "Bart",
    "relationship": {
      "id": "KIN:003",
      "label": "isBiologicalParent"
    },
    {
    "subject": "Bart",
    "relative": "Homer",
    "relationship": {
      "id": "KIN:034",
      "label": "hasBiologicalParent"
    },
    {
    "subject": "Homer",
    "relative": "Bart",
    "relationship": {
      "id": "KIN:028",
      "label": "isBiologicalFather"
    },
    {
    "subject": "Bart",
    "relative": "Homer",
    "relationship": {
      "id": "KIN:040",
      "label": "hasBiologicalFather"
    },
    {
    "subject": "Homer",
    "relative": "Bart",
    "relationship": {
      "id": "KIN:033",
      "label": "hasBiologicalChild"
    },
    {
    "subject": "Bart",
    "relative": "Homer",
    "relationship": {
      "id": "KIN:032",
      "label": "isBiologicalChild"
    }

Only allowing one direction using an is_X_of relationship will massively simplify and standardise the way people can express these relationships. For example, only allowing these concepts for parent child relationship:


# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_003> (isBiologicalParent)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_003> "isBiologicalParent")
EquivalentObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_033>)
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_002>)
InverseObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_032>)
InverseObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_034>)
ObjectPropertyDomain(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_998>)
ObjectPropertyRange(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_998>)
DisjointObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_003> <http://purl.org/ga4gh/kin.owl#KIN_032>)

# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_028> (isBiologicalFather)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_028> "isBiologicalFather")
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_028> <http://purl.org/ga4gh/kin.owl#KIN_003>)
InverseObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_028> <http://purl.org/ga4gh/kin.owl#KIN_040>)
FunctionalObjectProperty(<http://purl.org/ga4gh/kin.owl#KIN_028>)
ObjectPropertyDomain(<http://purl.org/ga4gh/kin.owl#KIN_028> <http://purl.org/ga4gh/kin.owl#KIN_998>)
ObjectPropertyRange(<http://purl.org/ga4gh/kin.owl#KIN_028> <http://purl.org/ga4gh/kin.owl#KIN_994>)

# Object Property: <http://purl.org/ga4gh/kin.owl#KIN_027> (isBiologicalMother)

AnnotationAssertion(rdfs:label <http://purl.org/ga4gh/kin.owl#KIN_027> "isBiologicalMother")
SubObjectPropertyOf(<http://purl.org/ga4gh/kin.owl#KIN_027> <http://purl.org/ga4gh/kin.owl#KIN_003>)
InverseObjectProperties(<http://purl.org/ga4gh/kin.owl#KIN_027> <http://purl.org/ga4gh/kin.owl#KIN_041>)
FunctionalObjectProperty(<http://purl.org/ga4gh/kin.owl#KIN_027>)
ObjectPropertyDomain(<http://purl.org/ga4gh/kin.owl#KIN_027> <http://purl.org/ga4gh/kin.owl#KIN_998>)
ObjectPropertyRange(<http://purl.org/ga4gh/kin.owl#KIN_027> <http://purl.org/ga4gh/kin.owl#KIN_993>)

Would only allow people to say this of Bart and Homer:

    {
    "subject": "Homer",
    "relative": "Bart",
    "relationship": {
      "id": "KIN:003",
      "label": "isBiologicalParent"
    }

or more precisely

    {
    "subject": "Homer",
    "relative": "Bart",
    "relationship": {
      "id": "KIN:028",
      "label": "isBiologicalFather"
    }

I still maintain it would be better to have an 'of' suffix to these 'is' terms as mentioned in issue #13

ametke commented 2 years ago

Hi @julesjacobsen. The original motivation for adding additional relationships was to support some of the role chaining axioms like this one:

isBiologicalParent o isBiologicalSibling o isBiologicalChild SubPropertyOf: isCousin

Initially, we only had relationships going in one direction (i.e., from children to parents) but in this case we need to traverse back down, so we added relationships in the other direction (isBiologicalChild in this case). Some of the existing examples of family history ontologies also have the inverse relationships, e.g., hasBiologicalChild, so we added those too.

However, I agree that having the inverse relationships might complicate things and I don't think we need them for the axioms. I am happy to get rid of the inverse relationships and keep only the isXXXOf ones (and also happy to add the Of suffix).

Thoughts @buske? Is this ok?

cmungall commented 2 years ago

You can replace all instances of an inverse of R in a property chain with an object property expression (inverseOf R)

e.g.

isBiologicalParent o isBiologicalSibling o inverse(isBiologicalParent) SubPropertyOf: isCousin

But I think we may be mixing up ontology and data modeling here. The ontology should be as expressive as possible and can name inverses. The mechanism for subsetting this for a data exchange format would be different. E.g. in linkml we would use a semantic enum

aside: isROLE is an odd naming pattern and leaves direction ambiguous. I recommend:

And reserving isROLE for unary predicates (UPDATE I see this is covered in #13)

cmungall commented 2 years ago

Having said that, I don't think this is good practice:

image

it's up to you but it's much more standard to indicate synonyms with an annotation property rather than having two URIs for the same concept

ametke commented 2 years ago

Thanks @cmungall. I agree with your recommendations and will update the ontology following the naming conventions you suggested.