diff --git a/.github/workflows/qc.yml b/.github/workflows/qc.yml
index 00abf4d..4c0510c 100644
--- a/.github/workflows/qc.yml
+++ b/.github/workflows/qc.yml
@@ -19,7 +19,7 @@ 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.2
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
diff --git a/docs/odk-workflows/ManageDocumentation.md b/docs/odk-workflows/ManageDocumentation.md
index 38cb709..298e8ff 100644
--- a/docs/odk-workflows/ManageDocumentation.md
+++ b/docs/odk-workflows/ManageDocumentation.md
@@ -44,3 +44,4 @@ The documentation is _not_ automatically updated from the Markdown, and needs to
Just make sure you give GitHub 2-5 minutes to build the pages!
+
diff --git a/docs/odk-workflows/RepoManagement.md b/docs/odk-workflows/RepoManagement.md
index 88c7de4..16060fc 100644
--- a/docs/odk-workflows/RepoManagement.md
+++ b/docs/odk-workflows/RepoManagement.md
@@ -2,7 +2,7 @@
## Updating your ODK repository
-Your ODK repositories configuration is managed in `src/ontology/cob-odk.yaml`. Once you have made your changes, you can run the following to apply your changes to the repository:
+Your ODK repositories configuration is managed in `src/ontology/cob-odk.yaml`. The [ODK Project Configuration Schema](https://github.com/INCATools/ontology-development-kit/blob/master/docs/project-schema.md) defines all possible parameters that can be used in this config YAML. Once you have made your changes, you can run the following to apply your changes to the repository:
```
diff --git a/src/ontology/Makefile b/src/ontology/Makefile
index 809aa51..0a2126d 100644
--- a/src/ontology/Makefile
+++ b/src/ontology/Makefile
@@ -1,7 +1,7 @@
# ----------------------------------------
# Makefile for cob
# Generated using ontology-development-kit
-# ODK Version: v1.4
+# ODK Version: v1.5.2
# ----------------------------------------
# IMPORTANT: DO NOT EDIT THIS FILE. To override default make goals, use cob.Makefile instead
@@ -18,6 +18,9 @@
# 5. [Run COB tests](cob_test)
# 6. [Run everything (COB products and release pipeline)](all)
+# Fingerprint of the configuration file when this Makefile was last generated
+CONFIG_HASH= ee0faa650404ebb7b2d591feab04561dbd60f347a990a5e1c925bb6cb0ef0904
+
# ----------------------------------------
# Standard Constants
@@ -50,9 +53,9 @@ REPORT_FAIL_ON = None
REPORT_LABEL = -l true
REPORT_PROFILE_OPTS =
OBO_FORMAT_OPTIONS =
-SPARQL_VALIDATION_CHECKS = owldef-self-reference iri-range label-with-iri multiple-replaced_by
+SPARQL_VALIDATION_CHECKS = owldef-self-reference iri-range label-with-iri multiple-replaced_by dc-properties
SPARQL_EXPORTS = basic-report class-count-by-prefix edges xrefs obsoletes synonyms
-ODK_VERSION_MAKEFILE = v1.4
+ODK_VERSION_MAKEFILE = v1.5.2
TODAY ?= $(shell date +%Y-%m-%d)
OBODATE ?= $(shell date +'%d:%m:%Y %H:%M')
@@ -67,6 +70,11 @@ FORMATS = $(sort owl owl)
FORMATS_INCL_TSV = $(sort $(FORMATS) tsv)
RELEASE_ARTEFACTS = $(sort $(ONT)-base $(ONT)-full cob-base-reasoned cob-examples-reasoned cob-native )
+ifeq ($(ODK_DEBUG),yes)
+ODK_DEBUG_FILE = debug.log
+SHELL = $(SCRIPTSDIR)/run-command.sh
+endif
+
# ----------------------------------------
# Top-level targets
# ----------------------------------------
@@ -77,12 +85,16 @@ RELEASE_ARTEFACTS = $(sort $(ONT)-base $(ONT)-full cob-base-reasoned cob-example
all: all_odk
.PHONY: all_odk
-all_odk: odkversion test all_assets
+all_odk: odkversion config_check test custom_reports all_assets
.PHONY: test
test: odkversion reason_test sparql_test robot_reports $(REPORTDIR)/validate_profile_owl2dl_$(ONT).owl.txt
echo "Finished running all tests successfully."
+.PHONY: test
+test_fast:
+ $(MAKE_FAST) test
+
.PHONY: release_diff
release_diff: $(REPORTDIR)/release-diff.md
@@ -93,13 +105,52 @@ reason_test: $(EDIT_PREPROCESSED)
.PHONY: odkversion
odkversion:
- echo "ODK Makefile version: $(ODK_VERSION_MAKEFILE) (this is the version of the ODK with which this Makefile was generated, \
- not the version of the ODK you are running)" &&\
- echo "ROBOT version (ODK): " && $(ROBOT) --version
+ @echo "ODK Makefile $(ODK_VERSION_MAKEFILE)"
+ @odk-info --tools
+.PHONY: config_check
+config_check:
+ @if [ "$$(sha256sum $(ONT)-odk.yaml | cut -c1-64)" = "$(CONFIG_HASH)" ]; then \
+ echo "Repository is up-to-date." ; else \
+ echo "Your ODK configuration has changed since this Makefile was generated. You may need to run 'make update_repo'." ; fi
+
$(TMPDIR) $(REPORTDIR) $(MIRRORDIR) $(IMPORTDIR) $(COMPONENTSDIR) $(SUBSETDIR):
mkdir -p $@
+# ----------------------------------------
+# ODK-managed ROBOT plugins
+# ----------------------------------------
+
+# Make sure ROBOT knows where to find plugins
+export ROBOT_PLUGINS_DIRECTORY=$(TMPDIR)/plugins
+
+# Override this rule in cob.Makefile to install custom plugins
+.PHONY: custom_robot_plugins
+custom_robot_plugins:
+
+
+.PHONY: extra_robot_plugins
+extra_robot_plugins:
+
+
+# Install all ROBOT plugins to the runtime plugins directory
+.PHONY: all_robot_plugins
+all_robot_plugins: $(foreach plugin,$(notdir $(wildcard /tools/robot-plugins/*.jar)),$(ROBOT_PLUGINS_DIRECTORY)/$(plugin)) \
+ $(foreach plugin,$(notdir $(wildcard ../../plugins/*.jar)),$(ROBOT_PLUGINS_DIRECTORY)/$(plugin)) \
+ custom_robot_plugins extra_robot_plugins \
+
+# Default rule to install plugins
+$(ROBOT_PLUGINS_DIRECTORY)/%.jar:
+ @mkdir -p $(ROBOT_PLUGINS_DIRECTORY)
+ @if [ -f ../../plugins/$*.jar ]; then \
+ ln ../../plugins/$*.jar $@ ; \
+ elif [ -f /tools/robot-plugins/$*.jar ]; then \
+ cp /tools/robot-plugins/$*.jar $@ ; \
+ fi
+
+# Specific rules for supplementary plugins defined in configuration
+
+
# ----------------------------------------
# Release assets
# ----------------------------------------
@@ -189,10 +240,10 @@ validate_profile_%: $(REPORTDIR)/validate_profile_owl2dl_%.txt
SPARQL_VALIDATION_QUERIES = $(foreach V,$(SPARQL_VALIDATION_CHECKS),$(SPARQLDIR)/$(V)-violation.sparql)
-sparql_test: $(EDIT_PREPROCESSED) catalog-v001.xml | $(REPORTDIR)
+sparql_test: $(EDIT_PREPROCESSED) | $(REPORTDIR)
ifneq ($(SPARQL_VALIDATION_QUERIES),)
- $(ROBOT) verify --catalog catalog-v001.xml -i $(EDIT_PREPROCESSED) --queries $(SPARQL_VALIDATION_QUERIES) -O $(REPORTDIR)
+ $(ROBOT) verify -i $(EDIT_PREPROCESSED) --queries $(SPARQL_VALIDATION_QUERIES) -O $(REPORTDIR)
endif
# ----------------------------------------
@@ -205,6 +256,10 @@ $(REPORTDIR)/$(SRC)-obo-report.tsv: $(SRCMERGED) | $(REPORTDIR)
$(REPORTDIR)/%-obo-report.tsv: % | $(REPORTDIR)
$(ROBOT) report -i $< $(REPORT_LABEL) $(REPORT_PROFILE_OPTS) --fail-on $(REPORT_FAIL_ON) --base-iri $(URIBASE)/COB_ --base-iri $(URIBASE)/cob --print 5 -o $@
+check_for_robot_updates:
+ echo "You are not using a custom profile, so you are getting the joy of the latest ROBOT report!"
+
+
# ----------------------------------------
# Release assets
# ----------------------------------------
@@ -221,7 +276,7 @@ RELEASE_ASSETS = \
$(SUBSET_FILES)
.PHONY: all_assets
-all_assets: $(ASSETS)
+all_assets: $(ASSETS) check_rdfxml_assets
.PHONY: show_assets
show_assets:
@@ -229,7 +284,7 @@ show_assets:
du -sh $(ASSETS)
check_rdfxml_%: %
- @check-rdfxml $<
+ @check-rdfxml $<
.PHONY: check_rdfxml_assets
check_rdfxml_assets: $(foreach product,$(MAIN_PRODUCTS),check_rdfxml_$(product).owl)
@@ -382,9 +437,9 @@ recreate-%:
no-mirror-recreate-%:
$(MAKE) COMP=true IMP=false IMP_LARGE=false MIR=false PAT=true $(COMPONENTSDIR)/$*.owl -B
-$(COMPONENTSDIR)/%: | $(COMPONENTSDIR)
- touch $@
-.PRECIOUS: $(COMPONENTSDIR)/%
+$(COMPONENTSDIR)/%.owl: | $(COMPONENTSDIR)
+ test -f $@ || touch $@
+.PRECIOUS: $(COMPONENTSDIR)/%.owl
@@ -396,30 +451,33 @@ IMP=true # Global parameter to bypass import generation
MIR=true # Global parameter to bypass mirror generation
IMP_LARGE=true # Global parameter to bypass handling of large imports
+ifeq ($(strip $(MIR)),true)
## ONTOLOGY: ro
.PHONY: mirror-ro
.PRECIOUS: $(MIRRORDIR)/ro.owl
mirror-ro: | $(TMPDIR)
- if [ $(MIR) = true ] && [ $(IMP) = true ]; then curl -L $(OBOBASE)/ro.owl --create-dirs -o $(MIRRORDIR)/ro.owl --retry 4 --max-time 200 &&\
- $(ROBOT) convert -i $(MIRRORDIR)/ro.owl -o $@.tmp.owl &&\
- mv $@.tmp.owl $(TMPDIR)/$@.owl; fi
+ curl -L $(OBOBASE)/ro.owl --create-dirs -o $(TMPDIR)/ro-download.owl --retry 4 --max-time 200 && \
+ $(ROBOT) convert -i $(TMPDIR)/ro-download.owl -o $(TMPDIR)/$@.owl
## ONTOLOGY: omo
.PHONY: mirror-omo
.PRECIOUS: $(MIRRORDIR)/omo.owl
mirror-omo: | $(TMPDIR)
- if [ $(MIR) = true ] && [ $(IMP) = true ]; then curl -L $(OBOBASE)/omo.owl --create-dirs -o $(MIRRORDIR)/omo.owl --retry 4 --max-time 200 &&\
- $(ROBOT) convert -i $(MIRRORDIR)/omo.owl -o $@.tmp.owl &&\
- mv $@.tmp.owl $(TMPDIR)/$@.owl; fi
+ curl -L $(OBOBASE)/omo.owl --create-dirs -o $(TMPDIR)/omo-download.owl --retry 4 --max-time 200 && \
+ $(ROBOT) convert -i $(TMPDIR)/omo-download.owl -o $(TMPDIR)/$@.owl
$(MIRRORDIR)/%.owl: mirror-% | $(MIRRORDIR)
- if [ $(IMP) = true ] && [ $(MIR) = true ] && [ -f $(TMPDIR)/mirror-$*.owl ]; then if cmp -s $(TMPDIR)/mirror-$*.owl $@ ; then echo "Mirror identical, ignoring."; else echo "Mirrors different, updating." &&\
+ if [ -f $(TMPDIR)/mirror-$*.owl ]; then if cmp -s $(TMPDIR)/mirror-$*.owl $@ ; then echo "Mirror identical, ignoring."; else echo "Mirrors different, updating." &&\
cp $(TMPDIR)/mirror-$*.owl $@; fi; fi
+else # MIR=false
+$(MIRRORDIR)/%.owl:
+ @echo "Not refreshing $@ because the mirrorring pipeline is disabled (MIR=$(MIR))."
+endif
@@ -477,9 +535,13 @@ ROBOT_RELEASE_IMPORT_MODE=$(ROBOT) merge --input $<
# ROBOT pipeline that removes imports, then merges components. This is for release artefacts that start from "base"
ROBOT_RELEASE_IMPORT_MODE_BASE=$(ROBOT) remove --input $< --select imports --trim false merge $(patsubst %, -i %, $(OTHER_SRC))
-# base: All the axioms as they are editted by the editors, excluding reasoning
-$(ONT)-base.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC)
- $(ROBOT_RELEASE_IMPORT_MODE_BASE) \
+# base: A version of the ontology that does not include any externally imported axioms.
+$(ONT)-base.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) $(IMPORT_FILES)
+ $(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 $(URIBASE)/COB --axioms external --preserve-structure false --trim false \
$(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) \
@@ -555,13 +617,16 @@ update_repo:
update_docs:
mkdocs gh-deploy --config-file ../../mkdocs.yaml
-# Note to future generations: prepending ./ is a safety measure to ensure that
-# the environment does not malicously set `CLEANFILES` to `\`.
+# Note to future generations: computing the real path relative to the
+# current directory is a way to ensure we only clean up directories that
+# are located below the current directory, regardless of the contents of
+# the *DIR variables.
.PHONY: clean
clean:
- [ -n "$(MIRRORDIR)" ] && [ $(MIRRORDIR) != "." ] && [ $(MIRRORDIR) != "/" ] && [ $(MIRRORDIR) != ".." ] && [ -d ./$(MIRRORDIR) ] && rm -rf ./$(MIRRORDIR)/*
- [ -n "$(TMPDIR)" ] && [ $(TMPDIR) != "." ] && [ $(TMPDIR) != "/" ] && [ $(TMPDIR) != ".." ] && [ -d ./$(TMPDIR) ] && rm -rf ./$(TMPDIR)/*
- [ -n "$(UPDATEREPODIR)" ] && [ $(UPDATEREPODIR) != "." ] && [ $(UPDATEREPODIR) != "/" ] && [ $(UPDATEREPODIR) != ".." ] && [ -d ./$(UPDATEREPODIR) ] && rm -rf ./$(UPDATEREPODIR)/*
+ for dir in $(MIRRORDIR) $(TMPDIR) $(UPDATEREPODIR) ; do \
+ reldir=$$(realpath --relative-to=$$(pwd) $$dir) ; \
+ case $$reldir in .*|"") ;; *) rm -rf $$reldir/* ;; esac \
+ done
rm -f $(CLEANFILES)
.PHONY: help
@@ -580,6 +645,7 @@ Core commands:
* prepare_release_fast: Run the entire release pipeline without refreshing imports, recreating components or recompiling patterns.
* update_repo: Update the ODK repository setup using the config file cob-odk.yaml
* test: Running all validation tests
+* test_fast: Runs the test suite, but without updating imports or components
* odkversion: Show the current version of the ODK Makefile and ROBOT.
* clean: Delete all temporary files
* help: Print ODK Usage information
@@ -597,7 +663,7 @@ Imports management:
Editor utilities:
* validate_idranges: Make sure your ID ranges file is formatted correctly
-* normalize_src: Load and safe your cob-edit file after you to make sure its serialised correctly
+* normalize_src: Load and save your cob-edit file after you to make sure its serialised correctly
* explain_unsat: If you have unsatisfiable classes, this command will create a markdown file (tmp/explain_unsat.md) which will explain all your unsatisfiable classes
* validate-all-tsv: Check all your tsv files for possible problems in syntax. Use ALL_TSV_FILES variable to list files
* validate-tsv: Check a tsv file for syntactic problems with tsvalid. Use TSV variable to pass filepath, e.g. make TSV=../my.tsv validate-tsv.
diff --git a/src/ontology/cob-edit.owl b/src/ontology/cob-edit.owl
index 17d2614..7644147 100644
--- a/src/ontology/cob-edit.owl
+++ b/src/ontology/cob-edit.owl
@@ -12,9 +12,9 @@
xmlns:terms="http://purl.org/dc/terms/">
- COB brings together key terms from a wide range of OBO projects to improve interoperability.
- Core Ontology for Biology and Biomedicine
+ COB brings together key terms from a wide range of OBO projects to improve interoperability.
+ Core Ontology for Biology and Biomedicine
@@ -74,12 +74,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1343,7 +1361,7 @@
A processed material entity which is designed to perform a function.
- 2023-03-24T16:04:27Z
+ 2023-03-24T16:04:27Z
In this definition we assume devices are made of processed material, not natural artifacts, so we involve artifactual function rather than biological function, but align with a general BFO function sense where functions such as pumping, lifting can occur in both contexts. Thus we can compare a biological arm with a robotic arm device.
We say "designed" to emphasize a device's primary function rather than all the other possible dispositions a device may have that may also be useful. E.g. one can use a hammer for a paper weight.
diff --git a/src/ontology/cob-odk.yaml b/src/ontology/cob-odk.yaml
index afce01c..e17effd 100644
--- a/src/ontology/cob-odk.yaml
+++ b/src/ontology/cob-odk.yaml
@@ -6,6 +6,8 @@ git_main_branch: master
report_fail_on: ERROR
export_formats:
- owl
+workflows:
+ - docs
release_artefacts:
- base
- full
diff --git a/src/ontology/run.sh b/src/ontology/run.sh
index 2718ff6..873e9bd 100755
--- a/src/ontology/run.sh
+++ b/src/ontology/run.sh
@@ -14,6 +14,8 @@
#
# See README-editors.md for more details.
+set -e
+
if [ -f run.sh.conf ]; then
. ./run.sh.conf
fi
@@ -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
@@ -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
@@ -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
diff --git a/src/scripts/run-command.sh b/src/scripts/run-command.sh
new file mode 100755
index 0000000..45d431d
--- /dev/null
+++ b/src/scripts/run-command.sh
@@ -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 "$@"
diff --git a/src/scripts/update_repo.sh b/src/scripts/update_repo.sh
index 2865c26..1fa1b25 100644
--- a/src/scripts/update_repo.sh
+++ b/src/scripts/update_repo.sh
@@ -26,7 +26,8 @@ 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/docs.yml $ROOTDIR/.github/workflows/docs.yml
diff --git a/src/sparql/class-count-by-prefix.sparql b/src/sparql/class-count-by-prefix.sparql
index 0c4d284..a6a4851 100644
--- a/src/sparql/class-count-by-prefix.sparql
+++ b/src/sparql/class-count-by-prefix.sparql
@@ -7,4 +7,4 @@ SELECT ?prefix (COUNT(DISTINCT ?cls) AS ?numberOfClasses) WHERE
FILTER (!isBlank(?cls))
BIND( STRBEFORE(STRAFTER(str(?cls),"http://purl.obolibrary.org/obo/"), "_") AS ?prefix)
}
-GROUP BY ?prefix
+GROUP BY ?prefix
\ No newline at end of file
diff --git a/src/sparql/dc-properties-violation.sparql b/src/sparql/dc-properties-violation.sparql
new file mode 100644
index 0000000..cb74978
--- /dev/null
+++ b/src/sparql/dc-properties-violation.sparql
@@ -0,0 +1,11 @@
+# The purpose of this violation is to make sure people update
+# from using the deprecated DC Elements 1.1 namespace (http://purl.org/dc/elements/1.1/)
+# to using the recommended DC Terms namespace (http://purl.org/dc/terms/)
+# See also discussion on https://github.com/oborel/obo-relations/pull/692
+
+SELECT ?term ?predicate WHERE {
+ ?term ?predicate ?value .
+ FILTER(STRSTARTS(STR(?predicate), "http://purl.org/dc/elements/1.1/"))
+ FILTER(isIRI(?term) && (STRSTARTS(str(?term), "http://purl.obolibrary.org/obo/COB_")))
+}
+