diff --git a/.gitmodules b/.gitmodules index 12ff227..081d4a0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,7 @@ +[submodule "dependencies/CDO-Shapes-gufo"] + path = dependencies/CDO-Shapes-gufo + url = https://github.com/Cyber-Domain-Ontology/CDO-Shapes-gufo.git + branch = main [submodule "dependencies/UCO"] path = dependencies/UCO url = https://github.com/ucoProject/UCO.git diff --git a/Makefile b/Makefile index fd0fcbd..5088e4c 100644 --- a/Makefile +++ b/Makefile @@ -20,17 +20,14 @@ PYTHON3 ?= python3 all: \ .venv-pre-commit/var/.pre-commit-built.log \ - all-ontology \ - all-shapes + all-ontology .PHONY: \ all-dependencies \ all-ontology \ - all-shapes \ check-dependencies \ check-mypy \ check-ontology \ - check-shapes \ check-supply-chain \ check-supply-chain-cdo-profile \ check-supply-chain-pre-commit \ @@ -41,7 +38,9 @@ all: \ # dependency on other profiles. .git_submodule_init_imports.done.log: \ .gitmodules - # TODO - Initialize non-CDO submodule here. + git submodule update \ + --init \ + dependencies/CDO-Shapes-gufo touch $@ .git_submodule_init.done.log: \ @@ -104,17 +103,11 @@ all-ontology: \ $(MAKE) \ --directory ontology -all-shapes: \ - all-dependencies - $(MAKE) \ - --directory shapes - check: \ .venv-pre-commit/var/.pre-commit-built.log \ check-mypy \ check-dependencies \ - check-ontology \ - check-shapes + check-ontology $(MAKE) \ --directory tests \ check @@ -140,12 +133,6 @@ check-ontology: \ --directory ontology \ check -check-shapes: \ - all-shapes - $(MAKE) \ - --directory shapes \ - check - # This target's dependencies potentially modify the working directory's # Git state, so it is intentionally not a dependency of check. check-supply-chain: \ @@ -192,9 +179,6 @@ clean: @$(MAKE) \ --directory tests \ clean - @$(MAKE) \ - --directory shapes \ - clean @$(MAKE) \ --directory ontology \ clean diff --git a/dependencies/CDO-Shapes-gufo b/dependencies/CDO-Shapes-gufo new file mode 160000 index 0000000..0981d4b --- /dev/null +++ b/dependencies/CDO-Shapes-gufo @@ -0,0 +1 @@ +Subproject commit 0981d4b1c0bbfd85995a2bbcd6c95e79d3976ae9 diff --git a/dependencies/Makefile b/dependencies/Makefile index 5b8603a..fda705d 100644 --- a/dependencies/Makefile +++ b/dependencies/Makefile @@ -20,16 +20,9 @@ top_srcdir := $(shell cd .. ; pwd) uco_srcdir := $(top_srcdir)/dependencies/UCO -RDF_TOOLKIT_JAR := $(uco_srcdir)/lib/rdf-toolkit.jar - all: \ catalog-v001.xml -$(RDF_TOOLKIT_JAR): - @echo "DEBUG:dependencies/Makefile:top_srcdir=$(top_srcdir)" >&2 - @echo "ERROR:dependencies/Makefile:rdf-toolkit.jar not found. Did you run `make` from the top source directory?" >&2 - @test -r $@ - catalog-v001.xml: \ $(top_srcdir)/.venv.done.log \ $(top_srcdir)/etc/domain_directories.tsv \ @@ -49,51 +42,14 @@ catalog-v001.xml: \ check: \ catalog-v001.xml -# TODO: This recipe deletes files generated by Make. The line deleting -# example.ttl should be adapted. clean: @rm -f \ catalog-v001.xml \ - example.ttl \ imports-transitive.ttl -# TODO: Adapt this recipe to normalize a submodule's file, or downloaded -# file, in the same manner as CDO ontologies are normalized. -example.ttl: \ - example/example.owl \ - $(RDF_TOOLKIT_JAR) \ - $(top_srcdir)/.venv.done.log - source $(top_srcdir)/venv/bin/activate \ - && pyshacl \ - --shacl UCO/ontology/owl/owl.ttl \ - $< - java -jar $(RDF_TOOLKIT_JAR) \ - --inline-blank-nodes \ - --source $< \ - --source-format rdf-xml \ - --target _$@ \ - --target-format turtle - mv _$@ $@ - # This recipe intentionally does not incorporate CDO ontologies (UCO, # CASE, etc.), to avoid redundant imports between multiple profiles. -# TODO: Adapt this recipe to depend instead on the normalized file, as -# well as any profile submodules' imports-transitive files. -# Note that the piping command, analagous to the concatenate ('cat') -# command but for RDF graph files, will combine all recipe dependencies -# into one file, using the $^ ("all dependencies") Make variable. imports-transitive.ttl: \ - example.ttl - source $(top_srcdir)/venv/bin/activate \ - && rdfpipe \ - --output-format turtle \ - $^ \ - > __$@ - java -jar $(RDF_TOOLKIT_JAR) \ - --inline-blank-nodes \ - --source __$@ \ - --source-format turtle \ - --target _$@ \ - --target-format turtle - rm __$@ + $(top_srcdir)/dependencies/CDO-Shapes-gufo/dependencies/imports-transitive.ttl + cp $< _$@ mv _$@ $@ diff --git a/dependencies/example.ttl b/dependencies/example.ttl deleted file mode 100644 index ab1da1c..0000000 --- a/dependencies/example.ttl +++ /dev/null @@ -1,16 +0,0 @@ -@prefix ex: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix xsd: . - - - a owl:Ontology ; - owl:versionIRI ex:0.0.1 ; - . - -ex:Object - a owl:Class ; - rdfs:subClassOf owl:Thing ; - . - diff --git a/dependencies/example/README.md b/dependencies/example/README.md deleted file mode 100644 index fc3f5d5..0000000 --- a/dependencies/example/README.md +++ /dev/null @@ -1,3 +0,0 @@ -This directory is a placeholder for an ontology tracked by Git submodule. - -When adapting the UCO-Profile-Example repository, this directory should be removed. diff --git a/dependencies/example/example.owl b/dependencies/example/example.owl deleted file mode 100644 index 70e6c0d..0000000 --- a/dependencies/example/example.owl +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - diff --git a/etc/dependency_files.tsv b/etc/dependency_files.tsv index c59120d..27890d1 100644 --- a/etc/dependency_files.tsv +++ b/etc/dependency_files.tsv @@ -1,2 +1,3 @@ -http://example.org/ontology/example/0.0.1 ${top_srcdir}/dependencies/example.ttl -http://example.org/shapes/example ${top_srcdir}/shapes/sh-example.ttl +http://example.org/shapes/gufo ${top_srcdir}/dependencies/CDO-Shapes-gufo/shapes/sh-gufo.ttl +http://example.org/ontology/uco-gufo ${top_srcdir}/ontology/uco-gufo.ttl +http://purl.org/nemo/gufo#/1.0.0 ${top_srcdir}/dependencies/CDO-Shapes-gufo/dependencies/gufo.ttl diff --git a/etc/domain_directories.tsv b/etc/domain_directories.tsv index c0330cd..3a9bcd0 100644 --- a/etc/domain_directories.tsv +++ b/etc/domain_directories.tsv @@ -1,2 +1 @@ -https://example.org/ ${top_srcdir}/ontology/ https://ontology.unifiedcyberontology.org/ ${top_srcdir}/dependencies/UCO/ontology/ diff --git a/ontology/uco-example.ttl b/ontology/uco-example.ttl deleted file mode 100644 index da9c57e..0000000 --- a/ontology/uco-example.ttl +++ /dev/null @@ -1,23 +0,0 @@ -# imports: http://example.org/ontology/example/0.0.1 -# imports: https://ontology.unifiedcyberontology.org/uco/uco/1.3.0 - -@prefix drafting: . -@prefix ex: . -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix uco-core: . -@prefix xsd: . - - - a owl:Ontology ; - owl:imports - ex:0.0.1 , - - ; - . - -uco-core:UcoObject - rdfs:subClassOf ex:Object ; - . - diff --git a/ontology/uco-gufo.ttl b/ontology/uco-gufo.ttl new file mode 100644 index 0000000..4b16e41 --- /dev/null +++ b/ontology/uco-gufo.ttl @@ -0,0 +1,37 @@ +# imports: http://purl.org/nemo/gufo#/1.0.0 +# imports: https://ontology.unifiedcyberontology.org/uco/uco/1.3.0 + +@prefix drafting: . +@prefix gufo: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix uco-action: . +@prefix uco-core: . +@prefix uco-identity: . +@prefix xsd: . + + + a owl:Ontology ; + owl:imports + , + + ; + . + +uco-action:Action + rdfs:subClassOf gufo:Event ; + . + +uco-core:Event + rdfs:subClassOf gufo:Event ; + . + +uco-identity:Organization + rdfs:subClassOf gufo:Object ; + . + +uco-identity:Person + rdfs:subClassOf gufo:Object ; + . + diff --git a/shapes/Makefile b/shapes/Makefile deleted file mode 100644 index e6360e7..0000000 --- a/shapes/Makefile +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/make -f - -# Portions of this file contributed by NIST are governed by the following -# statement: -# -# This software was developed at the National Institute of Standards -# and Technology by employees of the Federal Government in the course -# of their official duties. Pursuant to title 17 Section 105 of the -# United States Code this software is not subject to copyright -# protection and is in the public domain. NIST assumes no -# responsibility whatsoever for its use by other parties, and makes -# no guarantees, expressed or implied, about its quality, -# reliability, or any other characteristic. -# -# We would appreciate acknowledgement if the software is used. - -SHELL := /bin/bash - -top_srcdir := $(shell cd .. ; pwd) - -uco_srcdir := $(top_srcdir)/dependencies/UCO - -RDF_TOOLKIT_JAR := $(uco_srcdir)/lib/rdf-toolkit.jar - -ttl_basenames := $(wildcard sh-*.ttl) - -check_ttl_targets := $(foreach ttl_basename,$(ttl_basenames),check-$(ttl_basename)) - -all: \ - catalog-v001.xml - -.PHONY: \ - check-%.ttl - -.PRECIOUS: \ - .check-%.ttl - -$(RDF_TOOLKIT_JAR): - @echo "DEBUG:shapes/Makefile:top_srcdir=$(top_srcdir)" >&2 - @echo "ERROR:shapes/Makefile:rdf-toolkit.jar not found. Did you run `make` from the top source directory?" >&2 - @test -r $@ - -.check-%.ttl: \ - %.ttl \ - $(RDF_TOOLKIT_JAR) - java -jar $(RDF_TOOLKIT_JAR) \ - --inline-blank-nodes \ - --source $< \ - --source-format turtle \ - --target _$@ \ - --target-format turtle - mv _$@ $@ - -catalog-v001.xml: \ - $(top_srcdir)/.venv.done.log \ - $(top_srcdir)/etc/domain_directories.tsv \ - $(top_srcdir)/etc/dependency_files.tsv \ - $(uco_srcdir)/ontology/uco/master/catalog-v001.xml \ - $(uco_srcdir)/src/create-catalog-v001.xml.py - rm -f _$@ - source $(top_srcdir)/venv/bin/activate \ - && python3 $(uco_srcdir)/src/create-catalog-v001.xml.py \ - --catalog-xml $(uco_srcdir)/ontology/uco/master/catalog-v001.xml \ - _$@ \ - $(top_srcdir)/etc/domain_directories.tsv \ - $(top_srcdir)/etc/dependency_files.tsv \ - "$(top_srcdir)" \ - $(ttl_basenames) - mv _$@ $@ - -check: \ - $(check_ttl_targets) \ - catalog-v001.xml - -check-%.ttl: \ - %.ttl \ - .check-%.ttl - diff $^ \ - || (echo "ERROR:shapes/Makefile:The local $< does not match the normalized version. If the above reported changes look fine, run 'cp .check-$< $<' while in the sub-folder shapes/ to get a file ready to commit to Git." >&2 ; exit 1) - -clean: - @rm -f \ - _* \ - catalog-v001.xml diff --git a/shapes/catalog-v001.xml b/shapes/catalog-v001.xml deleted file mode 100644 index 6936bc2..0000000 --- a/shapes/catalog-v001.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shapes/sh-example.ttl b/shapes/sh-example.ttl deleted file mode 100644 index 609af39..0000000 --- a/shapes/sh-example.ttl +++ /dev/null @@ -1,62 +0,0 @@ -# imports: http://example.org/ontology/uco-example - -@prefix owl: . -@prefix rdf: . -@prefix rdfs: . -@prefix sh: . -@prefix sh-example: . -@prefix sh-owl-abox: . -@prefix xsd: . - - - a owl:Ontology ; - rdfs:comment "This shapes file should be filled in for at least mapped classes and properties when the upstream ontology does not provide SHACL shapes."@en ; - owl:imports ; - . - -sh-owl-abox:disjoint-constraint - a sh:SPARQLConstraint ; - rdfs:comment - "This constraint is given an IRI for the cosmetic benefit of compacting SHACL validation results."@en , - "This constraint was intentionally not written to review subclass hierarchies (e.g. by querying for 'nClassA' being a subclass, possibly transitively, of 'nClassNotA,' using 'a/rdfs:subClassOf*'. RDFS inferencing may be required to have this shape fully review a graph. RDFS inferencing is not encoded as a requirement, though it is possible to do so with 'sh:entailment' (see SHACL Specification Section 1.5)."@en - ; - rdfs:seeAlso - , - sh:entailment , - - ; - sh:message "Focus node is a member of two classes that are disjoint with one another: the value node, and {?nNotValue}."@en ; - sh:select """ - PREFIX owl: - PREFIX rdf: - SELECT $this ?value ?nNotValue - WHERE { - $this - a - ?value , - ?nNotValue - ; - . - { - ?nNotValue owl:disjointWith ?value . - } - UNION - { - ?nDisjointedness - a owl:AllDisjointClasses ; - owl:members/rdf:rest*/rdf:first ?value ; - owl:members/rdf:rest+/rdf:first ?nNotValue ; - . - FILTER ( ?value != ?nNotValue ) - } - } - """ ; - . - -sh-owl-abox:disjoint-shape - a sh:NodeShape ; - rdfs:comment "This shape is planned to migrate to another repository."@en ; - sh:sparql sh-owl-abox:disjoint-constraint ; - sh:targetClass owl:Thing ; - . - diff --git a/tests/exemplars.ttl b/tests/exemplars.ttl index 2299bc2..2556576 100644 --- a/tests/exemplars.ttl +++ b/tests/exemplars.ttl @@ -1,20 +1,34 @@ -# imports: http://example.org/ontology/uco-example +# imports: http://example.org/ontology/uco-gufo @prefix drafting: . @prefix kb: . @prefix owl: . @prefix rdf: . @prefix rdfs: . +@prefix uco-action: . @prefix uco-core: . +@prefix uco-identity: . @prefix xsd: . a owl:Ontology ; rdfs:comment "This knowledge base instantiates each of the mapped classes and properties, so SHACL shapes can perform a review for inconsistencies in the mapping between UCO and the mapped ontology."@en ; - owl:imports ; + owl:imports ; . -kb:UcoObject-24cf6699-3cb6-47fa-9f62-c972b0971752 - a uco-core:UcoObject ; +kb:Action-13c91d40-9ca0-4558-81a1-4f7db888c371 + a uco-action:Action ; + . + +kb:Event-03a1a1db-0579-4427-9a51-448c32281146 + a uco-core:Event ; + . + +kb:Organization-3b542161-47e1-40cd-a1b1-e1b9d07af81f + a uco-identity:Organization ; + . + +kb:Person-0c9728af-7f52-400e-9861-72cd11f6966a + a uco-identity:Person ; .