Skip to content

Commit

Permalink
Making prefix mapping less strict, fixes #702 (#761)
Browse files Browse the repository at this point in the history
* Making prefix mapping less strict, fixes #702

Adds test that currently codifies ambiguous behavior.

See also #760 for broader issue.

This PR also extends the obo test suite to include this,
and adds some derived files previously missing.

* format

* add missing

* add missing

* fix GCI example

* fixed docs

* regenrate compliance test outputs

* Ensure prefixmap is not mutated

* relax test

* fmt
  • Loading branch information
cmungall committed Jun 5, 2024
1 parent 84bd709 commit 8b25588
Show file tree
Hide file tree
Showing 37 changed files with 1,031 additions and 20 deletions.
9 changes: 7 additions & 2 deletions src/oaklib/interfaces/basic_ontology_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import logging
from abc import ABC
from collections import defaultdict
from copy import copy
from dataclasses import dataclass, field
from functools import lru_cache
from pathlib import Path
Expand Down Expand Up @@ -164,6 +165,8 @@ class BasicOntologyInterface(OntologyInterface, ABC):
_edge_index: Optional[EdgeIndex] = None
_entailed_edge_index: Optional[EdgeIndex] = None

_prefix_map: Optional[PREFIX_MAP] = None

def prefix_map(self) -> PREFIX_MAP:
"""
Return a dictionary mapping all prefixes known to the resource to their URI expansion.
Expand All @@ -183,7 +186,9 @@ def prefix_map(self) -> PREFIX_MAP:
:return: prefix map
"""
return get_default_prefix_map()
if not self._prefix_map:
self._prefix_map = copy(get_default_prefix_map())
return self._prefix_map

