diff --git a/.github/deployment/sparql/citation-required.sparql b/.github/deployment/sparql/citation-required.sparql
new file mode 100644
index 00000000..f6f63547
--- /dev/null
+++ b/.github/deployment/sparql/citation-required.sparql
@@ -0,0 +1,29 @@
+# Title:
+# Missing Bibliographic Citation
+# Constraint Description:
+# Every resource shall have one or more bibliographic citations.
+# Severity:
+# Error
+
+PREFIX cco:
+PREFIX owl:
+PREFIX dcterms:
+
+SELECT DISTINCT ?entity ?type WHERE {
+ VALUES ?type {
+ owl:Class
+ owl:ObjectProperty
+ owl:DatatypeProperty
+ owl:AnnotationProperty
+ owl:NamedIndividual
+ }
+
+ ?entity a ?type .
+
+ FILTER(STRSTARTS(STR(?entity), STR(cco:)))
+
+ FILTER NOT EXISTS {
+ ?entity dcterms:bibliographicCitation ?citation .
+ }
+}
+ORDER BY ?entity
\ No newline at end of file
diff --git a/.github/deployment/sparql/feature-not-under-environmental.sparql b/.github/deployment/sparql/feature-not-under-environmental.sparql
new file mode 100644
index 00000000..439674c0
--- /dev/null
+++ b/.github/deployment/sparql/feature-not-under-environmental.sparql
@@ -0,0 +1,25 @@
+# Title:
+# Feature Classes Not Under Environmental Feature
+# Constraint Description:
+# Finds classes whose labels indicate geospatial or environmental features but which are not subclasses of Environmental Feature.
+# Severity:
+# Error
+
+PREFIX cco:
+PREFIX owl:
+PREFIX rdfs:
+
+SELECT DISTINCT ?class ?label WHERE {
+ ?class a owl:Class ;
+ rdfs:label ?label .
+
+ FILTER(STRSTARTS(STR(?class), STR(cco:)))
+ FILTER(?class != cco:ont00000574) # Environmental Feature
+
+ FILTER(REGEX(STR(?label), "Feature$", "i"))
+
+ FILTER NOT EXISTS {
+ ?class rdfs:subClassOf+ cco:ont00000574 .
+ }
+}
+ORDER BY ?label
\ No newline at end of file
diff --git a/.github/deployment/sparql/is-curated-in-iri.sparql b/.github/deployment/sparql/is-curated-in-iri.sparql
new file mode 100644
index 00000000..3d20496a
--- /dev/null
+++ b/.github/deployment/sparql/is-curated-in-iri.sparql
@@ -0,0 +1,37 @@
+# Title:
+# is curated in ontology Cardinality or Value Problem
+# Constraint Description:
+# Every class, property, and individual shall have exactly one is curated in ontology statement, and its value shall be an ontology IRI.
+# Severity:
+# Error
+
+PREFIX cco:
+PREFIX owl:
+
+SELECT ?entity ?type (COUNT(?curatedIn) AS ?curatedInCount) ?problem WHERE {
+ VALUES ?type {
+ owl:Class
+ owl:ObjectProperty
+ owl:DatatypeProperty
+ owl:AnnotationProperty
+ owl:NamedIndividual
+ }
+
+ ?entity a ?type .
+
+ FILTER(STRSTARTS(STR(?entity), STR(cco:)))
+
+ OPTIONAL {
+ ?entity cco:ont00001760 ?curatedIn .
+ }
+
+ BIND(
+ IF(COUNT(?curatedIn) != 1,
+ "resource does not have exactly one is curated in ontology statement",
+ "ok")
+ AS ?problem
+ )
+}
+GROUP BY ?entity ?type
+HAVING(COUNT(?curatedIn) != 1)
+ORDER BY ?entity
\ No newline at end of file
diff --git a/.github/deployment/sparql/language-tag-and-period.sparql b/.github/deployment/sparql/language-tag-and-period.sparql
new file mode 100644
index 00000000..fc017ecf
--- /dev/null
+++ b/.github/deployment/sparql/language-tag-and-period.sparql
@@ -0,0 +1,35 @@
+# Title:
+# Definition Formatting Problems
+# Constraint Description:
+# Every definition shall have an English language tag, be set as a complete sentence, and terminate in a period. This query checks language tag and final punctuation.
+# Severity:
+# Warning
+
+PREFIX cco:
+PREFIX owl:
+PREFIX skos:
+
+SELECT DISTINCT ?entity ?definition ?problem WHERE {
+ VALUES ?type {
+ owl:Class
+ owl:ObjectProperty
+ owl:DatatypeProperty
+ owl:AnnotationProperty
+ }
+
+ ?entity a ?type ;
+ skos:definition ?definition .
+
+ FILTER(STRSTARTS(STR(?entity), STR(cco:)))
+
+ {
+ FILTER(!LANGMATCHES(LANG(?definition), "en"))
+ BIND("definition does not have an English language tag" AS ?problem)
+ }
+ UNION
+ {
+ FILTER(!REGEX(STR(?definition), "\\.$"))
+ BIND("definition does not terminate in a period" AS ?problem)
+ }
+}
+ORDER BY ?entity ?problem
\ No newline at end of file
diff --git a/.github/deployment/sparql/media-not-under-media-content.sparql b/.github/deployment/sparql/media-not-under-media-content.sparql
new file mode 100644
index 00000000..03deecff
--- /dev/null
+++ b/.github/deployment/sparql/media-not-under-media-content.sparql
@@ -0,0 +1,25 @@
+# Title:
+# Media Content Classes Not Under Media Content Entity
+# Constraint Description:
+# Finds classes whose labels indicate media, documents, messages, images, videos, reports, spreadsheets, or similar content but which are not subclasses of Media Content Entity.
+# Severity:
+# Error
+
+PREFIX cco:
+PREFIX owl:
+PREFIX rdfs:
+
+SELECT DISTINCT ?class ?label WHERE {
+ ?class a owl:Class ;
+ rdfs:label ?label .
+
+ FILTER(STRSTARTS(STR(?class), STR(cco:)))
+ FILTER(?class != cco:ont00002001) # Media Content Entity
+
+ FILTER(REGEX(STR(?label), "Document|Message|Image|Video|Book|Spreadsheet|Report|Transcript|Certificate|Chart|Database|List", "i"))
+
+ FILTER NOT EXISTS {
+ ?class rdfs:subClassOf+ cco:ont00002001 .
+ }
+}
+ORDER BY ?label
\ No newline at end of file
diff --git a/.github/deployment/sparql/missing-version-iri.sparql b/.github/deployment/sparql/missing-version-iri.sparql
new file mode 100644
index 00000000..bc486530
--- /dev/null
+++ b/.github/deployment/sparql/missing-version-iri.sparql
@@ -0,0 +1,17 @@
+# Title:
+# Ontology Missing Version IRI
+# Constraint Description:
+# Every ontology in CCO shall have a version IRI.
+# Severity:
+# Error
+
+PREFIX owl:
+
+SELECT DISTINCT ?ontology WHERE {
+ ?ontology a owl:Ontology .
+
+ FILTER NOT EXISTS {
+ ?ontology owl:versionIRI ?versionIRI .
+ }
+}
+ORDER BY ?ontology
\ No newline at end of file
diff --git a/.github/deployment/sparql/no_multiple_parents.sparql b/.github/deployment/sparql/no_multiple_parents.sparql
new file mode 100644
index 00000000..918c0501
--- /dev/null
+++ b/.github/deployment/sparql/no_multiple_parents.sparql
@@ -0,0 +1,43 @@
+# Title:
+# No multiple inheritance
+# Constraint Description:
+# Classes have at most one immediate asserted parent.
+# Severity:
+# Error
+
+PREFIX rdf:
+PREFIX rdfs:
+PREFIX owl:
+
+SELECT ?class ?label
+ (COUNT(DISTINCT ?parent) AS ?parentCount)
+ (GROUP_CONCAT(DISTINCT STR(?parentLabel); separator=" | ") AS ?parentLabels)
+ ?warningMessage
+WHERE {
+ ?class a owl:Class ;
+ rdfs:label ?label ;
+ rdfs:subClassOf ?parent .
+
+ FILTER (!ISBLANK(?class)) .
+ FILTER (!ISBLANK(?parent)) .
+ FILTER (?parent != owl:Thing) .
+ FILTER (?parent != owl:Nothing) .
+ FILTER (?parent != ?class) .
+
+ ?parent a owl:Class .
+
+ OPTIONAL {
+ ?parent rdfs:label ?parentLabel .
+ }
+
+ BIND (
+ CONCAT(
+ "Warning: Class ",
+ STR(?label),
+ " has too many direct asserted superclass parents."
+ )
+ AS ?warningMessage
+ )
+}
+GROUP BY ?class ?label ?warningMessage
+HAVING (COUNT(DISTINCT ?parent) > 2)
\ No newline at end of file
diff --git a/.github/deployment/sparql/no_parenthetical_labels.sparql b/.github/deployment/sparql/no_parenthetical_labels.sparql
new file mode 100644
index 00000000..a6211634
--- /dev/null
+++ b/.github/deployment/sparql/no_parenthetical_labels.sparql
@@ -0,0 +1,28 @@
+# Title:
+# No Parenthetical Labels
+# Constraint Description:
+# No label shall include a parenthetical, such as "tank (vehicle)"
+# Severity:
+# Error
+
+PREFIX rdf:
+PREFIX rdfs:
+PREFIX owl:
+
+SELECT ?class ?label ?warningMessage
+WHERE {
+ ?class a owl:Class ;
+ rdfs:label ?label .
+
+ FILTER (!ISBLANK(?class)) .
+ FILTER (REGEX(STR(?label), "\\([^\\)]*\\)")) .
+
+ BIND (
+ CONCAT(
+ "Warning: Class ",
+ STR(?label),
+ " has a parenthetical qualifier in its label."
+ )
+ AS ?warningMessage
+ )
+}
\ No newline at end of file
diff --git a/.github/deployment/sparql/no_reflexive_subclassOf.sparql b/.github/deployment/sparql/no_reflexive_subclassOf.sparql
new file mode 100644
index 00000000..a18aac6e
--- /dev/null
+++ b/.github/deployment/sparql/no_reflexive_subclassOf.sparql
@@ -0,0 +1,31 @@
+# Title:
+# No Reflexive SubclassOf
+# Constraint Description:
+# No class should be asserted as a subclass of itself.
+# Severity:
+# Error
+
+PREFIX rdfs:
+PREFIX owl:
+
+SELECT ?class ?warningMessage
+WHERE {
+ ?class a owl:Class .
+
+ FILTER (!ISBLANK(?class)) .
+
+ ?class rdfs:subClassOf ?class .
+
+ OPTIONAL {
+ ?class rdfs:label ?label .
+ }
+
+ BIND(
+ CONCAT(
+ "Warning: Class ",
+ COALESCE(STR(?label), STR(?class)),
+ " is explicitly asserted as a subclass of itself"
+ )
+ AS ?warningMessage
+ )
+}
\ No newline at end of file
diff --git a/.github/deployment/sparql/owl_classes_not_rdf_classes.sparql b/.github/deployment/sparql/owl_classes_not_rdf_classes.sparql
new file mode 100644
index 00000000..3557596a
--- /dev/null
+++ b/.github/deployment/sparql/owl_classes_not_rdf_classes.sparql
@@ -0,0 +1,30 @@
+# Title:
+# No rdfs:Class only owl:Class
+# Constraint Description:
+# Classes must be declared using owl:Class rather than rdfs:Class
+# Severity:
+# Error
+
+PREFIX rdf:
+PREFIX rdfs:
+PREFIX owl:
+
+SELECT ?class ?label ?warningMessage
+WHERE {
+ ?class a rdfs:Class .
+
+ FILTER (!ISBLANK(?class)) .
+
+ OPTIONAL {
+ ?class rdfs:label ?label .
+ }
+
+ BIND (
+ CONCAT(
+ "Warning: Entity ",
+ COALESCE(STR(?label), STR(?class)),
+ " is declared as rdfs:Class. Use owl:Class instead."
+ )
+ AS ?warningMessage
+ )
+}
\ No newline at end of file
diff --git a/.github/deployment/sparql/required-metadata.sparql b/.github/deployment/sparql/required-metadata.sparql
new file mode 100644
index 00000000..b3ce2a0b
--- /dev/null
+++ b/.github/deployment/sparql/required-metadata.sparql
@@ -0,0 +1,27 @@
+# Title:
+# Ontology Metadata Cardinality Violation
+# Constraint Description:
+# Every ontology shall have exactly one license, rights statement, version info statement, and description.
+# Severity:
+# Error
+
+PREFIX owl:
+PREFIX dcterms:
+
+SELECT ?ontology ?property (COUNT(?value) AS ?valueCount) WHERE {
+ ?ontology a owl:Ontology .
+
+ VALUES ?property {
+ dcterms:license
+ dcterms:rights
+ owl:versionInfo
+ dcterms:description
+ }
+
+ OPTIONAL {
+ ?ontology ?property ?value .
+ }
+}
+GROUP BY ?ontology ?property
+HAVING(COUNT(?value) != 1)
+ORDER BY ?ontology ?property
\ No newline at end of file
diff --git a/.github/deployment/sparql/temporal-relations-missing-domain-range.sparql b/.github/deployment/sparql/temporal-relations-missing-domain-range.sparql
new file mode 100644
index 00000000..d9e2976a
--- /dev/null
+++ b/.github/deployment/sparql/temporal-relations-missing-domain-range.sparql
@@ -0,0 +1,29 @@
+# Title:
+# Temporal Relations Missing Domain or Range
+# Constraint Description:
+# Finds Time Ontology object properties whose labels indicate temporal relations but which lack an asserted domain or range.
+# Severity:
+# Warning
+
+PREFIX cco:
+PREFIX owl:
+PREFIX rdfs:
+
+SELECT DISTINCT ?property ?label ?missing WHERE {
+ ?property a owl:ObjectProperty ;
+ rdfs:label ?label .
+
+ FILTER(STRSTARTS(STR(?property), STR(cco:)))
+ FILTER(REGEX(STR(?label), "interval|instant|inside", "i"))
+
+ {
+ FILTER NOT EXISTS { ?property rdfs:domain ?domain }
+ BIND("missing domain" AS ?missing)
+ }
+ UNION
+ {
+ FILTER NOT EXISTS { ?property rdfs:range ?range }
+ BIND("missing range" AS ?missing)
+ }
+}
+ORDER BY ?label ?missing
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 1dab3fd2..63ad12d2 100644
--- a/Makefile
+++ b/Makefile
@@ -1,10 +1,15 @@
# Common Core Ontology Pipeline
# Adapted from previous works; see header comments for full attribution.
# Contact - John Beverley
+#
+# Key QC principle:
+# ROBOT must first merge the import closure using the XML catalog, then reason,
+# then verify/query against the merged/reasoned ontology.
### Explanation ###
-# The workflow involves two major steps: first, individual ontology files are checked and tested.
-# After passing, they are merged into a single file, which is then checked and tested again.
+# The workflow involves two major steps:
+# 1. Individual ontology files are merged with their imports, reasoned over, and tested.
+# 2. The CCO modules are merged into a single file, reasoned over, and tested again.
# ----------------------------------------
# Project essentials
@@ -14,15 +19,22 @@ config.DEV_IRI := $(config.BASE_IRI)/dev
config.MODULES_IRI := $(config.DEV_IRI)/modules
# Local project directories
-config.SOURCE_DIR := src/
+config.SOURCE_DIR := src
config.TEMP_DIR := build/artifacts
config.RELEASE_DIR := /
config.REPORTS_DIR := $(config.TEMP_DIR)
config.QUERIES_DIR := .github/deployment/sparql
config.LIBRARY_DIR := build/lib
+# Catalogs
+# Use MODULES_CATALOG for normal module import resolution.
+# Keep MERGED_CATALOG for merged-release workflows if that catalog differs.
+MODULES_CATALOG := src/cco-modules/catalog-v001.xml
+MERGED_CATALOG := src/cco-merged/catalog-v001.xml
+CATALOG := $(MODULES_CATALOG)
+
# Settings
-config.FAIL_ON_TEST_FAILURES := false
+config.FAIL_ON_TEST_FAILURES := false
config.REPORT_FAIL_ON := none
# Branch-specific configurations
@@ -30,20 +42,27 @@ BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
# File names for dev branch
DEV_FILES = \
- src/cco-modules/AgentOntology.ttl \
- src/cco-modules/ArtifactOntology.ttl \
- src/cco-modules/CurrencyUnitOntology.ttl \
- src/cco-modules/EventOntology.ttl \
- src/cco-modules/ExtendedRelationOntology.ttl \
- src/cco-modules/FacilityOntology.ttl \
- src/cco-modules/GeospatialOntology.ttl \
- src/cco-modules/QualityOntology.ttl \
- src/cco-modules/UnitsOfMeasureOntology.ttl \
- src/cco-modules/TimeOntology.ttl \
- src/cco-modules/InformationEntityOntology.ttl
+ src/cco-modules/AgentOntology.ttl \
+ src/cco-modules/ArtifactOntology.ttl \
+ src/cco-modules/CurrencyUnitOntology.ttl \
+ src/cco-modules/EventOntology.ttl \
+ src/cco-modules/ExtendedRelationOntology.ttl \
+ src/cco-modules/FacilityOntology.ttl \
+ src/cco-modules/GeospatialOntology.ttl \
+ src/cco-modules/QualityOntology.ttl \
+ src/cco-modules/UnitsOfMeasureOntology.ttl \
+ src/cco-modules/TimeOntology.ttl \
+ src/cco-modules/InformationEntityOntology.ttl
+
+# Local BFO copy used for stand-alone merged files and BFO diffing
+BFO_LOCAL := src/cco-imports/bfo-core.ttl
+BFO_UPSTREAM_URL := http://purl.obolibrary.org/obo/bfo/2020/bfo-core.ttl
+BFO_UPSTREAM_TMP := $(config.TEMP_DIR)/bfo-upstream-latest.ttl
+BFO_DIFF_OUT := $(config.TEMP_DIR)/bfo-upstream-diff.txt
# File for combined ontology
combined-file := $(config.SOURCE_DIR)/MergedAllCoreOntology.ttl
+combined-reasoned-file := $(config.TEMP_DIR)/MergedAllCoreOntology-reasoned.ttl
# Other constants
TODAY := $(shell date +%Y-%m-%d)
@@ -53,13 +72,18 @@ TIMESTAMP := $(shell date +'%Y-%m-%d %H:%M')
config.RELEASE_NAME := $(config.ONTOLOGY_PREFIX) $(TIMESTAMP)
# Generic files
-EDITOR_BUILD_FILE = $(combined-file) # "editors ontology module"
-
+EDITOR_BUILD_FILE = $(combined-reasoned-file) # "editors ontology module"
EDITOR_REPORT_FILE = $(config.REPORTS_DIR)/$(config.ONTOLOGY_PREFIX)-edit-report.tsv
# Generic directories to create if needed
REQUIRED_DIRS = $(config.LIBRARY_DIR) $(config.SOURCE_DIR) $(config.QUERIES_DIR) $(config.REPORTS_DIR)
+# Test queries
+QUERIES = $(wildcard $(config.QUERIES_DIR)/*.sparql)
+
+# ROBOT
+ROBOT_FILE := $(config.LIBRARY_DIR)/robot.jar
+
# ----------------------------------------
#### Targets / main "goals" of this Makefile
.PHONY: all
@@ -70,57 +94,136 @@ all: setup reason-individual test-individual build-combined reason-combined test
setup:
mkdir -p $(REQUIRED_DIRS) src/ .github/deployment/sparql build/artifacts
-# Targets for dev branch - QC individual files and the combined file
-
# Download ROBOT JAR
-ROBOT_FILE := $(config.LIBRARY_DIR)/robot.jar
$(ROBOT_FILE): | $(config.LIBRARY_DIR)
curl -L -o $@ https://github.com/ontodev/robot/releases/download/v1.8.4/robot.jar
chmod +x $@
-# Reason individual files
+# ----------------------------------------
+# Individual module QC
+#
+# Each individual module is first merged with its import closure using the
+# catalog, then reasoned, then verified. This prevents false orphan-class
+# results caused by ROBOT querying only the asserted triples in a partial module.
+
.PHONY: reason-individual
-reason-individual: $(ROBOT_FILE)
+reason-individual: $(ROBOT_FILE) | $(config.TEMP_DIR)
for file in $(DEV_FILES); do \
- echo "Reasoning on $$file..."; \
- java -jar $(ROBOT_FILE) reason --input $$file --catalog src/cco-modules/catalog-v001.xml --reasoner HermiT; \
+ name=$$(basename "$$file" .ttl); \
+ echo "Merging and reasoning on $$file..."; \
+ java -jar $(ROBOT_FILE) merge \
+ --catalog $(CATALOG) \
+ --input "$$file" \
+ --collapse-import-closure true \
+ reason \
+ --reasoner HermiT \
+ --output "$(config.TEMP_DIR)/$$name-reasoned.ttl"; \
done
-# Validate OWL DL profile on individual files (Step 6b)
.PHONY: validate-profile-individual
validate-profile-individual: $(ROBOT_FILE)
for file in $(DEV_FILES); do \
- echo "Validating OWL DL profile for $$file..."; \
- java -jar $(ROBOT_FILE) validate-profile --profile DL --input $$file; \
+ echo "Validating OWL DL profile for $$file with imports merged..."; \
+ java -jar $(ROBOT_FILE) merge \
+ --catalog $(CATALOG) \
+ --input "$$file" \
+ --collapse-import-closure true \
+ validate-profile \
+ --profile DL; \
done
-# Validate OWL DL profile on combined file (Step 6b)
-.PHONY: validate-profile-combined
-validate-profile-combined: $(combined-file) | $(ROBOT_FILE)
- java -jar $(ROBOT_FILE) validate-profile --profile DL --input $(combined-file)
-
-# Test individual files
.PHONY: test-individual
-test-individual: $(ROBOT_FILE)
+test-individual: $(ROBOT_FILE) | $(config.REPORTS_DIR)
+ifeq ($(QUERIES),)
+ $(warning No query files found in $(config.QUERIES_DIR))
+else
for file in $(DEV_FILES); do \
- echo "Testing $$file..."; \
- java -jar $(ROBOT_FILE) verify --input $$file --output-dir $(config.REPORTS_DIR) --queries $(QUERIES) --fail-on-violation false || true; \
+ name=$$(basename "$$file" .ttl); \
+ echo "Testing $$file with imports merged and inferred hierarchy materialized..."; \
+ java -jar $(ROBOT_FILE) merge \
+ --catalog $(CATALOG) \
+ --input "$$file" \
+ --collapse-import-closure true \
+ reason \
+ --reasoner HermiT \
+ verify \
+ --output-dir "$(config.REPORTS_DIR)/$$name" \
+ --queries $(QUERIES) \
+ --fail-on-violation false || true; \
done
+endif
-# Build combined file after individual files pass checks
-$(combined-file): $(DEV_FILES)
- cat $(DEV_FILES) > $@
+# ----------------------------------------
+# Combined ontology build and QC
+#
+# IMPORTANT:
+# This replaces the old `cat $(DEV_FILES) > $@` behavior.
+# Concatenating TTL files does not create a meaningful import-closed ontology
+# for ROBOT QC. Use ROBOT merge instead.
+
+$(combined-file): $(DEV_FILES) $(BFO_LOCAL) $(ROBOT_FILE) | $(config.TEMP_DIR)
+ java -jar $(ROBOT_FILE) merge \
+ --catalog $(CATALOG) \
+ $(foreach f,$(DEV_FILES),--input $(f)) \
+ --input $(BFO_LOCAL) \
+ --collapse-import-closure true \
+ --output $@
-# Build and QC combined file
.PHONY: build-combined
build-combined: $(combined-file)
-.PHONY: reason-combined test-combined
-reason-combined: $(combined-file) | $(ROBOT_FILE)
- java -jar $(ROBOT_FILE) reason --input $(combined-file) --catalog src/cco-modules/catalog-v001.xml --reasoner HermiT
+.PHONY: reason-combined
+reason-combined: $(combined-reasoned-file)
-test-combined: $(combined-file) | $(ROBOT_FILE)
- java -jar $(ROBOT_FILE) verify --input $(combined-file) --catalog src/cco-modules/catalog-v001.xml --output-dir $(config.REPORTS_DIR) --queries $(QUERIES) --fail-on-violation false || true
+$(combined-reasoned-file): $(combined-file) $(ROBOT_FILE) | $(config.TEMP_DIR)
+ java -jar $(ROBOT_FILE) reason \
+ --input $(combined-file) \
+ --catalog $(CATALOG) \
+ --reasoner HermiT \
+ --output $@
+
+.PHONY: validate-profile-combined
+validate-profile-combined: $(combined-file) | $(ROBOT_FILE)
+ java -jar $(ROBOT_FILE) validate-profile \
+ --profile DL \
+ --input $(combined-file) \
+ --catalog $(CATALOG)
+
+.PHONY: test-combined
+test-combined: $(combined-reasoned-file) | $(ROBOT_FILE) $(config.REPORTS_DIR)
+ifeq ($(QUERIES),)
+ $(warning No query files found in $(config.QUERIES_DIR))
+else
+ java -jar $(ROBOT_FILE) verify \
+ --input $(combined-reasoned-file) \
+ --catalog $(CATALOG) \
+ --output-dir $(config.REPORTS_DIR) \
+ --queries $(QUERIES) \
+ --fail-on-violation false || true
+endif
+
+# ----------------------------------------
+# Convenience query target
+#
+# Usage:
+# make query-combined QUERY=.github/deployment/sparql/orphan-query.sparql OUT=build/artifacts/orphans.tsv
+
+QUERY ?=
+OUT ?= $(config.TEMP_DIR)/query-results.tsv
+
+.PHONY: query-combined
+query-combined: $(combined-reasoned-file) | $(ROBOT_FILE) $(config.TEMP_DIR)
+ @if [ -z '$(QUERY)' ]; then \
+ echo 'ERROR: QUERY is required. Usage: make query-combined QUERY=path/to/query.sparql [OUT=path/to/results.tsv]'; \
+ exit 1; \
+ fi
+ java -jar $(ROBOT_FILE) query \
+ --input $(combined-reasoned-file) \
+ --query $(QUERY) \
+ $(OUT)
+
+# ----------------------------------------
+# Reports
.PHONY: report-edit
report-edit: TEST_INPUT = $(EDITOR_BUILD_FILE)
@@ -137,33 +240,49 @@ output-release-name:
# ----------------------------------------
#### Test / test ontology with reasoners and queries
-QUERIES = $(wildcard $(config.QUERIES_DIR)/*.sparql)
-# Check for inconsistency
+# Check for inconsistency.
+# Optional usage:
+# make reason TEST_INPUT=path/to/file.ttl
.PHONY: reason
reason: $(TEST_INPUT) | $(ROBOT_FILE)
- java -jar $(ROBOT_FILE) reason --input $(TEST_INPUT) --reasoner HermiT
-
-# Test using specific queries
+ java -jar $(ROBOT_FILE) reason \
+ --input $(TEST_INPUT) \
+ --catalog $(CATALOG) \
+ --reasoner HermiT
+
+# Test using specific queries.
+# Optional usage:
+# make verify TEST_INPUT=path/to/file.ttl
.PHONY: verify
verify: $(TEST_INPUT) $(QUERIES) | $(config.QUERIES_DIR) $(config.REPORTS_DIR) $(ROBOT_FILE)
ifeq ($(QUERIES),)
$(warning No query files found in $(config.QUERIES_DIR))
else
- java -jar $(ROBOT_FILE) verify --input $(TEST_INPUT) --output-dir $(config.REPORTS_DIR) --queries $(QUERIES) --fail-on-violation false || true
+ java -jar $(ROBOT_FILE) verify \
+ --input $(TEST_INPUT) \
+ --catalog $(CATALOG) \
+ --output-dir $(config.REPORTS_DIR) \
+ --queries $(QUERIES) \
+ --fail-on-violation false || true
endif
-# Report using built-in ROBOT queries
+# Report using built-in ROBOT queries.
+# Optional usage:
+# make report TEST_INPUT=path/to/file.ttl REPORT_FILE_INPUT=build/artifacts/report.tsv
.PHONY: report
report: $(TEST_INPUT) | $(config.REPORTS_DIR) $(ROBOT_FILE)
- java -jar $(ROBOT_FILE) report --input $(TEST_INPUT) \
- --labels true \
- --fail-on $(config.REPORT_FAIL_ON) \
- --print 10 \
- --output $(REPORT_FILE_INPUT)
+ java -jar $(ROBOT_FILE) report \
+ --input $(TEST_INPUT) \
+ --catalog $(CATALOG) \
+ --labels true \
+ --fail-on $(config.REPORT_FAIL_ON) \
+ --print 10 \
+ --output $(REPORT_FILE_INPUT)
# ----------------------------------------
#### Setup / configure Make to use with our project
+
MAKEFLAGS += --warn-undefined-variables
SHELL := bash
.SHELLFLAGS := -eu -o pipefail -c
@@ -176,17 +295,15 @@ SHELL := bash
$(REQUIRED_DIRS):
mkdir -p $@
-# Cleanup - Remove build and release files
+# Cleanup - Remove build and generated merged files
.PHONY: clean
clean:
- @[ "${config.REPORTS_DIR}" ] || ( echo ">> config.REPORTS_DIR is not set"; exit 1 )
+ @[ "$(config.REPORTS_DIR)" ] || ( echo ">> config.REPORTS_DIR is not set"; exit 1 )
rm -rf $(config.REPORTS_DIR)
- rm -rf $(combined-file)
+ rm -f $(combined-file)
-BFO_LOCAL := src/cco-imports/bfo-core.ttl
-BFO_UPSTREAM_URL := http://purl.obolibrary.org/obo/bfo/2020/bfo-core.ttl
-BFO_UPSTREAM_TMP := $(config.TEMP_DIR)/bfo-upstream-latest.ttl
-BFO_DIFF_OUT := $(config.TEMP_DIR)/bfo-upstream-diff.txt
+# ----------------------------------------
+# BFO upstream diff
.PHONY: bfo-diff
bfo-diff: | $(config.TEMP_DIR)
@@ -246,6 +363,7 @@ stamp-version:
# ---------------------------------------------------------------------------
# T12 — build-ccom: Rebuild CommonCoreOntologiesMerged.ttl via ROBOT merge
# ---------------------------------------------------------------------------
+
CCOM_MERGED := src/cco-merged/CommonCoreOntologiesMerged.ttl
CCOM_IRI := https://www.commoncoreontologies.org/CommonCoreOntologiesMerged
CCOM_COMMENT := A stand-alone file containing the eleven mid-level Common Core Ontologies plus BFO. Provided for use-cases where one file representing a specific release of CCO and its imports is desirable.
@@ -262,7 +380,8 @@ build-ccom: $(ROBOT_FILE) | $(config.TEMP_DIR)
java -jar $(ROBOT_FILE) merge \
$(foreach f,$(DEV_FILES),--input $(f)) \
--input $(BFO_LOCAL) \
- --catalog src/cco-merged/catalog-v001.xml \
+ --catalog $(MERGED_CATALOG) \
+ --collapse-import-closure true \
--output $(config.TEMP_DIR)/ccom-raw.ttl
@echo "Applying CCOM ontology header (IRI, version, metadata)..."
java -jar $(ROBOT_FILE) annotate \
@@ -274,6 +393,8 @@ build-ccom: $(ROBOT_FILE) | $(config.TEMP_DIR)
--language-annotation rdfs:comment "$(CCOM_COMMENT)" en \
--language-annotation http://purl.org/dc/terms/license "$(CCOM_LICENSE)" en \
--language-annotation http://purl.org/dc/terms/rights "$(CCOM_RIGHTS)" en \
+ --language-annotation http://purl.org/dc/terms/title "Common Core Ontologies Merged" en \
+ --language-annotation http://purl.org/dc/terms/description "$(CCOM_COMMENT)" en \
--language-annotation owl:versionInfo "Version $(VERSION)" en \
--language-annotation owl:versionInfo "Depends on http://purl.obolibrary.org/obo/bfo/2020/bfo-core.ttl, obtained $(DATE)." en \
--output $(CCOM_MERGED)
@@ -295,6 +416,7 @@ build-ccom: $(ROBOT_FILE) | $(config.TEMP_DIR)
# Requires: python3 with rdflib (pip install rdflib)
# Usage: make build-mro VERSION=2.1 [DATE=YYYY-MM-DD]
# ---------------------------------------------------------------------------
+
MRO_OUT := src/cco-extensions/ModalRelationOntology.ttl
.PHONY: build-mro
@@ -309,7 +431,8 @@ build-mro: $(ROBOT_FILE) | $(config.TEMP_DIR)
--input $(BFO_LOCAL) \
--input src/cco-extensions/FamilialRelationsOntology.ttl \
--input src/cco-extensions/ModalRelationOntologyAdditions.ttl \
- --catalog src/cco-modules/catalog-v001.xml \
+ --catalog $(CATALOG) \
+ --collapse-import-closure true \
--output $(config.TEMP_DIR)/mro-merged.ttl
@echo "=== MRO Step 2: Extracting ObjectProperties + DatatypeProperties with all annotations ==="
python3 scripts/mro_extract.py \
@@ -333,4 +456,4 @@ build-mro: $(ROBOT_FILE) | $(config.TEMP_DIR)
--date $(DATE)
@echo "=== MRO Step 6: Copying to $(MRO_OUT) ==="
cp $(config.TEMP_DIR)/mro-final.ttl $(MRO_OUT)
- @echo "build-mro complete: $(MRO_OUT)"
+ @echo "build-mro complete: $(MRO_OUT)"
\ No newline at end of file
diff --git a/README.md b/README.md
index c4af0fd4..18562bf6 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,13 @@
-# The Common Core Ontologies (CCO)
+## RECENT NEWS
+The modernization of repository artifacts, issues, and documentation is underway:
+* Initial cleanup is expected to be completed by **June 30, 2026**.
+* The first wave of major structural changes (3.0) is expected to be released by **December 31, 2026** and will incorporate GeoSPARQL, QUDT, and the refactoring of information.
+* The second wave of major structural changes (4.0) is expected to be released **June 30, 2027**.
-[](https://github.com/CommonCoreOntology/CommonCoreOntologies/actions/workflows/manage_release.yml)
-[](https://github.com/CommonCoreOntology/CommonCoreOntologies?tab=BSD-3-Clause-1-ov-file)
-[](https://github.com/CommonCoreOntology/CommonCoreOntologies/releases/tag/v2.0-2024-11-06)
+It is the recommendation of the CCO Governance Board that users wait to update following 4.0 release. In the meantime, users who would like to use versions of CCO with the up-to-date changes, are directed to pull from the 'develop' branch. For a high-level overview of planned updates, see the milestones displayed below. See here for an accompanying [slide deck](https://github.com/CommonCoreOntology/CommonCoreOntologies/blob/develop/documentation/user-guides/Beverley%20-%20P%26G%20CCO%20Modernization%20Brief.pptx).
+
+
-***IMPORTANT NOTE***
-Starting with version 2.0, CCO IRIs are using a new namespace and have opaque local identifiers for all ontology elements.
-See [here](https://github.com/CommonCoreOntology/CommonCoreOntologies/tree/develop/documentation/mapping-new-iris) for the mapping file.
## What is CCO?
diff --git a/documentation/briefs/NSOF CCO Modernization Brief.pdf b/documentation/briefs/NSOF CCO Modernization Brief.pdf
new file mode 100644
index 00000000..02329e30
Binary files /dev/null and b/documentation/briefs/NSOF CCO Modernization Brief.pdf differ
diff --git a/documentation/user-guides/Beverley - P&G CCO Modernization Brief.pptx b/documentation/user-guides/Beverley - P&G CCO Modernization Brief.pptx
new file mode 100644
index 00000000..1298316c
Binary files /dev/null and b/documentation/user-guides/Beverley - P&G CCO Modernization Brief.pptx differ
diff --git a/scripts/generate_cco_iris.log b/scripts/generate_cco_iris.log
new file mode 100644
index 00000000..147a49d4
--- /dev/null
+++ b/scripts/generate_cco_iris.log
@@ -0,0 +1,551 @@
+Using java: /opt/homebrew/opt/openjdk/bin/java
+Parsing src/cco-merged/CommonCoreOntologiesMerged.ttl for IRI list ...
+Found 1914 CCO IRIs. Generating with 8 parallel workers ...
+ 100/1914 done
+ 200/1914 done
+ 300/1914 done
+ 400/1914 done
+ 500/1914 done
+ 600/1914 done
+ 700/1914 done
+ 800/1914 done
+ 900/1914 done
+ 1000/1914 done
+ 1100/1914 done
+ 1200/1914 done
+ 1300/1914 done
+ 1400/1914 done
+ 1500/1914 done
+ 1600/1914 done
+ 1700/1914 done
+ 1800/1914 done
+ 1900/1914 done
+ 1914/1914 done
+
+============================================================
+SUMMARY
+============================================================
+ Total IRIs processed : 1914
+ New files : 33
+ Real content changes : 480
+ Unchanged : 1401 (incl. files where only the OWL API version tag differed, normalized away)
+ Errors : 0
+
+NEW FILES (33):
+ ont00002000
+ ont00002001
+ ont00002002
+ ont00002003
+ ont00002004
+ ont00002005
+ ont00002006
+ ont00002007
+ ont00002008
+ ont00002009
+ ont00002010
+ ont00002011
+ ont00002012
+ ont00002013
+ ont00002014
+ ont00002037
+ ont00002038
+ ont00002039
+ ont00002040
+ ont00002041
+ ont00002042
+ ont00002043
+ ont00002044
+ ont00002045
+ ont00002066
+ ont00002067
+ ont00002068
+ ont00002069
+ ont00002070
+ ont00002071
+ ont00002073
+ ont00002074
+ ont00002075
+
+FILES WITH REAL CONTENT CHANGES (480):
+ ont00000003
+ ont00000008
+ ont00000019
+ ont00000021
+ ont00000022
+ ont00000023
+ ont00000036
+ ont00000047
+ ont00000051
+ ont00000062
+ ont00000063
+ ont00000064
+ ont00000067
+ ont00000069
+ ont00000078
+ ont00000083
+ ont00000087
+ ont00000098
+ ont00000099
+ ont00000102
+ ont00000106
+ ont00000110
+ ont00000113
+ ont00000118
+ ont00000123
+ ont00000127
+ ont00000133
+ ont00000136
+ ont00000140
+ ont00000154
+ ont00000159
+ ont00000162
+ ont00000169
+ ont00000179
+ ont00000183
+ ont00000186
+ ont00000189
+ ont00000190
+ ont00000194
+ ont00000197
+ ont00000205
+ ont00000211
+ ont00000214
+ ont00000215
+ ont00000227
+ ont00000228
+ ont00000249
+ ont00000253
+ ont00000254
+ ont00000261
+ ont00000263
+ ont00000273
+ ont00000275
+ ont00000278
+ ont00000288
+ ont00000289
+ ont00000292
+ ont00000293
+ ont00000300
+ ont00000308
+ ont00000313
+ ont00000314
+ ont00000317
+ ont00000319
+ ont00000322
+ ont00000323
+ ont00000324
+ ont00000328
+ ont00000329
+ ont00000351
+ ont00000353
+ ont00000362
+ ont00000371
+ ont00000379
+ ont00000382
+ ont00000386
+ ont00000391
+ ont00000396
+ ont00000402
+ ont00000403
+ ont00000407
+ ont00000411
+ ont00000419
+ ont00000422
+ ont00000425
+ ont00000433
+ ont00000435
+ ont00000449
+ ont00000451
+ ont00000452
+ ont00000453
+ ont00000457
+ ont00000462
+ ont00000465
+ ont00000466
+ ont00000470
+ ont00000471
+ ont00000472
+ ont00000476
+ ont00000480
+ ont00000482
+ ont00000487
+ ont00000493
+ ont00000495
+ ont00000498
+ ont00000504
+ ont00000512
+ ont00000517
+ ont00000519
+ ont00000530
+ ont00000533
+ ont00000541
+ ont00000544
+ ont00000549
+ ont00000552
+ ont00000556
+ ont00000566
+ ont00000567
+ ont00000569
+ ont00000575
+ ont00000584
+ ont00000591
+ ont00000592
+ ont00000595
+ ont00000597
+ ont00000601
+ ont00000603
+ ont00000606
+ ont00000607
+ ont00000609
+ ont00000614
+ ont00000623
+ ont00000624
+ ont00000626
+ ont00000628
+ ont00000633
+ ont00000635
+ ont00000636
+ ont00000640
+ ont00000643
+ ont00000644
+ ont00000646
+ ont00000650
+ ont00000653
+ ont00000657
+ ont00000665
+ ont00000672
+ ont00000675
+ ont00000678
+ ont00000679
+ ont00000686
+ ont00000692
+ ont00000698
+ ont00000702
+ ont00000703
+ ont00000704
+ ont00000712
+ ont00000719
+ ont00000728
+ ont00000731
+ ont00000732
+ ont00000734
+ ont00000736
+ ont00000738
+ ont00000740
+ ont00000743
+ ont00000752
+ ont00000753
+ ont00000754
+ ont00000756
+ ont00000763
+ ont00000764
+ ont00000767
+ ont00000771
+ ont00000772
+ ont00000779
+ ont00000781
+ ont00000784
+ ont00000787
+ ont00000795
+ ont00000798
+ ont00000799
+ ont00000810
+ ont00000811
+ ont00000822
+ ont00000829
+ ont00000830
+ ont00000841
+ ont00000845
+ ont00000847
+ ont00000853
+ ont00000856
+ ont00000862
+ ont00000874
+ ont00000886
+ ont00000892
+ ont00000893
+ ont00000895
+ ont00000897
+ ont00000900
+ ont00000908
+ ont00000910
+ ont00000914
+ ont00000919
+ ont00000924
+ ont00000932
+ ont00000936
+ ont00000937
+ ont00000944
+ ont00000947
+ ont00000950
+ ont00000951
+ ont00000958
+ ont00000961
+ ont00000964
+ ont00000965
+ ont00000967
+ ont00000970
+ ont00000974
+ ont00000985
+ ont00000989
+ ont00000992
+ ont00000993
+ ont00000994
+ ont00000995
+ ont00000999
+ ont00001002
+ ont00001006
+ ont00001010
+ ont00001015
+ ont00001017
+ ont00001022
+ ont00001028
+ ont00001042
+ ont00001044
+ ont00001045
+ ont00001046
+ ont00001056
+ ont00001064
+ ont00001065
+ ont00001070
+ ont00001084
+ ont00001085
+ ont00001087
+ ont00001092
+ ont00001100
+ ont00001103
+ ont00001108
+ ont00001114
+ ont00001119
+ ont00001124
+ ont00001126
+ ont00001129
+ ont00001133
+ ont00001137
+ ont00001141
+ ont00001146
+ ont00001154
+ ont00001155
+ ont00001156
+ ont00001162
+ ont00001166
+ ont00001169
+ ont00001175
+ ont00001180
+ ont00001187
+ ont00001191
+ ont00001194
+ ont00001196
+ ont00001198
+ ont00001200
+ ont00001206
+ ont00001208
+ ont00001211
+ ont00001213
+ ont00001219
+ ont00001226
+ ont00001227
+ ont00001228
+ ont00001232
+ ont00001237
+ ont00001239
+ ont00001241
+ ont00001243
+ ont00001246
+ ont00001256
+ ont00001262
+ ont00001271
+ ont00001275
+ ont00001289
+ ont00001291
+ ont00001294
+ ont00001298
+ ont00001303
+ ont00001306
+ ont00001316
+ ont00001317
+ ont00001319
+ ont00001322
+ ont00001323
+ ont00001324
+ ont00001326
+ ont00001336
+ ont00001348
+ ont00001350
+ ont00001352
+ ont00001359
+ ont00001364
+ ont00001365
+ ont00001366
+ ont00001367
+ ont00001368
+ ont00001371
+ ont00001374
+ ont00001384
+ ont00001403
+ ont00001408
+ ont00001412
+ ont00001414
+ ont00001417
+ ont00001421
+ ont00001424
+ ont00001430
+ ont00001431
+ ont00001446
+ ont00001454
+ ont00001457
+ ont00001461
+ ont00001480
+ ont00001483
+ ont00001488
+ ont00001500
+ ont00001516
+ ont00001527
+ ont00001529
+ ont00001537
+ ont00001548
+ ont00001550
+ ont00001580
+ ont00001581
+ ont00001590
+ ont00001591
+ ont00001603
+ ont00001607
+ ont00001624
+ ont00001625
+ ont00001628
+ ont00001630
+ ont00001658
+ ont00001660
+ ont00001666
+ ont00001674
+ ont00001692
+ ont00001693
+ ont00001695
+ ont00001700
+ ont00001712
+ ont00001716
+ ont00001723
+ ont00001727
+ ont00001732
+ ont00001753
+ ont00001754
+ ont00001760
+ ont00001763
+ ont00001775
+ ont00001777
+ ont00001778
+ ont00001779
+ ont00001787
+ ont00001791
+ ont00001794
+ ont00001795
+ ont00001796
+ ont00001797
+ ont00001798
+ ont00001801
+ ont00001803
+ ont00001805
+ ont00001807
+ ont00001808
+ ont00001809
+ ont00001810
+ ont00001811
+ ont00001813
+ ont00001814
+ ont00001815
+ ont00001816
+ ont00001817
+ ont00001819
+ ont00001821
+ ont00001822
+ ont00001825
+ ont00001827
+ ont00001830
+ ont00001832
+ ont00001833
+ ont00001834
+ ont00001836
+ ont00001838
+ ont00001841
+ ont00001844
+ ont00001845
+ ont00001847
+ ont00001848
+ ont00001852
+ ont00001855
+ ont00001857
+ ont00001859
+ ont00001862
+ ont00001863
+ ont00001864
+ ont00001866
+ ont00001868
+ ont00001869
+ ont00001870
+ ont00001873
+ ont00001874
+ ont00001875
+ ont00001877
+ ont00001878
+ ont00001879
+ ont00001880
+ ont00001884
+ ont00001886
+ ont00001893
+ ont00001895
+ ont00001896
+ ont00001898
+ ont00001904
+ ont00001908
+ ont00001909
+ ont00001912
+ ont00001913
+ ont00001914
+ ont00001915
+ ont00001916
+ ont00001917
+ ont00001919
+ ont00001920
+ ont00001921
+ ont00001922
+ ont00001923
+ ont00001924
+ ont00001925
+ ont00001928
+ ont00001931
+ ont00001933
+ ont00001936
+ ont00001938
+ ont00001939
+ ont00001940
+ ont00001942
+ ont00001943
+ ont00001944
+ ont00001949
+ ont00001951
+ ont00001954
+ ont00001956
+ ont00001959
+ ont00001962
+ ont00001963
+ ont00001964
+ ont00001965
+ ont00001966
+ ont00001971
+ ont00001976
+ ont00001977
+ ont00001978
+ ont00001980
+ ont00001982
+ ont00001983
+ ont00001984
+ ont00001986
+ ont00001989
+ ont00001990
+ ont00001992
+ ont00001993
+ ont00001998
+ ont00001999
+
+Done. 1914 files written to src/cco-iris/
diff --git a/scripts/generate_cco_iris.py b/scripts/generate_cco_iris.py
new file mode 100644
index 00000000..e3a8a941
--- /dev/null
+++ b/scripts/generate_cco_iris.py
@@ -0,0 +1,224 @@
+#!/usr/bin/env python3
+"""
+generate_cco_iris.py — Regenerates per-IRI Turtle files for CCO IRI resolution.
+
+Cloudflare redirects requests for https://www.commoncoreontologies.org/ont0000XXXX
+to src/cco-iris/ont0000XXXX.ttl on the develop branch. This script regenerates
+all of those files from the current merged ontology using ROBOT (OWL API), so the
+output format is identical to the hand-generated originals.
+
+Each output file is produced by:
+ robot filter --input merged.ttl --term --select self --axioms all --trim false
+ annotate --ontology-iri .ttl --output .ttl
+
+Files are generated in parallel (default: 8 workers) to keep runtime under ~3 min.
+
+Usage:
+ python3 scripts/generate_cco_iris.py \\
+ --input src/cco-merged/CommonCoreOntologiesMerged.ttl \\
+ --output src/cco-iris \\
+ --robot-jar build/lib/robot.jar
+
+ # Tune parallelism (default 8):
+ python3 scripts/generate_cco_iris.py ... --workers 16
+"""
+
+import argparse
+import concurrent.futures
+import os
+import re
+import subprocess
+import sys
+
+from rdflib import Graph, URIRef
+
+IRI_PATTERN = re.compile(r"^https://www\.commoncoreontologies\.org/ont(\d{8})$")
+
+
+def is_cco_iri(uri: str) -> bool:
+ return bool(IRI_PATTERN.match(uri))
+
+
+# The original hand-generated IRI files were produced by OWL API 4.5.29; ROBOT
+# 1.8.4 emits a different version (4.5.6). We rewrite the generated tag to this
+# canonical version so a generator-version difference alone never registers as a
+# change — such files end up byte-identical to the originals (no churn, nothing
+# to report).
+OWLAPI_CANONICAL_VERSION = "4.5.29"
+_OWLAPI_VERSION_RE = re.compile(r"(Generated by the OWL API \(version )[\d.]+(\))")
+
+
+def _normalize_owlapi(text: str) -> str:
+ """Rewrite the OWL API version tag to OWLAPI_CANONICAL_VERSION."""
+ return _OWLAPI_VERSION_RE.sub(rf"\g<1>{OWLAPI_CANONICAL_VERSION}\g<2>", text)
+
+
+def run_robot(java_bin: str, robot_jar: str, merged_path: str, output_dir: str, iri: str) -> dict:
+ """Run ROBOT filter+annotate for one IRI and classify the output against its
+ prior on-disk state. Returns {local, status, klass, msg} where klass is one of
+ NEW / CHANGED / COMMENT_ONLY / UNCHANGED (None on error)."""
+ local = iri.split("/")[-1] # e.g. ont00000001
+ out_path = os.path.join(output_dir, f"{local}.ttl")
+ ont_iri = f"{iri}.ttl"
+
+ existed = os.path.isfile(out_path)
+ old_text = ""
+ if existed:
+ with open(out_path, encoding="utf-8") as fh:
+ old_text = fh.read()
+
+ cmd = [
+ java_bin, "-jar", robot_jar,
+ "filter",
+ "--input", merged_path,
+ "--term", iri,
+ "--select", "self",
+ "--axioms", "all",
+ "--trim", "false",
+ "annotate",
+ "--ontology-iri", ont_iri,
+ "--output", out_path,
+ ]
+
+ result = subprocess.run(cmd, capture_output=True, text=True)
+ if result.returncode != 0:
+ return {"local": local, "status": "ERROR", "klass": None,
+ "msg": result.stderr.strip()}
+
+ with open(out_path, encoding="utf-8") as fh:
+ new_text = fh.read()
+
+ # Suppress generator-version churn: normalize the OWL API tag so a file that
+ # differs only by that tag becomes identical to the committed original.
+ normalized = _normalize_owlapi(new_text)
+ if normalized != new_text:
+ with open(out_path, "w", encoding="utf-8") as fh:
+ fh.write(normalized)
+ new_text = normalized
+
+ if not existed:
+ klass = "NEW"
+ elif old_text == new_text:
+ klass = "UNCHANGED"
+ else:
+ klass = "CHANGED"
+
+ return {"local": local, "status": "OK", "klass": klass, "msg": ""}
+
+
+def find_java() -> str:
+ """Return a path to the java binary, preferring Homebrew OpenJDK on macOS."""
+ candidates = [
+ "/opt/homebrew/opt/openjdk/bin/java", # Apple-silicon Homebrew
+ "/usr/local/opt/openjdk/bin/java", # Intel Homebrew
+ "java", # already on PATH
+ ]
+ for c in candidates:
+ if os.path.isfile(c) or (c == "java"):
+ try:
+ r = subprocess.run([c, "-version"], capture_output=True)
+ if r.returncode == 0:
+ return c
+ except FileNotFoundError:
+ continue
+ print("ERROR: java not found. Install with: brew install openjdk", file=sys.stderr)
+ sys.exit(1)
+
+
+def generate(merged_path: str, output_dir: str, robot_jar: str, workers: int = 8,
+ limit: int = 0) -> None:
+ java_bin = find_java()
+ print(f"Using java: {java_bin}", flush=True)
+
+ print(f"Parsing {merged_path} for IRI list ...", flush=True)
+ src = Graph()
+ src.parse(merged_path, format="turtle")
+
+ cco_iris = sorted(
+ {str(s) for s in src.subjects() if isinstance(s, URIRef) and is_cco_iri(str(s))}
+ )
+ if limit > 0:
+ cco_iris = cco_iris[:limit]
+ print(f"Limiting to first {limit} IRIs (--limit flag).", flush=True)
+ print(f"Found {len(cco_iris)} CCO IRIs. Generating with {workers} parallel workers ...",
+ flush=True)
+
+ os.makedirs(output_dir, exist_ok=True)
+
+ counts = {"NEW": 0, "CHANGED": 0, "UNCHANGED": 0}
+ new_files: list[str] = []
+ changed_files: list[str] = []
+ errors: list[str] = []
+ with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as pool:
+ futures = {
+ pool.submit(run_robot, java_bin, robot_jar, merged_path, output_dir, iri): iri
+ for iri in cco_iris
+ }
+ for i, future in enumerate(concurrent.futures.as_completed(futures), 1):
+ r = future.result()
+ if r["status"] == "ERROR":
+ errors.append(f"ERROR {r['local']}: {r['msg']}")
+ else:
+ counts[r["klass"]] += 1
+ if r["klass"] == "NEW":
+ new_files.append(r["local"])
+ elif r["klass"] == "CHANGED":
+ changed_files.append(r["local"])
+ if i % 100 == 0 or i == len(cco_iris):
+ print(f" {i}/{len(cco_iris)} done", flush=True)
+
+ new_files.sort()
+ changed_files.sort()
+
+ print("\n" + "=" * 60, flush=True)
+ print("SUMMARY", flush=True)
+ print("=" * 60, flush=True)
+ print(f" Total IRIs processed : {len(cco_iris)}", flush=True)
+ print(f" New files : {counts['NEW']}", flush=True)
+ print(f" Real content changes : {counts['CHANGED']}", flush=True)
+ print(f" Unchanged : {counts['UNCHANGED']} "
+ f"(incl. files where only the OWL API version tag differed, normalized away)", flush=True)
+ print(f" Errors : {len(errors)}", flush=True)
+
+ print(f"\nNEW FILES ({len(new_files)}):", flush=True)
+ for name in new_files:
+ print(f" {name}", flush=True)
+
+ print(f"\nFILES WITH REAL CONTENT CHANGES ({len(changed_files)}):", flush=True)
+ for name in changed_files:
+ print(f" {name}", flush=True)
+
+ if errors:
+ print(f"\n{len(errors)} error(s):", file=sys.stderr)
+ for e in errors:
+ print(f" {e}", file=sys.stderr)
+ sys.exit(1)
+ print(f"\nDone. {len(cco_iris)} files written to {output_dir}/", flush=True)
+
+
+def main() -> None:
+ parser = argparse.ArgumentParser(
+ description="Generate per-IRI OWL API-format Turtle files for CCO IRI dereferencing."
+ )
+ parser.add_argument("--input", required=True, help="Path to CommonCoreOntologiesMerged.ttl")
+ parser.add_argument("--output", required=True, help="Directory to write per-IRI .ttl files")
+ parser.add_argument("--robot-jar", default="build/lib/robot.jar", help="Path to robot.jar")
+ parser.add_argument("--workers", type=int, default=8, help="Parallel worker count (default 8)")
+ parser.add_argument("--limit", type=int, default=0, help="Only process the first N IRIs (0 = all)")
+ args = parser.parse_args()
+
+ if not os.path.isfile(args.input):
+ print(f"ERROR: input not found: {args.input}", file=sys.stderr)
+ sys.exit(1)
+ if not os.path.isfile(args.robot_jar):
+ print(f"ERROR: robot.jar not found: {args.robot_jar}", file=sys.stderr)
+ print("Download with: make setup (or: curl -L -o build/lib/robot.jar "
+ "https://github.com/ontodev/robot/releases/download/v1.8.4/robot.jar)",
+ file=sys.stderr)
+ sys.exit(1)
+
+ generate(args.input, args.output, args.robot_jar, workers=args.workers, limit=args.limit)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/cco-extensions/ModalRelationOntology.ttl b/src/cco-extensions/ModalRelationOntology.ttl
index 5339f3bc..cd1163b9 100644
--- a/src/cco-extensions/ModalRelationOntology.ttl
+++ b/src/cco-extensions/ModalRelationOntology.ttl
@@ -1,3216 +1,2547 @@
-@prefix : .
@prefix cco: .
+@prefix dc: .
+@prefix dct: .
@prefix mro: .
@prefix obo: .
@prefix owl: .
@prefix rdf: .
-@prefix xml: .
-@prefix xsd: .
@prefix rdfs: .
-@base .
-
- rdf:type owl:Ontology ;
- owl:versionIRI ;
- "BSD 3-Clause: https://github.com/CommonCoreOntology/CommonCoreOntologies/blob/master/LICENSE"@en ;
- "CUBRC Inc., see full license."@en ;
- rdfs:comment "The modal counterparts to the object and data properties contained in CCO and BFO2020-core." ;
- rdfs:label "Modal Relation Ontology" ;
- owl:versionInfo "v2.0" .
-
-#################################################################
-# Annotation properties
-#################################################################
-
-### http://purl.org/dc/elements/1.1/identifier
- rdf:type owl:AnnotationProperty .
-
-
-### http://purl.org/dc/terms/created
- rdf:type owl:AnnotationProperty .
-
-
-### http://purl.org/dc/terms/creator
- rdf:type owl:AnnotationProperty .
-
-
-### http://purl.org/dc/terms/license
- rdf:type owl:AnnotationProperty .
-
-
-### http://purl.org/dc/terms/rights
- rdf:type owl:AnnotationProperty .
-
-
-### http://www.w3.org/2004/02/skos/core#altLabel
- rdf:type owl:AnnotationProperty .
-
-
-### http://www.w3.org/2004/02/skos/core#definition
- rdf:type owl:AnnotationProperty .
-
-
-### http://www.w3.org/2004/02/skos/core#editorialNote
- rdf:type owl:AnnotationProperty .
-
-
-### http://www.w3.org/2004/02/skos/core#example
- rdf:type owl:AnnotationProperty .
-
-
-### http://www.w3.org/2004/02/skos/core#prefLabel
- rdf:type owl:AnnotationProperty .
-
-
-### http://www.w3.org/2004/02/skos/core#scopeNote
- rdf:type owl:AnnotationProperty .
-
-
-### https://www.commoncoreontologies.org/ont00001754
-cco:ont00001754 rdf:type owl:AnnotationProperty .
-
-
-### https://www.commoncoreontologies.org/ont00001760
-cco:ont00001760 rdf:type owl:AnnotationProperty .
-
-
-#################################################################
-# Object Properties
-#################################################################
-
-### https://www.commoncoreontologies.org/mro/BFO_0000054
-mro:BFO_0000054 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000055 ;
- rdfs:domain obo:BFO_0000017 ;
- rdfs:range obo:BFO_0000015 ;
- "206-BFO" ;
- rdfs:label "has realization"@en ;
- "realized in"@en ;
- "b has realization c =Def c realizes b"@en ;
- "As for realizes"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000055
-mro:BFO_0000055 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain obo:BFO_0000015 ;
- rdfs:range obo:BFO_0000017 ;
- "059-BFO" ;
- rdfs:label "realizes"@en ;
- "(Elucidation) realizes is a relation between a process b and realizable entity c such that c inheres in some d & for all t, if b has participant d then c exists & the type instantiated by b is correlated with the type instantiated by c"@en ;
- "A balding process realizes a disposition to go bald; a studying process realizes a student role; a process of pumping blood realizes the pumping function of a heart"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000056
-mro:BFO_0000056 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000057 ;
- rdfs:domain [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000020
- obo:BFO_0000031
- [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ]
- )
- ] ;
- rdfs:range obo:BFO_0000015 ;
- "250-BFO" ;
- rdfs:label "participates in"@en ;
- "(Elucidation) participates in holds between some b that is either a specifically dependent continuant or generically dependent continuant or independent continuant that is not a spatial region & some process p such that b participates in p some way"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000057
-mro:BFO_0000057 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain obo:BFO_0000015 ;
- rdfs:range [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000020
- obo:BFO_0000031
- [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ]
- )
- ] ;
- "248-BFO" ;
- rdfs:label "has participant"@en ;
- "p has participant c =Def c participates in p"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000058
-mro:BFO_0000058 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000059 ;
- rdfs:domain obo:BFO_0000031 ;
- rdfs:range [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000015
- obo:BFO_0000020
- )
- ] ;
- "258-BFO" ;
- rdfs:label "is concretized by"@en ;
- "c is concretized by b =Def b concretizes c"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000059
-mro:BFO_0000059 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000015
- obo:BFO_0000020
- )
- ] ;
- rdfs:range obo:BFO_0000031 ;
- "256-BFO" ;
- rdfs:label "concretizes"@en ;
- "b concretizes c =Def b is a process or a specifically dependent continuant & c is a generically dependent continuant & there is some time t such that c is the pattern or content which b shares at t with actual or potential copies"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000062
-mro:BFO_0000062 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000063 ;
- rdf:type owl:TransitiveProperty ;
- rdfs:domain obo:BFO_0000003 ;
- rdfs:range obo:BFO_0000003 ;
- "213-BFO" ;
- rdfs:label "preceded by"@en ;
- "b preceded by c =Def b precedes c"@en ;
- "The temporal region occupied by the second half of the match is preceded by the temporal region occupied by the first half of the match"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000063
-mro:BFO_0000063 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdf:type owl:TransitiveProperty ;
- rdfs:domain obo:BFO_0000003 ;
- rdfs:range obo:BFO_0000003 ;
- "270-BFO" ;
- rdfs:label "precedes"@en ;
- "(Elucidation) precedes is a relation between occurrents o, o' such that if t is the temporal extent of o & t' is the temporal extent of o' then either the last instant of o is before the first instant of o' or the last instant of o is the first instant of o' & neither o nor o' are temporal instants"@en ;
- "The temporal region occupied by Mary's birth precedes the temporal region occupied by Mary's death."@en ;
- "Each temporal region is its own temporal extent. The temporal extent of a spatiotemporal region is the temporal region it temporally projects onto. The temporal extent of a process or process boundary that occupies temporal region t is t." ,
- "Precedes defines a strict partial order on occurrents." .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000066
-mro:BFO_0000066 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000183 ;
- rdfs:domain [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000015
- obo:BFO_0000035
- )
- ] ;
- rdfs:range [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000029
- obo:BFO_0000040
- )
- ] ;
- "143-BFO" ;
- rdfs:label "occurs in"@en ;
- "b occurs in c =Def b is a process or a process boundary & c is a material entity or site & there exists a spatiotemporal region r & b occupies spatiotemporal region r & for all time t, if b exists at t then c exists at t & there exist spatial regions s and s' where b spatially projects onto s at t & c occupies spatial region s' at t & s is a continuant part of s' at t"@en ;
- "A process of digestion occurs in the interior of an organism; a process of loading artillery rounds into a tank cannon occurs in the interior of the tank"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000084
-mro:BFO_0000084 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000101 ;
- rdfs:domain obo:BFO_0000031 ;
- rdfs:range [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- "252-BFO" ;
- rdfs:label "generically depends on"@en ;
- "g-depends on"@en ;
- "b generically depends on c =Def b is a generically dependent continuant & c is an independent continuant that is not a spatial region & at some time t there inheres in c a specifically dependent continuant which concretizes b at t"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000101
-mro:BFO_0000101 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- rdfs:range obo:BFO_0000031 ;
- "254-BFO" ;
- rdfs:label "is carrier of"@en ;
- "b is carrier of c =Def there is some time t such that c generically depends on b at t"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000108
-mro:BFO_0000108 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain obo:BFO_0000001 ;
- rdfs:range obo:BFO_0000008 ;
- "118-BFO" ;
- rdfs:label "exists at"@en ;
- "(Elucidation) exists at is a relation between a particular and some temporal region at which the particular exists"@en ;
- "First World War exists at 1914-1916; Mexico exists at January 1, 2000"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000115
-mro:BFO_0000115 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000178 ;
- owl:inverseOf mro:BFO_0000129 ;
- rdfs:domain obo:BFO_0000040 ;
- rdfs:range obo:BFO_0000040 ;
- "230-BFO" ;
- rdfs:label "has member part"@en ;
- "b has member part c =Def c member part of b"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000117
-mro:BFO_0000117 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000132 ;
- rdf:type owl:TransitiveProperty ;
- rdfs:domain obo:BFO_0000003 ;
- rdfs:range obo:BFO_0000003 ;
- "202-BFO" ;
- rdfs:label "has occurrent part"@en ;
- "b has occurrent part c =Def c occurrent part of b"@en ;
- "Mary's life has occurrent part Mary's 5th birthday"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000121
-mro:BFO_0000121 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000117 ;
- owl:inverseOf mro:BFO_0000139 ;
- rdf:type owl:TransitiveProperty ;
- rdfs:domain obo:BFO_0000003 ;
- rdfs:range obo:BFO_0000003 ;
- "211-BFO" ;
- rdfs:label "has temporal part"@en ;
- "b has temporal part c =Def c temporal part of b"@en ;
- "Your life has temporal part the first year of your life"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000124
-mro:BFO_0000124 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000171 ;
- rdfs:domain [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- rdfs:range [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- "236-BFO" ;
- rdfs:label "location of"@en ;
- "b location of c =Def c located in b"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000127
-mro:BFO_0000127 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000218 ;
- rdfs:domain obo:BFO_0000040 ;
- rdfs:range obo:BFO_0000016 ;
- "244-BFO" ;
- rdfs:label "material basis of"@en ;
- "b material basis of c =Def c has material basis b"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000129
-mro:BFO_0000129 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000176 ;
- rdfs:domain obo:BFO_0000040 ;
- rdfs:range obo:BFO_0000040 ;
- "228-BFO" ;
- rdfs:label "member part of"@en ;
- "b member part of c =Def b is an object & c is a material entity & there is some time t such that b continuant part of c at t & there is a mutually exhaustive and pairwise disjoint partition of c into objects x1, ..., xn (for some n ≠ 1) with b = xi (for some 1 <= i <= n)"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000132
-mro:BFO_0000132 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdf:type owl:TransitiveProperty ;
- rdfs:domain obo:BFO_0000003 ;
- rdfs:range obo:BFO_0000003 ;
- "003-BFO" ;
- rdfs:label "occurrent part of"@en ;
- "(Elucidation) occurrent part of is a relation between occurrents b and c when b is part of c"@en ;
- "Mary's 5th birthday is an occurrent part of Mary's life; the first set of the tennis match is an occurrent part of the tennis match"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000139
-mro:BFO_0000139 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000132 ;
- rdf:type owl:TransitiveProperty ;
- rdfs:domain obo:BFO_0000003 ;
- rdfs:range obo:BFO_0000003 ;
- "078-BFO" ;
- rdfs:label "temporal part of"@en ;
- "b temporal part of c =Def b occurrent part of c & (b and c are temporal regions) or (b and c are spatiotemporal regions & b temporally projects onto an occurrent part of the temporal region that c temporally projects onto) or (b and c are processes or process boundaries & b occupies a temporal region that is an occurrent part of the temporal region that c occupies)"@en ;
- "Your heart beating from 4pm to 5pm today is a temporal part of the process of your heart beating; the 4th year of your life is a temporal part of your life, as is the process boundary which separates the 3rd and 4th years of your life; the first quarter of a game of football is a temporal part of the whole game"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000153
-mro:BFO_0000153 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdf:type owl:FunctionalProperty ;
- rdfs:domain obo:BFO_0000011 ;
- rdfs:range obo:BFO_0000008 ;
- "080-BFO" ;
- rdfs:label "temporally projects onto"@en ;
- "(Elucidation) temporally projects onto is a relation between a spatiotemporal region s and some temporal region which is the temporal extent of s"@en ;
- "The world line of a particle temporally projects onto the temporal region extending from the beginning to the end of the existence of the particle"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000171
-mro:BFO_0000171 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- rdfs:range [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- "234-BFO" ;
- rdfs:label "located in"@en ;
- "b located in c =Def b is an independent continuant & c is an independent & neither is a spatial region & there is some time t such that the spatial region which b occupies at t is continuant part of the spatial region which c occupies at t"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000176
-mro:BFO_0000176 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000178 ;
- rdfs:domain obo:BFO_0000002 ;
- rdfs:range obo:BFO_0000002 ;
- "221-BFO" ;
- rdfs:label "continuant part of"@en ;
- "b continuant part of c =Def b and c are continuants & there is some time t such that b and c exist at t & b continuant part of c at t"@en ;
- "Milk teeth continuant part of human; surgically removed tumour continuant part of organism"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000178
-mro:BFO_0000178 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain obo:BFO_0000002 ;
- rdfs:range obo:BFO_0000002 ;
- "271-BFO" ;
- rdfs:label "has continuant part"@en ;
- "b has continuant part c =Def c continuant part of b"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000183
-mro:BFO_0000183 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000029
- obo:BFO_0000040
- )
- ] ;
- rdfs:range [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000015
- obo:BFO_0000035
- )
- ] ;
- "267-BFO" ;
- rdfs:label "environs"@en ;
- "contains process"@en ;
- "b environs c =Def c occurs in b"@en ;
- "Mouth environs process of mastication; city environs traffic"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000184
-mro:BFO_0000184 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000185 ;
- rdf:type owl:FunctionalProperty ,
- owl:InverseFunctionalProperty ;
- rdfs:domain obo:BFO_0000182 ;
- rdfs:range obo:BFO_0000040 ;
- "144-BFO" ;
- rdfs:label "history of"@en ;
- "(Elucidation) history of is a relation between history b and material entity c such that b is the unique history of c"@en ;
- "This life is the history of this organism"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000185
-mro:BFO_0000185 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain obo:BFO_0000040 ;
- rdfs:range obo:BFO_0000182 ;
- "145-BFO" ;
- rdfs:label "has history"@en ;
- "b has history c =Def c history of b"@en ;
- "This organism has history this life"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000194
-mro:BFO_0000194 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000195 ;
- rdfs:domain [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000020
- [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ]
- )
- ] ;
- rdfs:range obo:BFO_0000020 ;
- "260-BFO" ;
- rdfs:label "specifically depended on by"@en ;
- "s-depended on by"@en ;
- "b specifically depended on by c =Def c specifically depends on b"@en ;
- "Coloured object specifically depended on by colour"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000195
-mro:BFO_0000195 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain obo:BFO_0000020 ;
- rdfs:range [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000020
- [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ]
- )
- ] ;
- "012-BFO" ;
- rdfs:label "specifically depends on"@en ;
- "s-depends on"@en ;
- "(Elucidation) specifically depends on is a relation between a specifically dependent continuant b and specifically dependent continuant or independent continuant that is not a spatial region c such that b and c share no parts in common & b is of a nature such that at all times t it cannot exist unless c exists & b is not a boundary of c"@en ;
- "A shape specifically depends on the shaped object; hue, saturation and brightness of a colour sample specifically depends on each other"@en ;
- "The analogue of specifically depends on for occurrents is has participant."@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000196
-mro:BFO_0000196 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000194 ;
- owl:inverseOf mro:BFO_0000197 ;
- rdfs:domain [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- rdfs:range obo:BFO_0000020 ;
- "053-BFO" ;
- rdfs:label "bearer of"@en ;
- "b bearer of c =Def c inheres in b"@en ;
- "A patch of ink is the bearer of a colour quality; an organism is the bearer of a temperature quality"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000197
-mro:BFO_0000197 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000195 ;
- rdfs:domain obo:BFO_0000020 ;
- rdfs:range [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- "051-BFO" ;
- rdfs:label "inheres in"@en ;
- "b inheres in c =Def b is a specifically dependent continuant & c is an independent continuant that is not a spatial region & b specifically depends on c"@en ;
- "A shape inheres in a shaped object; a mass inheres in a material entity"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000199
-mro:BFO_0000199 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:ont00001874 ;
- rdf:type owl:FunctionalProperty ;
- rdfs:domain [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000015
- obo:BFO_0000035
- )
- ] ;
- rdfs:range obo:BFO_0000008 ;
- "132-BFO" ;
- rdfs:label "occupies temporal region"@en ;
- "p occupies temporal region t =Def p is a process or process boundary & the spatiotemporal region occupied by p temporally projects onto t"@en ;
- "The Second World War occupies the temporal region September 1, 1939 - September 2, 1945"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000200
-mro:BFO_0000200 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdf:type owl:FunctionalProperty ;
- rdfs:domain [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000015
- obo:BFO_0000035
- )
- ] ;
- rdfs:range obo:BFO_0000011 ;
- "082-BFO" ;
- rdfs:label "occupies spatiotemporal region"@en ;
- "(Elucidation) occupies spatiotemporal region is a relation between a process or process boundary p and the spatiotemporal region s which is its spatiotemporal extent"@en ;
- "A particle emitted by a nuclear reactor occupies the spatiotemporal region which is its trajectory"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000210
-mro:BFO_0000210 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- rdfs:range obo:BFO_0000006 ;
- "232-BFO" ;
- rdfs:label "occupies spatial region"@en ;
- "b occupies spatial region r =Def b is an independent continuant that is not a spatial region & r is a spatial region & there is some time t such that every continuant part of b occupies some continuant part of r at t and no continuant part of b occupies any spatial region that is not a continuant part of r at t"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000216
-mro:BFO_0000216 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain obo:BFO_0000011 ;
- rdfs:range obo:BFO_0000006 ;
- "246-BFO" ;
- rdfs:label "spatially projects onto"@en ;
- "(Elucidation) spatially projects onto is a relation between some spatiotemporal region b and spatial region c such that at some time t, c is the spatial extent of b at t"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000218
-mro:BFO_0000218 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain obo:BFO_0000016 ;
- rdfs:range obo:BFO_0000040 ;
- "242-BFO" ;
- rdfs:label "has material basis"@en ;
- "b has material basis c =Def b is a disposition & c is a material entity & there is some d bearer of b & there is some time t such that c is a continuant part of d at t & d has disposition b because c is a continuant part of d at t"@en ;
- "Users that require more sophisticated representations of time are encouraged to import a temporal extension of BFO-Core provided by the BFO development team. See documentation for guidance: "@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000221
-mro:BFO_0000221 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000222 ;
- rdfs:domain obo:BFO_0000203 ;
- rdfs:range obo:BFO_0000008 ;
- "268-BFO" ;
- rdfs:label "first instant of"@en ;
- "t first instant of t' =Def t is a temporal instant & t' is a temporal region t' & t precedes all temporal parts of t' other than t"@en ;
- "An hour starting at midnight yesterday has first instant midnight yesterday"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000222
-mro:BFO_0000222 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdf:type owl:FunctionalProperty ;
- rdfs:domain obo:BFO_0000008 ;
- rdfs:range obo:BFO_0000203 ;
- "261-BFO" ;
- rdfs:label "has first instant"@en ;
- "t has first instant t' =Def t' first instant of t"@en ;
- "The first hour of a year has first instant midnight on December 31"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000223
-mro:BFO_0000223 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:BFO_0000224 ;
- rdfs:domain obo:BFO_0000203 ;
- rdfs:range obo:BFO_0000008 ;
- "269-BFO" ;
- rdfs:label "last instant of"@en ;
- "t last instant of t' =Def t is a temporal instant & t' is a temporal region & all temporal parts of t' other than t precede t"@en ;
- "Last midnight is the last instant of yesterday"@en .
-
-
-### https://www.commoncoreontologies.org/mro/BFO_0000224
-mro:BFO_0000224 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdf:type owl:FunctionalProperty ;
- rdfs:domain obo:BFO_0000008 ;
- rdfs:range obo:BFO_0000203 ;
- "215-BFO" ;
- rdfs:label "has last instant"@en ;
- "t has last instant t' =Def t' last instant of t"@en ;
- "The last hour of a year has last instant midnight December 31"@en .
-
-
-### https://www.commoncoreontologies.org/mro/mro00000001
-mro:mro00000001 rdf:type owl:ObjectProperty ;
- rdfs:label "Modal Object Property"@en .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001774
-mro:ont00001774 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001902 ;
- owl:inverseOf mro:ont00001883 ;
- rdfs:label "has brother"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001775
-mro:ont00001775 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:ont00001928 ;
- rdfs:domain obo:BFO_0000004 ;
- rdfs:range obo:BFO_0000004 ;
- rdfs:label "is successor of"@en ;
- "A continuant c2 is a successor of some continuant c1 iff there is some process p1 and c1 is an input to p1 and c2 is an output of p1. Inverse of is predecessor. "@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001776
-mro:ont00001776 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001945 ;
- owl:inverseOf mro:ont00001876 ;
- rdfs:label "has grandfather"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001777
-mro:ont00001777 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000117 ;
- owl:inverseOf mro:ont00001857 ;
- rdfs:domain obo:BFO_0000015 ;
- rdfs:range obo:BFO_0000015 ;
- rdfs:label "has process part"@en ;
- "x has_process_part y iff x and y are instances of Process, such that y occurs during the temporal interval of x, and y either provides an input to x or receives an output of x, or both."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001778
-mro:ont00001778 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000057 ;
- owl:inverseOf mro:ont00001936 ;
- rdfs:label "has object"@en ;
- "If p is a process and c is a continuant, then p has object c if and only if p is performed by an agent and c is part of the projected state that agent intends to achieve by performing p."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001779
-mro:ont00001779 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:ont00001848 ;
- rdfs:domain obo:BFO_0000038 ;
- rdfs:range obo:BFO_0000148 ;
- rdfs:label "has inside instant"@en ;
- "For Temporal Interval t1 and Temporal Instant t2, t1 has inside instant t2 if and only if there exists Temporal Instants t3 and t4 that are part of t1 and non-identical with t2, such that t3 is before t2 and t4 is after t2."@en ;
- cco:ont00001754 "J. F. Allen and J. A. G. M. Koomen. Planning using a temporal world model. In Proceedings of the 8th International Joint Conference on Artificial Intelligence (IJCAI-1983) pages 741–747. Available at: https://www.ijcai.org/Proceedings/83-2/Papers/036.pdf"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001780
-mro:ont00001780 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001842 ;
- owl:inverseOf mro:ont00001786 ;
- rdfs:label "has mother"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001781
-mro:ont00001781 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001996 ;
- owl:inverseOf mro:ont00001979 ;
- rdfs:label "has step sister"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001782
-mro:ont00001782 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001832 ;
- rdfs:domain obo:BFO_0000027 ;
- rdfs:range [ owl:intersectionOf ( obo:BFO_0000004
- [ rdf:type owl:Class ;
- owl:complementOf obo:BFO_0000006
- ]
- ) ;
- rdf:type owl:Class
- ] ;
- rdfs:label "has all members located in"@en ;
- "x has all members located in y iff x is an instance of Object Aggregate and y is an instance of independent continuant but not a spatial region, and every member of x is located in y."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001783
-mro:ont00001783 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001945 ;
- owl:inverseOf mro:ont00001820 ;
- rdfs:label "is granddaughter of"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001784
-mro:ont00001784 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001818 ;
- owl:inverseOf mro:ont00001881 ;
- rdfs:label "has son in law"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001785
-mro:ont00001785 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001865 ;
- owl:inverseOf mro:ont00001988 ;
- rdfs:label "has uncle"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001786
-mro:ont00001786 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001995 ;
- rdfs:label "is mother of"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001787
-mro:ont00001787 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:BFO_0000056 ;
- owl:inverseOf mro:ont00001833 ;
- rdfs:label "agent in"@en ;
- "x agent_in y iff y is an instance of Process and x is an instance of Agent, such that x is causally active in y."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001788
-mro:ont00001788 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001789 ;
- owl:inverseOf mro:ont00001994 ;
- rdfs:label "has paternal aunt"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001789
-mro:ont00001789 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001865 ;
- owl:inverseOf mro:ont00001955 ;
- rdfs:label "has aunt"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001790
-mro:ont00001790 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001785 ;
- owl:inverseOf mro:ont00001929 ;
- rdfs:label "has maternal uncle"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001791
-mro:ont00001791 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001810 ;
- rdfs:domain obo:BFO_0000141 ;
- rdfs:range obo:BFO_0000141 ;
- rdfs:label "coincides with"@en ;
- "An immaterial entity im1 coincides with some immaterial entity im2 iff im1 is a spatial part of im2 and im2 is a spatial part of im1."@en ;
- "Given a stronger temporal interpretation, this property may be transitive and symmetric. For more info please refer to https://github.com/BFO-ontology/BFO-2020/tree/master/src/owl/temporal%20extensions."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001792
-mro:ont00001792 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001902 ;
- owl:inverseOf mro:ont00001851 ;
- rdfs:label "has sister"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001793
-mro:ont00001793 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001975 ;
- owl:inverseOf mro:ont00001948 ;
- rdfs:label "has half sister"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001794
-mro:ont00001794 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001977 ;
- owl:inverseOf mro:ont00001815 ;
- rdfs:domain cco:ont00001180 ;
- rdfs:range cco:ont00001180 ;
- rdfs:label "has subsidiary"@en ;
- "An Organization o1 has_subsidiary Organization o2 iff o1 controls o2 by having the capacity to determine the outcome of decisions about o2's financial and operating policies."@en ;
- cco:ont00001754 "http://www.austlii.edu.au/legis/cth/consol_act/ca2001172/s50aa.html" ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001795
-mro:ont00001795 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001924 ;
- owl:inverseOf mro:ont00001869 ;
- rdfs:domain obo:BFO_0000038 ;
- rdfs:range obo:BFO_0000038 ;
- rdfs:label "has inside interval"@en ;
- "A Temporal Interval INT2 has inside interval some Temporal Interval INT1 iff there exist Temporal Instants inst1, inst2, inst3, and inst4 such that inst1 is the starting instant of INT1, inst2 is the ending instant of INT1, inst3 is the starting instant of INT2, inst4 is the ending instant of INT2, inst3 is before inst1, and inst2 is before inst4."@en ;
- cco:ont00001754 "J. F. Allen and J. A. G. M. Koomen. Planning using a temporal world model. In Proceedings of the 8th International Joint Conference on Artificial Intelligence (IJCAI-1983) pages 741–747. Available at: https://www.ijcai.org/Proceedings/83-2/Papers/036.pdf"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001796
-mro:ont00001796 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001944 ;
- owl:inverseOf mro:ont00001909 ;
- rdfs:domain obo:BFO_0000141 ;
- rdfs:range obo:BFO_0000141 ;
- rdfs:label "tangential part of"@en ;
- "An immaterial entity im1 is a tangential part of some immaterial entity im2 iff im1 is a spatial part of im2 and there exists some immaterial entity im3 such that im3 externally connects with im1 and im3 externally connects with im2."@en ;
- "Given a stronger temporal interpretation, this property may be transitive. For more info please refer to https://github.com/BFO-ontology/BFO-2020/tree/master/src/owl/temporal%20extensions."@en ;
- cco:ont00001754 "Randell, D. A., Cui, Z. and Cohn, A. G.: 1992, \"A spatial logic based on regions and connection,\" Proc. 3rd Int. Conf. on Knowledge Representation and Reasoning, Morgan Kaufmann, San Mateo, pp. 165-176. Available at: https://www.dpi.inpe.br/gilberto/references/cohn_rcc.pdf"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001797
-mro:ont00001797 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001810 ;
- rdfs:domain obo:BFO_0000141 ;
- rdfs:range obo:BFO_0000141 ;
- rdfs:label "partially overlaps with"@en ;
- "An immaterial entity im1 partially overlaps with some immaterial entity im2 iff im1 overlaps with im2 and im1 is not a spatial part of im2 and im2 is not a spatial part of im1."@en ;
- "Given a stronger temporal interpretation, this property may be symmetric. For more info please refer to https://github.com/BFO-ontology/BFO-2020/tree/master/src/owl/temporal%20extensions."@en ;
- cco:ont00001754 "Randell, D. A., Cui, Z. and Cohn, A. G.: 1992, \"A spatial logic based on regions and connection,\" Proc. 3rd Int. Conf. on Knowledge Representation and Reasoning, Morgan Kaufmann, San Mateo, pp. 165-176. Available at: https://www.dpi.inpe.br/gilberto/references/cohn_rcc.pdf"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001798
-mro:ont00001798 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001939 ;
- owl:inverseOf mro:ont00001943 ;
- rdfs:domain cco:ont00001262 ;
- rdfs:range cco:ont00001262 ;
- rdfs:label "is supervised by"@en ;
- "A person p1 is supervised by a person p2 by virtue of p1 being directed, managed, or overseen by p2."@en ;
- cco:ont00001754 "http://en.wiktionary.org/wiki/supervise)" ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001799
-mro:ont00001799 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001809 ;
- rdfs:domain obo:BFO_0000023 ;
- rdfs:range obo:BFO_0000027 ;
- rdfs:label "role of aggregate"@en ;
- "x role_of_aggregate y iff y is an instance of Object Aggregate and x is an instance of Role, and x inheres_in_aggregate y."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001800
-mro:ont00001800 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001942 ;
- owl:inverseOf mro:ont00001817 ;
- rdfs:domain cco:ont00001324 ;
- rdfs:range obo:BFO_0000015 ;
- rdfs:label "prohibits"@en ;
- "x prohibits y at t iff: x is an instance of Process Regulation at time t, and y is an instance of Process at time t, and x prescribes that some y must not occur."@en ;
- "Given a stronger temporal interpretation, this property may be asymmetric and irreflexive. For more info please refer to https://github.com/BFO-ontology/BFO-2020/tree/master/src/owl/temporal%20extensions."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001801
-mro:ont00001801 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:ont00001808 ;
- rdfs:range cco:ont00000958 ;
- rdfs:label "is subject of"@en ;
- "A primitive relationship between an instance of an Entity and an instance of an Information Content Entity."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001802
-mro:ont00001802 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001804 ;
- owl:inverseOf mro:ont00001957 ;
- rdfs:label "has husband"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001803
-mro:ont00001803 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:ont00001819 ;
- rdfs:domain obo:BFO_0000003 ;
- rdfs:range obo:BFO_0000003 ;
- rdfs:label "is cause of"@en ;
- "x is_cause_of y iff x and y are instances of Occurrent, and y is a consequence of x."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001804
-mro:ont00001804 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001865 ;
- owl:inverseOf mro:ont00001804 ;
- rdfs:label "is spouse of"@en ;
- "Given a stronger temporal interpretation, this property may be symmetric. For more info please refer to https://github.com/BFO-ontology/BFO-2020/tree/master/src/owl/temporal%20extensions."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001805
-mro:ont00001805 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:ont00001888 ;
- rdfs:domain obo:BFO_0000015 ;
- rdfs:range obo:BFO_0000015 ;
- "2022-12-30T21:32:27-05:00"^^xsd:dateTime ;
- "https://cubrc.org"^^xsd:anyURI ;
- rdfs:label "is disrupted by"@en ;
- "Inverse of disrupts." ;
- "is disrupted by"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001806
-mro:ont00001806 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001865 ;
- owl:inverseOf mro:ont00001806 ;
- rdf:type owl:SymmetricProperty ;
- rdfs:label "is first cousin of"@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001807
-mro:ont00001807 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:ont00001920 ;
- owl:inverseOf mro:ont00001974 ;
- rdfs:domain obo:BFO_0000015 ;
- rdfs:range cco:ont00001324 ;
- rdfs:label "is required by"@en ;
- "y is_required_by x at t iff: x is an instance of Process Regulation at time t, and y is an instance of Process at time t, and x prescribes that y must occur."@en ;
- "Given a stronger temporal interpretation, this property may be asymmetric and irreflexive. For more info please refer to https://github.com/BFO-ontology/BFO-2020/tree/master/src/owl/temporal%20extensions."@en ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001808
-mro:ont00001808 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- rdfs:domain cco:ont00000958 ;
- rdfs:range obo:BFO_0000001 ;
- rdfs:label "is about"@en ;
- "A primitive relationship between an Information Content Entity and some Entity."@en ;
- cco:ont00001754 "http://purl.obolibrary.org/obo/IAO_0000136" ;
- cco:ont00001760 .
-
-
-### https://www.commoncoreontologies.org/mro/ont00001809
-mro:ont00001809 rdf:type owl:ObjectProperty ;
- rdfs:subPropertyOf mro:mro00000001 ;
- owl:inverseOf mro:ont00001836 ;
- rdfs:domain [ rdf:type owl:Class ;
- owl:unionOf ( obo:BFO_0000020
- obo:BFO_0000031
- )
- ] ;
- rdfs:range obo:BFO_0000027 ;
- rdfs:label "inheres in aggregate"@en ;
-