Skip to content

Commit

Permalink
Migrate to ODK 1.5 (#793)
Browse files Browse the repository at this point in the history
* Remove injected labels from COB

* Update ODK 1.5 files

* Remove annotations from COB import

to avoid multiple label bug

* Fix main branch ref

* Add a few more BFO rels to list of base namespaces

* Add fix towards for the base file in RO

* Update ro.Makefile
  • Loading branch information
matentzn authored Mar 5, 2024
1 parent bf9a48f commit a389e11
Show file tree
Hide file tree
Showing 12 changed files with 213 additions and 103 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/qc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ jobs:
ontology_qc:
# The type of runner that the job will run on
runs-on: ubuntu-latest
container: obolibrary/odkfull:v1.4
container: obolibrary/odkfull:v1.5

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- uses: actions/checkout@v3

- name: Run ontology QC checks
env:
Expand Down
191 changes: 125 additions & 66 deletions src/ontology/Makefile

Large diffs are not rendered by default.

34 changes: 9 additions & 25 deletions src/ontology/imports/cob_import.owl
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ Prefix(rdfs:=<http://www.w3.org/2000/01/rdf-schema#>)


Ontology(<http://purl.obolibrary.org/obo/ro/imports/cob_import.owl>
<http://purl.obolibrary.org/obo/ro/releases/2024-02-09/imports/cob_import.owl>
<http://purl.obolibrary.org/obo/ro/releases/2024-03-02/imports/cob_import.owl>
Annotation(<http://purl.org/dc/elements/1.1/source> <http://purl.obolibrary.org/obo/cob/releases/2023-11-16/cob.owl>)
Annotation(owl:versionInfo "2024-02-09")
Annotation(owl:versionInfo "2024-03-02")

Declaration(Class(<http://purl.obolibrary.org/obo/BFO_0000015>))
Declaration(Class(<http://purl.obolibrary.org/obo/BFO_0000016>))
Expand Down Expand Up @@ -57,59 +57,43 @@ AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/IAO_0000115> "def
# Object Properties
############################

# Object Property: <http://purl.obolibrary.org/obo/BFO_0000050> (part of)
# Object Property: <http://purl.obolibrary.org/obo/BFO_0000050> (<http://purl.obolibrary.org/obo/BFO_0000050>)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/BFO_0000050> "part of")
InverseObjectProperties(<http://purl.obolibrary.org/obo/BFO_0000050> <http://purl.obolibrary.org/obo/BFO_0000051>)
TransitiveObjectProperty(<http://purl.obolibrary.org/obo/BFO_0000050>)

# Object Property: <http://purl.obolibrary.org/obo/BFO_0000051> (has part)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/BFO_0000051> "has part")

# Object Property: <http://purl.obolibrary.org/obo/BFO_0000054> (realized in)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/BFO_0000054> "realized in"@en)

# Object Property: <http://purl.obolibrary.org/obo/BFO_0000066> (occurs in)
# Object Property: <http://purl.obolibrary.org/obo/BFO_0000066> (<http://purl.obolibrary.org/obo/BFO_0000066>)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/BFO_0000066> "occurs in")
InverseObjectProperties(<http://purl.obolibrary.org/obo/BFO_0000066> <http://purl.obolibrary.org/obo/BFO_0000067>)
ObjectPropertyDomain(<http://purl.obolibrary.org/obo/BFO_0000066> <http://purl.obolibrary.org/obo/BFO_0000015>)

# Object Property: <http://purl.obolibrary.org/obo/BFO_0000067> (contains process)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/BFO_0000067> "contains process"@en)

# Object Property: <http://purl.obolibrary.org/obo/RO_0000052> (characteristic of)
# Object Property: <http://purl.obolibrary.org/obo/RO_0000052> (<http://purl.obolibrary.org/obo/RO_0000052>)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/RO_0000052> "characteristic of"@en)
InverseObjectProperties(<http://purl.obolibrary.org/obo/RO_0000052> <http://purl.obolibrary.org/obo/RO_0000053>)

# Object Property: <http://purl.obolibrary.org/obo/RO_0000053> (has characteristic)
# Object Property: <http://purl.obolibrary.org/obo/RO_0000053> (<http://purl.obolibrary.org/obo/RO_0000053>)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/RO_0000053> "has characteristic")
AnnotationAssertion(rdfs:seeAlso <http://purl.obolibrary.org/obo/RO_0000053> "https://github.com/oborel/obo-relations/pull/284")
InverseFunctionalObjectProperty(<http://purl.obolibrary.org/obo/RO_0000053>)
ObjectPropertyRange(<http://purl.obolibrary.org/obo/RO_0000053> <http://purl.obolibrary.org/obo/BFO_0000020>)

# Object Property: <http://purl.obolibrary.org/obo/RO_0000056> (participates in)
# Object Property: <http://purl.obolibrary.org/obo/RO_0000056> (<http://purl.obolibrary.org/obo/RO_0000056>)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/RO_0000056> "participates in"@en)
InverseObjectProperties(<http://purl.obolibrary.org/obo/RO_0000056> <http://purl.obolibrary.org/obo/RO_0000057>)

# Object Property: <http://purl.obolibrary.org/obo/RO_0000057> (has participant)
# Object Property: <http://purl.obolibrary.org/obo/RO_0000057> (<http://purl.obolibrary.org/obo/RO_0000057>)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/RO_0000057> "has participant")
ObjectPropertyDomain(<http://purl.obolibrary.org/obo/RO_0000057> <http://purl.obolibrary.org/obo/BFO_0000015>)

# Object Property: <http://purl.obolibrary.org/obo/RO_0000058> (is concretized as)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/RO_0000058> "is concretized as"@en)

# Object Property: <http://purl.obolibrary.org/obo/RO_0002333> (enabled by)
# Object Property: <http://purl.obolibrary.org/obo/RO_0002333> (<http://purl.obolibrary.org/obo/RO_0002333>)

AnnotationAssertion(rdfs:label <http://purl.obolibrary.org/obo/RO_0002333> "enabled by")
SubObjectPropertyOf(<http://purl.obolibrary.org/obo/RO_0002333> <http://purl.obolibrary.org/obo/RO_0000057>)


Expand Down
7 changes: 7 additions & 0 deletions src/ontology/ro-odk.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
id: ro
title: "OBO Relations Ontology"
github_org: oborel
git_main_branch: master
repo: obo-relations
report_fail_on: Error
edit_format: owl
Expand All @@ -18,6 +19,12 @@ namespaces:
- http://purl.obolibrary.org/obo/BFO_0000050
- http://purl.obolibrary.org/obo/BFO_0000051
- http://purl.obolibrary.org/obo/BFO_0000060
- http://purl.obolibrary.org/obo/BFO_0000062
- http://purl.obolibrary.org/obo/BFO_0000063
- http://purl.obolibrary.org/obo/BFO_0000066
- http://purl.obolibrary.org/obo/BFO_0000067
- http://purl.obolibrary.org/obo/BFO_0000054
- http://purl.obolibrary.org/obo/BFO_0000055
import_group:
annotation_properties:
- rdfs:label
Expand Down
25 changes: 25 additions & 0 deletions src/ontology/ro.Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,34 @@ $(IMPORTDIR)/cob_import.owl: $(MIRRORDIR)/cob.owl $(IMPORTDIR)/cob_terms_combine
if [ $(IMP) = true ]; then $(ROBOT) query -i $< --update ../sparql/preprocess-module.ru \
extract -T $(IMPORTDIR)/cob_terms_combined.txt --copy-ontology-annotations true --force true --method BOT \
remove $(patsubst %, --term %, $(ANNOTATION_PROPERTIES)) -T $(IMPORTDIR)/cob_terms_combined.txt --select complement \
remove --select "RO:* BFO:0000050* BFO:0000051* BFO:0000060* BFO:0000066*" --axioms "annotation" \
query --update ../sparql/inject-subset-declaration.ru --update ../sparql/inject-synonymtype-declaration.ru --update ../sparql/postprocess-module.ru \
$(ANNOTATE_CONVERT_FILE); fi

# ========================================
# Custom imports
# ========================================

# This filter contains all property characteristic related to RO entities
# Note: For some reason, IrreflexiveObjectProperty is not supported
tmp/missing-base.owl: $(EDIT_PREPROCESSED) $(ONTOLOGYTERMS)
$(ROBOT) merge -i $(EDIT_PREPROCESSED) \
filter -T $(ONTOLOGYTERMS) --trim false --axioms "AsymmetricObjectProperty FunctionalObjectProperty FunctionalDataProperty InverseFunctionalObjectProperty SymmetricObjectProperty TransitiveObjectProperty InverseObjectProperties ObjectPropertyDomain DataPropertyDomain DataPropertyRange ObjectPropertyRange" \
-o [email protected] && mv [email protected] $@

# TODO: This goal (and tmp/missing-base.owl) can be removed once https://github.com/ontodev/robot/issues/1108 is resolved
$(ONT)-base.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) $(IMPORT_FILES) tmp/missing-base.owl
$(ROBOT_RELEASE_IMPORT_MODE) \
reason --reasoner ELK --equivalent-classes-allowed asserted-only --exclude-tautologies structural --annotate-inferred-axioms False \
relax \
reduce -r ELK \
remove --base-iri http://purl.obolibrary.org/obo/RO_ --base-iri http://purl.obolibrary.org/obo/BFO_0000050 --base-iri http://purl.obolibrary.org/obo/BFO_0000051 --base-iri http://purl.obolibrary.org/obo/BFO_0000060 --base-iri http://purl.obolibrary.org/obo/BFO_0000062 --base-iri http://purl.obolibrary.org/obo/BFO_0000063 --base-iri http://purl.obolibrary.org/obo/BFO_0000066 --base-iri http://purl.obolibrary.org/obo/BFO_0000067 --base-iri http://purl.obolibrary.org/obo/BFO_0000054 --base-iri http://purl.obolibrary.org/obo/BFO_0000055 --axioms external --preserve-structure false --trim false \
merge -i tmp/missing-base.owl \
$(SHARED_ROBOT_COMMANDS) \
annotate --link-annotation http://purl.org/dc/elements/1.1/type http://purl.obolibrary.org/obo/IAO_8000001 \
--ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
--output $@.tmp.owl && mv $@.tmp.owl $@


# ========================================
# DOCUMENTATION
Expand Down
38 changes: 34 additions & 4 deletions src/ontology/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#
# See README-editors.md for more details.

set -e

if [ -f run.sh.conf ]; then
. ./run.sh.conf
fi
Expand All @@ -29,6 +31,22 @@ elif [ -f "$HOME/Library/Application Support/ontology-development-kit/github/tok
GH_TOKEN=$(cat "$HOME/Library/Application Support/ontology-development-kit/github/token")
fi

# SSH agent socket
# On macOS, we cannot use $SSH_AUTH_SOCK directly,
# we need to use a "magic" socket instead.
case "$(uname)" in
Darwin)
ODK_SSH_AUTH_SOCKET=/run/host-services/ssh-auth.sock
;;
*)
ODK_SSH_AUTH_SOCKET=$SSH_AUTH_SOCK
;;
esac
ODK_SSH_BIND=
if [ -n "$ODK_SSH_AUTH_SOCKET" ]; then
ODK_SSH_BIND=",$ODK_SSH_AUTH_SOCKET:/run/host-services/ssh-auth.sock"
fi

ODK_IMAGE=${ODK_IMAGE:-odkfull}
TAG_IN_IMAGE=$(echo $ODK_IMAGE | awk -F':' '{ print $2 }')
if [ -n "$TAG_IN_IMAGE" ]; then
Expand All @@ -40,16 +58,28 @@ ODK_TAG=${ODK_TAG:-latest}
ODK_JAVA_OPTS=${ODK_JAVA_OPTS:--Xmx8G}
ODK_DEBUG=${ODK_DEBUG:-no}

ODK_USER_ID=${ODK_USER_ID:-$(id -u)}
ODK_GROUP_ID=${ODK_GROUP_ID:-$(id -g)}

# Convert OWLAPI_* environment variables to the OWLAPI as Java options
# See http://owlcs.github.io/owlapi/apidocs_4/org/semanticweb/owlapi/model/parameters/ConfigurationOptions.html
# for a list of allowed options
OWLAPI_OPTIONS_NAMESPACE=org.semanticweb.owlapi.model.parameters.ConfigurationOptions
for owlapi_var in $(env | sed -n s/^OWLAPI_//p) ; do
ODK_JAVA_OPTS="$ODK_JAVA_OPTS -D$OWLAPI_OPTIONS_NAMESPACE.${owlapi_var%=*}=${owlapi_var#*=}"
done

TIMECMD=
if [ x$ODK_DEBUG = xyes ]; then
# If you wish to change the format string, take care of using
# non-breaking spaces (U+00A0) instead of normal spaces, to
# prevent the shell from tokenizing the format string.
echo "Running ${IMAGE} with ${ODK_JAVA_OPTS} of memory for ROBOT and Java-based pipeline steps."
echo "Running obolibrary/${ODK_IMAGE}:${ODK_TAG} with '${ODK_JAVA_OPTS}' as options for ROBOT and other Java-based pipeline steps."
TIMECMD="/usr/bin/time -f ### DEBUG STATS ###\nElapsed time: %E\nPeak memory: %M kb"
fi
rm -f tmp/debug.log

VOLUME_BIND=$PWD/../../:/work
VOLUME_BIND=$PWD/../../:/work$ODK_SSH_BIND
WORK_DIR=/work/src/ontology

if [ -n "$ODK_BINDS" ]; then
Expand All @@ -59,14 +89,14 @@ fi
if [ -n "$USE_SINGULARITY" ]; then

singularity exec --cleanenv $ODK_SINGULARITY_OPTIONS \
--env "ROBOT_JAVA_ARGS=$ODK_JAVA_OPTS,JAVA_OPTS=$ODK_JAVA_OPTS" \
--env "ROBOT_JAVA_ARGS=$ODK_JAVA_OPTS,JAVA_OPTS=$ODK_JAVA_OPTS,SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock,ODK_USER_ID=$ODK_USER_ID,ODK_GROUP_ID=$ODK_GROUP_ID,ODK_DEBUG=$ODK_DEBUG" \
--bind $VOLUME_BIND \
-W $WORK_DIR \
docker://obolibrary/$ODK_IMAGE:$ODK_TAG $TIMECMD "$@"
else
BIND_OPTIONS="-v $(echo $VOLUME_BIND | sed 's/,/ -v /')"
docker run $ODK_DOCKER_OPTIONS $BIND_OPTIONS -w $WORK_DIR \
-e ROBOT_JAVA_ARGS="$ODK_JAVA_OPTS" -e JAVA_OPTS="$ODK_JAVA_OPTS" \
-e ROBOT_JAVA_ARGS="$ODK_JAVA_OPTS" -e JAVA_OPTS="$ODK_JAVA_OPTS" -e SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock -e ODK_USER_ID=$ODK_USER_ID -e ODK_GROUP_ID=$ODK_GROUP_ID -e ODK_DEBUG=$ODK_DEBUG \
--rm -ti obolibrary/$ODK_IMAGE:$ODK_TAG $TIMECMD "$@"
fi

Expand Down
4 changes: 4 additions & 0 deletions src/scripts/run-command.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/sh
ODK_DEBUG_FILE=${ODK_DEBUG_FILE:-debug.log}
echo "Command: sh $@" >> $ODK_DEBUG_FILE
/usr/bin/time -a -o $ODK_DEBUG_FILE -f "Elapsed time: %E\nPeak memory: %M kb" /bin/sh "$@"
5 changes: 3 additions & 2 deletions src/scripts/update_repo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ cp target/$OID/src/ontology/run.sh $SRCDIR/ontology/
cp -r target/$OID/src/sparql/* $SRCDIR/sparql/
mkdir -p $ROOTDIR/.github
mkdir -p $ROOTDIR/.github/workflows
cp -n target/$OID/.github/workflows/qc.yml $ROOTDIR/.github/workflows/qc.yml
cp target/$OID/.github/workflows/qc.yml $ROOTDIR/.github/workflows/qc.yml




echo "WARNING: These files should be manually migrated: mkdocs.yaml, .gitignore, src/ontology/catalog.xml (if you added a new import or component)"
echo "WARNING: Your QC workflows have not been updated automatically. Please update the ODK version number(s) in .github/workflows/qc.yml."

echo "Ontology repository update successfully completed."
2 changes: 1 addition & 1 deletion src/sparql/iri-range-violation.sparql
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ WHERE {
oboInOwl:inSubset
dcterms:contributor }
?term ?property ?value .
FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/RO_") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000050") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000051") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000060")))
FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/RO_") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000050") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000051") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000060") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000062") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000063") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000066") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000067") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000054") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000055")))
FILTER (!isIRI(?value))
}

2 changes: 1 addition & 1 deletion src/sparql/label-with-iri-violation.sparql
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ SELECT ?term ?value
WHERE {
?term rdfs:label ?value .
FILTER (REGEX(?value, "http[s]?[:]"))
FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/RO_") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000050") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000051") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000060")))
FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/RO_") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000050") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000051") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000060") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000062") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000063") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000066") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000067") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000054") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000055")))
}

2 changes: 1 addition & 1 deletion src/sparql/owldef-self-reference-violation.sparql
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ SELECT ?term WHERE {
{ ?term owl:equivalentClass [ owl:intersectionOf [ rdf:rest*/rdf:first ?term ] ] }
UNION
{ ?term owl:equivalentClass [ owl:intersectionOf [ rdf:rest*/rdf:first [ owl:someValuesFrom ?term ] ] ] }
FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/RO_") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000050") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000051") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000060")))
FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/RO_") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000050") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000051") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000060") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000062") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000063") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000066") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000067") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000054") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000055")))
}

2 changes: 1 addition & 1 deletion src/sparql/ro_terms.sparql
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ WHERE {
{ ?s1 ?p1 ?term . }
UNION
{ ?term ?p2 ?o2 . }
FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/RO_") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000050") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000051") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000060")))
FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/RO_") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000050") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000051") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000060") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000062") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000063") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000066") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000067") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000054") || STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/BFO_0000055")))
}

0 comments on commit a389e11

Please sign in to comment.