Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate to ODK 1.5 #793

Merged
merged 8 commits into from
Mar 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
matentzn marked this conversation as resolved.
Show resolved Hide 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 [email protected] && mv [email protected] $@


# ========================================
# 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")))
}
Loading