diff --git a/ChangeLog b/ChangeLog index 053bd62..d09ff3b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2025-10-22 + * Issue 184: Add investigation:Technician role class + 2025-03-18 * (7ecdaf4) UCO Issue 629: Revise vocabulary pattern diff --git a/ontology/investigation/investigation.ttl b/ontology/investigation/investigation.ttl index a572ba4..faf4b99 100644 --- a/ontology/investigation/investigation.ttl +++ b/ontology/investigation/investigation.ttl @@ -235,6 +235,17 @@ investigation:SubjectActionLifecycle sh:targetClass investigation:SubjectActionLifecycle ; . +investigation:Technician + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf uco-role:Role ; + rdfs:label "Technician"@en ; + rdfs:comment "Technician is a role involved in performing technical tasks during investigations, such as evidence collection, preservation, processing, initial analysis, and repair."@en ; + sh:targetClass investigation:Technician ; + . + investigation:VictimActionLifecycle a owl:Class , diff --git a/tests/examples/Makefile b/tests/examples/Makefile index f79c2a5..daa1e81 100644 --- a/tests/examples/Makefile +++ b/tests/examples/Makefile @@ -22,7 +22,8 @@ tests_srcdir := $(top_srcdir)/tests all: \ investigative_action_PASS_validation.ttl \ - investigative_action_XFAIL_validation.ttl + investigative_action_XFAIL_validation.ttl \ + technician_role_PASS_validation.ttl .PRECIOUS: \ %_validation.ttl @@ -63,7 +64,8 @@ all: \ check: \ investigative_action_PASS_validation.ttl \ - investigative_action_XFAIL_validation.ttl + investigative_action_XFAIL_validation.ttl \ + technician_role_PASS_validation.ttl source $(top_srcdir)/venv/bin/activate \ && pytest \ --log-level=DEBUG diff --git a/tests/examples/technician_role_PASS.json b/tests/examples/technician_role_PASS.json new file mode 100644 index 0000000..0952a71 --- /dev/null +++ b/tests/examples/technician_role_PASS.json @@ -0,0 +1,64 @@ +{ + "@context": { + "kb": "http://example.org/kb/", + "case-investigation": "https://ontology.caseontology.org/case/investigation/", + "uco-action": "https://ontology.unifiedcyberontology.org/uco/action/", + "uco-core": "https://ontology.unifiedcyberontology.org/uco/core/", + "uco-observable": "https://ontology.unifiedcyberontology.org/uco/observable/", + "xsd": "http://www.w3.org/2001/XMLSchema#" + }, + "@graph": [ + { + "@id": "kb:technician-identity-9a8b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d", + "@type": "uco-core:Identity", + "uco-core:name": "Forensic Technician Williams", + "uco-core:role": { + "@id": "kb:technician-role-c8d9f2e1-a4b7-4c3e-8f5d-6a1e9b2c7f4a" + } + }, + { + "@id": "kb:technician-role-c8d9f2e1-a4b7-4c3e-8f5d-6a1e9b2c7f4a", + "@type": "case-investigation:Technician", + "uco-core:startTime": { + "@type": "xsd:dateTime", + "@value": "2024-01-15T09:00:00Z" + } + }, + { + "@id": "kb:disk-image-3f8a2c7d-b1e9-4d3c-a5f7-1b2e4a9c8d6f", + "@type": "uco-observable:File", + "uco-core:description": "Forensic disk image of evidence laptop", + "uco-core:hasFacet": { + "@id": "kb:disk-image-facet-a3c9f7e1-d5b2-4a8e-9c3f-7e1a5d9b2c4f", + "@type": "uco-observable:FileFacet", + "uco-observable:fileName": "evidence-laptop-001.dd", + "uco-observable:sizeInBytes": 512000000000 + } + }, + { + "@id": "kb:disk-imaging-action-5d7a3e9f-c2b4-4f8a-9e3d-6c1b5a8f7e2d", + "@type": "case-investigation:InvestigativeAction", + "uco-core:name": "Disk imaging of evidence laptop", + "uco-action:performer": { + "@id": "kb:technician-role-c8d9f2e1-a4b7-4c3e-8f5d-6a1e9b2c7f4a" + }, + "uco-action:result": [ + { + "@id": "kb:disk-image-3f8a2c7d-b1e9-4d3c-a5f7-1b2e4a9c8d6f" + }, + { + "@id": "kb:provenance-record-e9f5c1a7-d4b8-4a6e-9c2f-3e5d7a9b1c4f" + } + ] + }, + { + "@id": "kb:provenance-record-e9f5c1a7-d4b8-4a6e-9c2f-3e5d7a9b1c4f", + "@type": "case-investigation:ProvenanceRecord", + "case-investigation:exhibitNumber": "2024-001-E1", + "case-investigation:rootExhibitNumber": "2024-001-E1", + "uco-core:object": { + "@id": "kb:disk-image-3f8a2c7d-b1e9-4d3c-a5f7-1b2e4a9c8d6f" + } + } + ] +} diff --git a/tests/examples/test_validation.py b/tests/examples/test_validation.py index d873012..f496979 100644 --- a/tests/examples/test_validation.py +++ b/tests/examples/test_validation.py @@ -128,3 +128,10 @@ def test_investigative_action_XFAIL_validation() -> None: str(NS_CASE_INVESTIGATION.rootExhibitNumber) } ) + +def test_technician_role_PASS_validation() -> None: + """ + Confirm the Technician role PASS instance data passes validation. + """ + g = load_validation_graph("technician_role_PASS_validation.ttl", True) + assert isinstance(g, rdflib.Graph)