@deprecated("Replaced by prefix_map")
def get_prefix_map(self) -> PREFIX_MAP:
Expand All @@ -203,7 +208,7 @@ def converter(self) -> curies.Converter:
:return: A converter
"""
if self._converter is None:
self._converter = curies.Converter.from_prefix_map(self.prefix_map())
self._converter = curies.Converter.from_prefix_map(self.prefix_map(), strict=False)
return self._converter

def set_metamodel_mappings(self, mappings: Union[str, Path, List[Mapping]]) -> None:
Expand Down
17 changes: 17 additions & 0 deletions tests/input/metadata-map-prefixes-test.obo
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
format-version: 1.2
ontology: test.obo
idspace: dc http://purl.org/dc/elements/1.1/
idspace: oboInOwl http://www.geneontology.org/formats/oboInOwl#
idspace: owl http://www.w3.org/2002/07/owl#
idspace: rdf http://www.w3.org/1999/02/22-rdf-syntax-ns#
idspace: rdfs http://www.w3.org/2000/01/rdf-schema#
idspace: terms http://purl.org/dc/terms/
idspace: xml http://www.w3.org/XML/1998/namespace
idspace: xsd http://www.w3.org/2001/XMLSchema#
idspace: HP http://purl.obolibrary.org/obo/HP_

[Term]
id: HP:0000001
name: All
def: "." [PMID:1]

61 changes: 61 additions & 0 deletions tests/input/obo-compliance.obo
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,53 @@ idspace: Y http://example.org/Y/
id: X:1
created_by: Y:1

!! name: prefixes-conflict-oio
!! description: tests conflicting prefixes/contractions for oboInOwl namespace, where oio might be built-in
!! unstable: true
!! seeAlso: https://github.com/INCATools/ontology-access-kit/issues/760
idspace: oboInOwl http://www.geneontology.org/formats/oboInOwl#

[Term]
id: X:1
name: X:1
def: "." []

!! name: prefixes-conflict-skos
!! description: tests conflicting prefixes for the SKOS namespace
!! unstable: true
!! seeAlso: https://github.com/INCATools/ontology-access-kit/issues/760
idspace: skos http://example.org/not-skos/

[Term]
id: X:1
property_value: skos:exactMatch Y:1

[Typedef]
id: skos:exactMatch
is_metadata_tag: true

!! name: prefixes-conflict-main-idspace
!! description: tests conflicting prefixes for the main ID space
!! invalid: true
!! seeAlso: https://github.com/INCATools/ontology-access-kit/issues/760
idspace: X http://example.org/X/
idspace: FAKEX http://example.org/X/

[Term]
id: X:1
name: X:1

!! name: expansion-conflict-main-idspace
!! description: tests conflicting expansions for the main ID space
!! invalid: true
!! seeAlso: https://github.com/INCATools/ontology-access-kit/issues/760
idspace: X http://example.org/X/
idspace: X http://example.org/FAKEX/

[Term]
id: X:1
name: X:1

!! # #########
!! # Headers
!! # #########
Expand Down Expand Up @@ -658,6 +705,20 @@ subset: S {source="PMID:123464"}
id: X:1
disjoint_from: X:2 {source="PMID:123465"}

!! name: gci-relation
!! description: General Class Inclusion relation

[Term]
id: X:1
relationship: R:1 X:2 {gci_relation="R:2", gci_filler="X:3"}

!! name: gci-is-a
!! description: General Class Inclusion is_a

[Term]
id: X:1
is_a: X:2 {gci_relation="R:2", gci_filler="X:3"}

!! name: created_by-annotated
!! description: Metadata for creator with annotation

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
name: expansion-conflict-main-idspace
name: expansion-conflict-main-idspace
description: tests conflicting expansions for the main ID space
invalid: true
seeAlso: https://github.com/INCATools/ontology-access-kit/issues/760
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
format-version: 1.4
ontology: expansion-conflict-main-idspace
idspace: X http://example.org/X/
idspace: X http://example.org/FAKEX/

[Term]
id: X:1
name: X:1


31 changes: 31 additions & 0 deletions tests/input/obo-compliance/gci-is-a/gci-is-a.expected.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"graphs" : [ {
"id" : "http://purl.obolibrary.org/obo/gci-is-a.owl",
"meta" : {
"basicPropertyValues" : [ {
"pred" : "http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion",
"val" : "1.4"
} ]
},
"nodes" : [ {
"id" : "http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion",
"lbl" : "has_obo_format_version",
"type" : "PROPERTY"
}, {
"id" : "http://www.geneontology.org/formats/oboInOwl#id",
"lbl" : "id",
"type" : "PROPERTY"
} ],
"edges" : [ {
"sub" : "http://purl.obolibrary.org/obo/X_1",
"pred" : "is_a",
"obj" : "http://purl.obolibrary.org/obo/X_2",
"meta" : {
"basicPropertyValues" : [ {
"pred" : "http://www.geneontology.org/formats/oboInOwl#gci_predicate",
"val" : "R:2"
} ]
}
} ]
} ]
}
7 changes: 7 additions & 0 deletions tests/input/obo-compliance/gci-is-a/gci-is-a.expected.obo
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
format-version: 1.2
ontology: gci-is-a

[Term]
id: X:1
is_a: X:2 {gci_predicate="R:2"}

41 changes: 41 additions & 0 deletions tests/input/obo-compliance/gci-is-a/gci-is-a.expected.ofn
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
Prefix(:=<http://purl.obolibrary.org/obo/gci-is-a.owl#>)
Prefix(owl:=<http://www.w3.org/2002/07/owl#>)
Prefix(rdf:=<http://www.w3.org/1999/02/22-rdf-syntax-ns#>)
Prefix(xml:=<http://www.w3.org/XML/1998/namespace>)
Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)


Ontology(<http://purl.obolibrary.org/obo/gci-is-a.owl>
Annotation(<http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion> "1.4")

Declaration(Class(<http://purl.obolibrary.org/obo/X_1>))
Declaration(Class(<http://purl.obolibrary.org/obo/X_2>))
Declaration(AnnotationProperty(<http://www.geneontology.org/formats/oboInOwl#gci_predicate>))
Declaration(AnnotationProperty(<http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion>))
Declaration(AnnotationProperty(<http://www.geneontology.org/formats/oboInOwl#id>))
############################
# Annotation Properties
############################

# Annotation Property: <http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion> (has_obo_format_version)

AnnotationAssertion(rdfs:label <http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion> "has_obo_format_version")

# Annotation Property: <http://www.geneontology.org/formats/oboInOwl#id> (id)

AnnotationAssertion(rdfs:label <http://www.geneontology.org/formats/oboInOwl#id> "id")



############################
# Classes
############################

# Class: <http://purl.obolibrary.org/obo/X_1> (<http://purl.obolibrary.org/obo/X_1>)

AnnotationAssertion(<http://www.geneontology.org/formats/oboInOwl#id> <http://purl.obolibrary.org/obo/X_1> "X:1")
SubClassOf(Annotation(<http://www.geneontology.org/formats/oboInOwl#gci_predicate> "R:2") <http://purl.obolibrary.org/obo/X_1> <http://purl.obolibrary.org/obo/X_2>)


)
83 changes: 83 additions & 0 deletions tests/input/obo-compliance/gci-is-a/gci-is-a.expected.owl
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?xml version="1.0"?>
<rdf:RDF xmlns="http://purl.obolibrary.org/obo/gci-is-a.owl#"
xml:base="http://purl.obolibrary.org/obo/gci-is-a.owl"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:oboInOwl="http://www.geneontology.org/formats/oboInOwl#">
<owl:Ontology rdf:about="http://purl.obolibrary.org/obo/gci-is-a.owl">
<oboInOwl:hasOBOFormatVersion>1.4</oboInOwl:hasOBOFormatVersion>
</owl:Ontology>



<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Annotation properties
//
///////////////////////////////////////////////////////////////////////////////////////
-->




<!-- http://www.geneontology.org/formats/oboInOwl#gci_predicate -->

<owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#gci_predicate"/>



<!-- http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion -->

<owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion">
<rdfs:label>has_obo_format_version</rdfs:label>
</owl:AnnotationProperty>



<!-- http://www.geneontology.org/formats/oboInOwl#id -->

<owl:AnnotationProperty rdf:about="http://www.geneontology.org/formats/oboInOwl#id">
<rdfs:label>id</rdfs:label>
</owl:AnnotationProperty>



<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Classes
//
///////////////////////////////////////////////////////////////////////////////////////
-->




<!-- http://purl.obolibrary.org/obo/X_1 -->

<owl:Class rdf:about="http://purl.obolibrary.org/obo/X_1">
<rdfs:subClassOf rdf:resource="http://purl.obolibrary.org/obo/X_2"/>
<oboInOwl:id>X:1</oboInOwl:id>
</owl:Class>
<owl:Axiom>
<owl:annotatedSource rdf:resource="http://purl.obolibrary.org/obo/X_1"/>
<owl:annotatedProperty rdf:resource="http://www.w3.org/2000/01/rdf-schema#subClassOf"/>
<owl:annotatedTarget rdf:resource="http://purl.obolibrary.org/obo/X_2"/>
<oboInOwl:gci_predicate>R:2</oboInOwl:gci_predicate>
</owl:Axiom>



<!-- http://purl.obolibrary.org/obo/X_2 -->

<owl:Class rdf:about="http://purl.obolibrary.org/obo/X_2"/>
</rdf:RDF>



<!-- Generated by the OWL API (version 4.5.26) https://github.com/owlcs/owlapi -->

3 changes: 3 additions & 0 deletions tests/input/obo-compliance/gci-is-a/gci-is-a.meta.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
name: gci-is-a
name: gci-is-a
description: General Class Inclusion is_a
7 changes: 7 additions & 0 deletions tests/input/obo-compliance/gci-is-a/gci-is-a.obo
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
format-version: 1.4
ontology: gci-is-a

[Term]
id: X:1
is_a: X:2 {gci_relation="R:2", gci_filler="X:3"}

31 changes: 31 additions & 0 deletions tests/input/obo-compliance/gci-relation/gci-relation.expected.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"graphs" : [ {
"id" : "http://purl.obolibrary.org/obo/gci-relation.owl",
"meta" : {
"basicPropertyValues" : [ {
"pred" : "http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion",
"val" : "1.4"
} ]
},
"nodes" : [ {
"id" : "http://www.geneontology.org/formats/oboInOwl#hasOBOFormatVersion",
"lbl" : "has_obo_format_version",
"type" : "PROPERTY"
}, {
"id" : "http://www.geneontology.org/formats/oboInOwl#id",
"lbl" : "id",
"type" : "PROPERTY"
} ],
"edges" : [ {
"sub" : "http://purl.obolibrary.org/obo/X_1",
"pred" : "http://purl.obolibrary.org/obo/R_1",
"obj" : "http://purl.obolibrary.org/obo/X_2",
"meta" : {
"basicPropertyValues" : [ {
"pred" : "http://www.geneontology.org/formats/oboInOwl#gci_predicate",
"val" : "R:2"
} ]
}
} ]
} ]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
format-version: 1.2
ontology: gci-relation

[Term]
id: X:1
relationship: R:1 X:2 {gci_predicate="R:2"}

Loading

0 comments on commit 8b25588

Please sign in to comment.