From ce43114e71031ae2c4a3e1bb20fe438199059516 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 28 Sep 2021 16:51:22 -0400 Subject: [PATCH 01/49] Bump rdflib dependency to 6.0.1, deprecating local guess_format rdflib 6.0.1 upgraded `guess_format()` to report JSON-LD (via PRs 1403 and 1408). With the functionality upstream, this patch moves towards completing tech. transfer by deprecating the local implementation. References: * https://github.com/RDFLib/rdflib/pull/1403 * https://github.com/RDFLib/rdflib/pull/1408 Signed-off-by: Alex Nelson --- case_utils/__init__.py | 28 ++++----------------------- setup.cfg | 2 +- tests/case_utils/test_guess_format.py | 2 -- 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/case_utils/__init__.py b/case_utils/__init__.py index 0190a05..ee43a52 100644 --- a/case_utils/__init__.py +++ b/case_utils/__init__.py @@ -13,33 +13,13 @@ __version__ = "0.2.1" +import warnings + import rdflib.util from . import local_uuid def guess_format(fpath, fmap=None): - """ - This function is a wrapper around rdflib.util.guess_format(), adding that the .json extension should be recognized as JSON-LD. - - :param fpath: File path. - :type fpath: string - - :param fmap: Mapper dictionary; see rdflib.util.guess_format() for further description. Note that as in rdflib 5.0.0, supplying this argument overwrites, not augments, the suffix format map used by rdflib. - :type fmap: dict - - :returns: RDF file format, fit for rdflib.Graph.parse() or .serialize(); or, None if file extension not mapped. - :rtype: string - """ - - assert fmap is None or isinstance(fmap, dict), "Type check failed" - - if fmap is None: - updated_fmap = {key:rdflib.util.SUFFIX_FORMAT_MAP[key] for key in rdflib.util.SUFFIX_FORMAT_MAP} - if not "json" in updated_fmap: - updated_fmap["json"] = "json-ld" - if not "jsonld" in updated_fmap: - updated_fmap["jsonld"] = "json-ld" - else: - updated_fmap = {k:fmap[k] for k in fmap} + warnings.warn("The functionality in case_utils.guess_format is now upstream. Please revise your code to use rdflib.util.guess_format. The function arguments remain the same. case_utils.guess_format will be removed in case_utils 0.4.0.", DeprecationWarning) - return rdflib.util.guess_format(fpath, updated_fmap) + return rdflib.util.guess_format(fpath, fmap) diff --git a/setup.cfg b/setup.cfg index 66d100d..ca1a136 100644 --- a/setup.cfg +++ b/setup.cfg @@ -20,7 +20,7 @@ classifiers = install_requires = pandas pyparsing < 3.0.0 - rdflib >= 6.0.0 + rdflib >= 6.0.1 requests tabulate packages = find: diff --git a/tests/case_utils/test_guess_format.py b/tests/case_utils/test_guess_format.py index d54f4aa..d33bea5 100644 --- a/tests/case_utils/test_guess_format.py +++ b/tests/case_utils/test_guess_format.py @@ -38,11 +38,9 @@ def test_rdflib_util_guess_format_ttl_default(): def test_rdflib_util_guess_format_ttl_fmap(): assert rdflib.util.guess_format(PATH_TO_TTL, FMAP_XHTML_GRDDL) == "turtle", "Failed to recognize .ttl RDF file extension when using fmap" -@pytest.mark.xfail(reason="rdflib 5.0.0 known to not recognize .json", strict=True) def test_rdflib_util_guess_format_json(): assert rdflib.util.guess_format(PATH_TO_JSON) == "json-ld", "Failed to recognize .json RDF file extension" -@pytest.mark.xfail(reason="rdflib 5.0.0 known to not recognize .jsonld", strict=True) def test_rdflib_util_guess_format_jsonld(): assert rdflib.util.guess_format(PATH_TO_JSONLD) == "json-ld", "Failed to recognize .jsonld RDF file extension" From eeae6acf964f8041ff73e0aaa3670a6a27997534 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 28 Sep 2021 16:57:04 -0400 Subject: [PATCH 02/49] Remove 'format=' parameter from graph parse() and serialize() calls rdflib 6.0.0 improved filename-based format recognition. (Tests for recognition were upgraded to support JSON-LD in PR 1408.) This patch removes explicit-but-redundant functionality. References: * https://github.com/RDFLib/rdflib/pull/1408 Signed-off-by: Alex Nelson --- case_utils/case_sparql_construct/__init__.py | 2 +- case_utils/case_sparql_select/__init__.py | 2 +- tests/case_file/test_case_file.py | 2 +- tests/case_sparql_construct/test_case_sparql_construct.py | 2 +- tests/src/glom_graph.py | 4 ++-- tests/src/isomorphic_diff.py | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/case_utils/case_sparql_construct/__init__.py b/case_utils/case_sparql_construct/__init__.py index 4eaeceb..fcc9434 100644 --- a/case_utils/case_sparql_construct/__init__.py +++ b/case_utils/case_sparql_construct/__init__.py @@ -41,7 +41,7 @@ def main(): in_graph = rdflib.Graph() for in_graph_filename in args.in_graph: - in_graph.parse(in_graph_filename, format=case_utils.guess_format(in_graph_filename)) + in_graph.parse(in_graph_filename) _logger.debug("len(in_graph) = %d.", len(in_graph)) out_graph = rdflib.Graph() diff --git a/case_utils/case_sparql_select/__init__.py b/case_utils/case_sparql_select/__init__.py index 357e3b0..d3d6f51 100644 --- a/case_utils/case_sparql_select/__init__.py +++ b/case_utils/case_sparql_select/__init__.py @@ -55,7 +55,7 @@ def main(): graph = rdflib.Graph() for in_graph_filename in args.in_graph: - graph.parse(in_graph_filename, format=case_utils.guess_format(in_graph_filename)) + graph.parse(in_graph_filename) # Inherit prefixes defined in input context dictionary. nsdict = {k:v for (k,v) in graph.namespace_manager.namespaces()} diff --git a/tests/case_file/test_case_file.py b/tests/case_file/test_case_file.py index 6f71727..8d3bd10 100644 --- a/tests/case_file/test_case_file.py +++ b/tests/case_file/test_case_file.py @@ -39,7 +39,7 @@ def load_graph(filename): in_graph = rdflib.Graph() - in_graph.parse(filename, format=rdflib.util.guess_format(filename)) + in_graph.parse(filename) return in_graph @pytest.fixture diff --git a/tests/case_sparql_construct/test_case_sparql_construct.py b/tests/case_sparql_construct/test_case_sparql_construct.py index 9eb2002..68f6757 100644 --- a/tests/case_sparql_construct/test_case_sparql_construct.py +++ b/tests/case_sparql_construct/test_case_sparql_construct.py @@ -23,7 +23,7 @@ def _test_templates_with_blank_nodes_result(filename): ground_truth_negative = set() graph = rdflib.Graph() - graph.parse(filename, format=case_utils.guess_format(filename)) + graph.parse(filename) computed = set() query_string = """\ diff --git a/tests/src/glom_graph.py b/tests/src/glom_graph.py index 6e5829b..cf101ab 100644 --- a/tests/src/glom_graph.py +++ b/tests/src/glom_graph.py @@ -24,8 +24,8 @@ def main(): g = rdflib.Graph() for in_graph in args.in_graph: - g.parse(in_graph, format=case_utils.guess_format(in_graph)) - g.serialize(args.out_graph, format=case_utils.guess_format(args.out_graph)) + g.parse(in_graph) + g.serialize(args.out_graph) if __name__ == "__main__": import argparse diff --git a/tests/src/isomorphic_diff.py b/tests/src/isomorphic_diff.py index aba8a48..02b411c 100644 --- a/tests/src/isomorphic_diff.py +++ b/tests/src/isomorphic_diff.py @@ -52,8 +52,8 @@ def main(): g1 = rdflib.Graph() g2 = rdflib.Graph() - g1.parse(args.in_graph_1, format=case_utils.guess_format(args.in_graph_1)) - g2.parse(args.in_graph_2, format=case_utils.guess_format(args.in_graph_2)) + g1.parse(args.in_graph_1) + g2.parse(args.in_graph_2) #_logger.debug("type(g1) = %r.", type(g1)) #_logger.debug("type(g2) = %r.", type(g2)) From d1ca249f2a1b7387fb87bdcde14b4f9e41b54cb2 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 7 Oct 2021 11:22:00 -0400 Subject: [PATCH 03/49] Add mypy source review to current state This patch is to show what is needed to add static type checking with `mypy`. The brunt of the effort is adding `#type: ignore` annotations to `rdflib`. These can be removed once an `rdflib` release with the merged PR 1407 is issued. The additional package in `tests/requirements.txt` pertaining to `dateutil` was reported by `mypy`. DISCLAIMER: Participation by NIST in the creation of the documentation of mentioned software is not intended to imply a recommendation or endorsement by the National Institute of Standards and Technology, nor is it intended to imply that any specific software is necessarily the best available for the purpose. References: * [AC-211] Add static type checking to CASE-Utilities-Python * https://github.com/RDFLib/rdflib/pull/1407 Signed-off-by: Alex Nelson --- case_utils/__init__.py | 2 +- case_utils/case_file/__init__.py | 2 +- case_utils/case_sparql_construct/__init__.py | 2 +- case_utils/case_sparql_select/__init__.py | 4 ++-- tests/Makefile | 14 ++++++++++++++ tests/case_file/test_case_file.py | 2 +- .../test_case_sparql_construct.py | 2 +- tests/case_utils/test_guess_format.py | 2 +- tests/hexbinary/test_hexbinary.py | 2 +- tests/requirements.txt | 2 ++ tests/src/compact.py | 2 +- tests/src/glom_graph.py | 2 +- tests/src/isomorphic_diff.py | 2 +- 13 files changed, 28 insertions(+), 12 deletions(-) diff --git a/case_utils/__init__.py b/case_utils/__init__.py index ee43a52..275e665 100644 --- a/case_utils/__init__.py +++ b/case_utils/__init__.py @@ -15,7 +15,7 @@ import warnings -import rdflib.util +import rdflib.util # type: ignore from . import local_uuid diff --git a/case_utils/case_file/__init__.py b/case_utils/case_file/__init__.py index 7d07afb..369595d 100644 --- a/case_utils/case_file/__init__.py +++ b/case_utils/case_file/__init__.py @@ -21,7 +21,7 @@ import hashlib import os -import rdflib +import rdflib # type: ignore import case_utils diff --git a/case_utils/case_sparql_construct/__init__.py b/case_utils/case_sparql_construct/__init__.py index fcc9434..dcd110b 100644 --- a/case_utils/case_sparql_construct/__init__.py +++ b/case_utils/case_sparql_construct/__init__.py @@ -21,7 +21,7 @@ import os import logging -import rdflib.plugins.sparql +import rdflib.plugins.sparql # type: ignore import case_utils diff --git a/case_utils/case_sparql_select/__init__.py b/case_utils/case_sparql_select/__init__.py index d3d6f51..e99d79b 100644 --- a/case_utils/case_sparql_select/__init__.py +++ b/case_utils/case_sparql_select/__init__.py @@ -33,8 +33,8 @@ import os import logging -import pandas as pd -import rdflib.plugins.sparql +import pandas as pd # type: ignore +import rdflib.plugins.sparql # type: ignore import case_utils diff --git a/tests/Makefile b/tests/Makefile index 949f671..2d09c4b 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -32,6 +32,7 @@ all: \ check-case_sparql_construct \ check-case_sparql_select \ check-isomorphic_diff \ + check-mypy \ download .venv.done.log: \ @@ -79,6 +80,7 @@ all-case_sparql_select: \ # These check calls are provided in preferred run-order. check: \ check-isomorphic_diff \ + check-mypy \ check-case_file \ check-case_sparql_construct \ check-case_sparql_select @@ -116,6 +118,18 @@ check-isomorphic_diff: \ --directory isomorphic_diff \ check +# mypy is called against specific members of the tests directory to avoid descending into the virtual environment. +check-mypy: \ + .venv.done.log + source venv/bin/activate \ + && mypy \ + $(top_srcdir)/case_utils \ + case_file \ + case_sparql_construct \ + case_utils \ + hexbinary \ + src + clean: @$(MAKE) \ --directory case_sparql_select \ diff --git a/tests/case_file/test_case_file.py b/tests/case_file/test_case_file.py index 8d3bd10..cb63002 100644 --- a/tests/case_file/test_case_file.py +++ b/tests/case_file/test_case_file.py @@ -16,7 +16,7 @@ import os import pytest -import rdflib.plugins.sparql +import rdflib.plugins.sparql # type: ignore _logger = logging.getLogger(os.path.basename(__file__)) diff --git a/tests/case_sparql_construct/test_case_sparql_construct.py b/tests/case_sparql_construct/test_case_sparql_construct.py index 68f6757..c8268af 100644 --- a/tests/case_sparql_construct/test_case_sparql_construct.py +++ b/tests/case_sparql_construct/test_case_sparql_construct.py @@ -11,7 +11,7 @@ # # We would appreciate acknowledgement if the software is used. -import rdflib.plugins.sparql +import rdflib.plugins.sparql # type: ignore import case_utils diff --git a/tests/case_utils/test_guess_format.py b/tests/case_utils/test_guess_format.py index d33bea5..bf11558 100644 --- a/tests/case_utils/test_guess_format.py +++ b/tests/case_utils/test_guess_format.py @@ -12,7 +12,7 @@ # We would appreciate acknowledgement if the software is used. import pytest -import rdflib +import rdflib # type: ignore import case_utils diff --git a/tests/hexbinary/test_hexbinary.py b/tests/hexbinary/test_hexbinary.py index 04784bc..ad7d307 100644 --- a/tests/hexbinary/test_hexbinary.py +++ b/tests/hexbinary/test_hexbinary.py @@ -50,7 +50,7 @@ import os import pytest -import rdflib.plugins.sparql +import rdflib.plugins.sparql # type: ignore _logger = logging.getLogger(os.path.basename(__file__)) diff --git a/tests/requirements.txt b/tests/requirements.txt index b31bac3..f913d96 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,3 +1,5 @@ PyLD +mypy pytest python-dateutil +types-python-dateutil diff --git a/tests/src/compact.py b/tests/src/compact.py index 16c25ce..82e0f92 100644 --- a/tests/src/compact.py +++ b/tests/src/compact.py @@ -24,7 +24,7 @@ import os import json -import pyld +import pyld # type: ignore _logger = logging.getLogger(os.path.basename(__file__)) diff --git a/tests/src/glom_graph.py b/tests/src/glom_graph.py index cf101ab..0962a80 100644 --- a/tests/src/glom_graph.py +++ b/tests/src/glom_graph.py @@ -17,7 +17,7 @@ __version__ = "0.1.0" -import rdflib +import rdflib # type: ignore import case_utils diff --git a/tests/src/isomorphic_diff.py b/tests/src/isomorphic_diff.py index 02b411c..e770a10 100644 --- a/tests/src/isomorphic_diff.py +++ b/tests/src/isomorphic_diff.py @@ -34,7 +34,7 @@ import os import sys -import rdflib.compare +import rdflib.compare # type: ignore import case_utils From 9a582d78025475f7752d377313ecdd6ceb89e522 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 7 Oct 2021 11:29:28 -0400 Subject: [PATCH 04/49] Designate case_utils as a typed package References: * [AC-211] Add static type checking to CASE-Utilities-Python * https://www.python.org/dev/peps/pep-0561/ Signed-off-by: Alex Nelson --- case_utils/py.typed | 13 +++++++++++++ setup.cfg | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 case_utils/py.typed diff --git a/case_utils/py.typed b/case_utils/py.typed new file mode 100644 index 0000000..3ecd1f5 --- /dev/null +++ b/case_utils/py.typed @@ -0,0 +1,13 @@ +# 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. + +# This file is defined to support PEP 561: +# https://www.python.org/dev/peps/pep-0561/ diff --git a/setup.cfg b/setup.cfg index ca1a136..0f51d10 100644 --- a/setup.cfg +++ b/setup.cfg @@ -15,6 +15,7 @@ classifiers = Programming Language :: Python :: 3 [options] +include_package_data = true # TODO The constraint on pyparsing can be removed when rdflib Issue #1190 is resolved. # https://github.com/RDFLib/rdflib/issues/1190 install_requires = @@ -32,3 +33,6 @@ console_scripts = case_sparql_construct = case_utils.case_sparql_construct:main # Note that numpy (pandas dependency, and pandas is dependency of case_sparql_select) is only supported in Python >= 3.7. case_sparql_select = case_utils.case_sparql_select:main + +[options.package_data] +case_utils = py.typed From f99bceaea0080f479aa88d98680bbf0cac49109d Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 7 Oct 2021 11:55:18 -0400 Subject: [PATCH 05/49] Add minimal type signatures to test scripts An observed behavior is that mypy will not type signature analysis until one is added in the call path, e.g. designating `def main() -> None`. This patch is the minimal set of effects of adding a None return type to unit test functions. References: * [AC-211] Add static type checking to CASE-Utilities-Python Signed-off-by: Alex Nelson --- tests/case_file/test_case_file.py | 12 +++--- .../test_case_sparql_construct.py | 11 ++++-- tests/case_utils/test_guess_format.py | 24 ++++++------ tests/hexbinary/test_hexbinary.py | 37 ++++++++++--------- tests/src/compact.py | 2 +- tests/src/glom_graph.py | 2 +- tests/src/isomorphic_diff.py | 2 +- 7 files changed, 48 insertions(+), 42 deletions(-) diff --git a/tests/case_file/test_case_file.py b/tests/case_file/test_case_file.py index cb63002..29cd749 100644 --- a/tests/case_file/test_case_file.py +++ b/tests/case_file/test_case_file.py @@ -37,20 +37,22 @@ SRCDIR = os.path.dirname(__file__) -def load_graph(filename): +def load_graph( + filename +) -> rdflib.Graph: in_graph = rdflib.Graph() in_graph.parse(filename) return in_graph @pytest.fixture -def graph_case_file(): +def graph_case_file() -> rdflib.Graph: return load_graph(os.path.join(SRCDIR, "sample.txt.ttl")) @pytest.fixture -def graph_case_file_disable_hashes(): +def graph_case_file_disable_hashes() -> rdflib.Graph: return load_graph(os.path.join(SRCDIR, "sample.txt-disable_hashes.ttl")) -def test_confirm_hashes(graph_case_file): +def test_confirm_hashes(graph_case_file) -> None: expected = { "MD5": "098F6BCD4621D373CADE4E832627B4F6", "SHA1": "A94A8FE5CCB19BA61C4C0873D391E987982FBBD3", @@ -91,7 +93,7 @@ def test_confirm_hashes(graph_case_file): assert expected == computed -def test_confirm_mtime(graph_case_file, graph_case_file_disable_hashes): +def test_confirm_mtime(graph_case_file, graph_case_file_disable_hashes) -> None: query_confirm_mtime = """ SELECT ?nFile WHERE { diff --git a/tests/case_sparql_construct/test_case_sparql_construct.py b/tests/case_sparql_construct/test_case_sparql_construct.py index c8268af..eec5216 100644 --- a/tests/case_sparql_construct/test_case_sparql_construct.py +++ b/tests/case_sparql_construct/test_case_sparql_construct.py @@ -11,16 +11,18 @@ # # We would appreciate acknowledgement if the software is used. +import typing + import rdflib.plugins.sparql # type: ignore import case_utils -def _test_templates_with_blank_nodes_result(filename): +def _test_templates_with_blank_nodes_result(filename) -> None: ground_truth_positive = { ("Alice", "Hacker"), ("Bob", "Hacker") } - ground_truth_negative = set() + ground_truth_negative : typing.Set[str] = set() graph = rdflib.Graph() graph.parse(filename) @@ -48,7 +50,8 @@ def _test_templates_with_blank_nodes_result(filename): )) assert computed == ground_truth_positive -def test_templates_with_blank_nodes_result_json(): +def test_templates_with_blank_nodes_result_json() -> None: _test_templates_with_blank_nodes_result("output.json") -def test_templates_with_blank_nodes_result_turtle(): + +def test_templates_with_blank_nodes_result_turtle() -> None: _test_templates_with_blank_nodes_result("output.ttl") diff --git a/tests/case_utils/test_guess_format.py b/tests/case_utils/test_guess_format.py index bf11558..3cb4261 100644 --- a/tests/case_utils/test_guess_format.py +++ b/tests/case_utils/test_guess_format.py @@ -22,45 +22,45 @@ PATH_TO_XHTML = "/nonexistent/foo.xhtml" FMAP_XHTML_GRDDL = {"xhtml": "grddl"} -def test_rdflib_util_guess_format_xhtml_default(): +def test_rdflib_util_guess_format_xhtml_default() -> None: assert rdflib.util.guess_format(PATH_TO_XHTML) == "rdfa", "Failed to reproduce rdflib.util.guess_format test" -def test_rdflib_util_guess_format_xhtml_fmap(): +def test_rdflib_util_guess_format_xhtml_fmap() -> None: """ This test implements one of the documented demonstrations in rdflib.util.guess_format. """ assert rdflib.util.guess_format(PATH_TO_XHTML, FMAP_XHTML_GRDDL) == "grddl", "Failed to reproduce rdflib.util.guess_format test" -def test_rdflib_util_guess_format_ttl_default(): +def test_rdflib_util_guess_format_ttl_default() -> None: assert rdflib.util.guess_format(PATH_TO_TTL) == "turtle", "Failed to recognize .ttl RDF file extension" @pytest.mark.xfail(reason="rdflib 5.0.0 guess_format fmap argument overwrites base module's extension map", strict=True) -def test_rdflib_util_guess_format_ttl_fmap(): +def test_rdflib_util_guess_format_ttl_fmap() -> None: assert rdflib.util.guess_format(PATH_TO_TTL, FMAP_XHTML_GRDDL) == "turtle", "Failed to recognize .ttl RDF file extension when using fmap" -def test_rdflib_util_guess_format_json(): +def test_rdflib_util_guess_format_json() -> None: assert rdflib.util.guess_format(PATH_TO_JSON) == "json-ld", "Failed to recognize .json RDF file extension" -def test_rdflib_util_guess_format_jsonld(): +def test_rdflib_util_guess_format_jsonld() -> None: assert rdflib.util.guess_format(PATH_TO_JSONLD) == "json-ld", "Failed to recognize .jsonld RDF file extension" -def test_case_utils_guess_format_ttl_default(): +def test_case_utils_guess_format_ttl_default() -> None: assert case_utils.guess_format(PATH_TO_TTL) == "turtle", "Failed to recognize .ttl RDF file extension" @pytest.mark.xfail(reason="Preserving behavior - rdflib 5.0.0 guess_format fmap argument overwrites base module's extension map", strict=True) -def test_case_utils_guess_format_ttl_fmap(): +def test_case_utils_guess_format_ttl_fmap() -> None: assert case_utils.guess_format(PATH_TO_TTL, FMAP_XHTML_GRDDL) == "turtle", "Failed to recognize .ttl RDF file extension when using fmap" -def test_case_utils_guess_format_json_default(): +def test_case_utils_guess_format_json_default() -> None: assert case_utils.guess_format(PATH_TO_JSON) == "json-ld", "Failed to recognize .json RDF file extension" @pytest.mark.xfail(reason="Preserving behavior - rdflib 5.0.0 guess_format fmap argument overwrites base module's extension map", strict=True) -def test_case_utils_guess_format_json_fmap(): +def test_case_utils_guess_format_json_fmap() -> None: assert case_utils.guess_format(PATH_TO_JSON, FMAP_XHTML_GRDDL) == "json-ld", "Failed to recognize .json RDF file extension when using fmap" -def test_case_utils_guess_format_jsonld_default(): +def test_case_utils_guess_format_jsonld_default() -> None: assert case_utils.guess_format(PATH_TO_JSONLD) == "json-ld", "Failed to recognize .jsonld RDF file extension" @pytest.mark.xfail(reason="Preserving behavior - rdflib 5.0.0 guess_format fmap argument overwrites base module's extension map", strict=True) -def test_case_utils_guess_format_jsonld_fmap(): +def test_case_utils_guess_format_jsonld_fmap() -> None: assert case_utils.guess_format(PATH_TO_JSONLD, FMAP_XHTML_GRDDL) == "json-ld", "Failed to recognize .jsonld RDF file extension when using fmap" diff --git a/tests/hexbinary/test_hexbinary.py b/tests/hexbinary/test_hexbinary.py index ad7d307..d2b96d5 100644 --- a/tests/hexbinary/test_hexbinary.py +++ b/tests/hexbinary/test_hexbinary.py @@ -48,6 +48,7 @@ import logging import os +import typing import pytest import rdflib.plugins.sparql # type: ignore @@ -64,7 +65,7 @@ n_uppercase1 = rdflib.URIRef("urn:example:uppercase1") p_predicate = rdflib.URIRef("urn:example:predicate1") -def test_sparql_syntax_bind_boolean(): +def test_sparql_syntax_bind_boolean() -> None: """ This test serves as a syntax reminder for binding boolean values. """ @@ -81,7 +82,7 @@ def test_sparql_syntax_bind_boolean(): assert confirmed @pytest.mark.xfail(reason="hard-coded failure") -def test_pytest_syntax_xfail(): +def test_pytest_syntax_xfail() -> None: """ This test serves as a syntax reminder for the XFail decorator. """ @@ -97,7 +98,7 @@ def test_pytest_syntax_xfail(): confirmed = l_value.toPython() assert confirmed -def test_sparql_syntax_integer_coercion(): +def test_sparql_syntax_integer_coercion() -> None: """ This test serves as a syntax reminder for type coercions. """ @@ -113,7 +114,7 @@ def test_sparql_syntax_integer_coercion(): confirmed = l_value.toPython() assert confirmed -def test_sparql_syntax_integer_cast(): +def test_sparql_syntax_integer_cast() -> None: """ This test serves as a syntax reminder for the casting form of type coercions. """ @@ -130,7 +131,7 @@ def test_sparql_syntax_integer_cast(): assert confirmed @pytest.mark.xfail -def test_sparql_cast_custom_type(): +def test_sparql_cast_custom_type() -> None: """ This test checks for nonexistent literal-datatype assignments. """ @@ -146,7 +147,7 @@ def test_sparql_cast_custom_type(): confirmed = l_value.toPython() assert confirmed -def test_sparql_compare_hexbinary_mixcase(): +def test_sparql_compare_hexbinary_mixcase() -> None: confirmed = None graph = rdflib.Graph() for result in graph.query("""\ @@ -159,7 +160,7 @@ def test_sparql_compare_hexbinary_mixcase(): confirmed = l_value.toPython() assert confirmed -def test_sparql_compare_hexbinary_matchcase(): +def test_sparql_compare_hexbinary_matchcase() -> None: confirmed = None graph = rdflib.Graph() for result in graph.query("""\ @@ -172,7 +173,7 @@ def test_sparql_compare_hexbinary_matchcase(): confirmed = l_value.toPython() assert confirmed -def test_sparql_compare_hexbinarycanonical_matchcase(): +def test_sparql_compare_hexbinarycanonical_matchcase() -> None: confirmed = None graph = rdflib.Graph() for result in graph.query("""\ @@ -186,7 +187,7 @@ def test_sparql_compare_hexbinarycanonical_matchcase(): assert confirmed @pytest.mark.xfail -def test_sparql_compare_hexbinarycanonical_mixcase(): +def test_sparql_compare_hexbinarycanonical_mixcase() -> None: """ This test shows hexBinaryCanonical does not induce a casing-insensitive comparison. """ @@ -203,7 +204,7 @@ def test_sparql_compare_hexbinarycanonical_mixcase(): assert confirmed @pytest.mark.xfail -def test_sparql_compare_hb_hbc_mixcase(): +def test_sparql_compare_hb_hbc_mixcase() -> None: """ This test confirms that literal-comparison takes into account datatype when one type is unknown. """ @@ -220,7 +221,7 @@ def test_sparql_compare_hb_hbc_mixcase(): assert confirmed @pytest.mark.xfail -def test_sparql_compare_hb_hbc_mixcase_cast(): +def test_sparql_compare_hb_hbc_mixcase_cast() -> None: """ This test is a bit redundant with test_sparql_cast_custom_type, but is here as an explicit demonstration of failure to cast a hexBinary value. """ @@ -236,7 +237,7 @@ def test_sparql_compare_hb_hbc_mixcase_cast(): confirmed = l_value.toPython() assert confirmed -def test_rdflib_literal_hexbinary(): +def test_rdflib_literal_hexbinary() -> None: _logger.debug("l_hb_lowercase = %r." % l_hb_lowercase) _logger.debug("l_hb_uppercase = %r." % l_hb_uppercase) _logger.debug("l_hb_lowercase.toPython() = %r." % l_hb_lowercase.toPython()) @@ -249,20 +250,20 @@ def test_rdflib_literal_hexbinary(): assert l_hb_lowercase.toPython() == l_hb_uppercase.toPython() @pytest.mark.xfail -def test_rdflib_literal_hexbinarycanonical(): +def test_rdflib_literal_hexbinarycanonical() -> None: _logger.debug("l_hb_uppercase = %r." % l_hb_uppercase) _logger.debug("l_hbc_uppercase = %r." % l_hbc_uppercase) assert l_hb_uppercase == l_hbc_uppercase @pytest.mark.xfail -def test_rdflib_literal_topython_hexbinarycanonical(): +def test_rdflib_literal_topython_hexbinarycanonical() -> None: _logger.debug("l_hb_lowercase.toPython() = %r." % l_hb_lowercase.toPython()) _logger.debug("l_hb_uppercase.toPython() = %r." % l_hb_uppercase.toPython()) assert l_hb_uppercase.toPython() == l_hbc_uppercase.toPython() -def _query_all_value_matches(graph): +def _query_all_value_matches(graph) -> typing.Set[str]: """ Return set of all node names (as strings) that have a matching value, where "matching" is determined by the SPARQL engine's type and data coercions. @@ -280,7 +281,7 @@ def _query_all_value_matches(graph): computed.add(n_node2.toPython()) return computed -def test_graph_repeat(): +def test_graph_repeat() -> None: """ Two nodes are given the same literal value, and are found to match on literal values. """ @@ -302,7 +303,7 @@ def test_graph_repeat(): computed = _query_all_value_matches(graph) assert computed == expected -def test_graph_all_hexbinary_literals(): +def test_graph_all_hexbinary_literals() -> None: """ Two nodes with the same literal value, and another node with the uppercase of the literal hexBinary value, are found to match on literal values. """ @@ -333,7 +334,7 @@ def test_graph_all_hexbinary_literals(): assert computed == expected @pytest.mark.xfail -def test_graph_hexbinarycanonical(): +def test_graph_hexbinarycanonical() -> None: graph = rdflib.Graph() graph.add(( n_lowercase1, diff --git a/tests/src/compact.py b/tests/src/compact.py index 82e0f92..6ca055a 100644 --- a/tests/src/compact.py +++ b/tests/src/compact.py @@ -28,7 +28,7 @@ _logger = logging.getLogger(os.path.basename(__file__)) -def main(): +def main() -> None: with open(args.out_json, "w") as out_fh: doc = None with open(args.in_json, "r") as in_fh: diff --git a/tests/src/glom_graph.py b/tests/src/glom_graph.py index 0962a80..0b4e5ad 100644 --- a/tests/src/glom_graph.py +++ b/tests/src/glom_graph.py @@ -21,7 +21,7 @@ import case_utils -def main(): +def main() -> None: g = rdflib.Graph() for in_graph in args.in_graph: g.parse(in_graph) diff --git a/tests/src/isomorphic_diff.py b/tests/src/isomorphic_diff.py index e770a10..08c3b3e 100644 --- a/tests/src/isomorphic_diff.py +++ b/tests/src/isomorphic_diff.py @@ -40,7 +40,7 @@ _logger = logging.getLogger(os.path.basename(__file__)) -def main(): +def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--debug", action="store_true") parser.add_argument("in_graph_1") From 97616b4d2c2e2a9788f9e2de49e0c12ff95a4b2c Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 7 Oct 2021 12:03:22 -0400 Subject: [PATCH 06/49] Add minimal type review to case_utils An observed behavior is that mypy will not type signature analysis until one is added in the call path, e.g. designating `def main() -> None`. This patch is the minimal set of effects of adding a None return type to unit test functions. No further changes needed. One test not committed is that, before this patch, this line could be put into a function (I chose the SPARQL selector's main()) without mypy complaining: x : str = 1 After requiring that function return a type, mypy appropriately raised an error. References: * [AC-211] Add static type checking to CASE-Utilities-Python Signed-off-by: Alex Nelson --- case_utils/case_file/__init__.py | 2 +- case_utils/case_sparql_construct/__init__.py | 2 +- case_utils/case_sparql_select/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/case_utils/case_file/__init__.py b/case_utils/case_file/__init__.py index 369595d..de6d905 100644 --- a/case_utils/case_file/__init__.py +++ b/case_utils/case_file/__init__.py @@ -205,7 +205,7 @@ def create_file_node(graph, filepath, node_iri=None, node_prefix=DEFAULT_PREFIX, return n_file -def main(): +def main() -> None: import argparse parser = argparse.ArgumentParser() parser.add_argument("--base-prefix", default=DEFAULT_PREFIX) diff --git a/case_utils/case_sparql_construct/__init__.py b/case_utils/case_sparql_construct/__init__.py index dcd110b..797d625 100644 --- a/case_utils/case_sparql_construct/__init__.py +++ b/case_utils/case_sparql_construct/__init__.py @@ -27,7 +27,7 @@ _logger = logging.getLogger(os.path.basename(__file__)) -def main(): +def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("-d", "--debug", action="store_true") parser.add_argument("--disallow-empty-results", action="store_true", help="Raise error if no results are returned for query.") diff --git a/case_utils/case_sparql_select/__init__.py b/case_utils/case_sparql_select/__init__.py index e99d79b..2580b89 100644 --- a/case_utils/case_sparql_select/__init__.py +++ b/case_utils/case_sparql_select/__init__.py @@ -42,7 +42,7 @@ _logger = logging.getLogger(os.path.basename(__file__)) -def main(): +def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("-d", "--debug", action="store_true") parser.add_argument("--disallow-empty-results", action="store_true", help="Raise error if no results are returned for query.") From 43ff13072ea030e73d7f17e1ecebeefa8459f976 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 7 Oct 2021 12:23:47 -0400 Subject: [PATCH 07/49] Add type signatures to most of case_utils Some further signature work will come to case_file. References: * [AC-211] Add static type checking to CASE-Utilities-Python Signed-off-by: Alex Nelson --- case_utils/__init__.py | 6 +++++- case_utils/case_file/__init__.py | 3 ++- case_utils/case_sparql_construct/__init__.py | 3 ++- case_utils/local_uuid.py | 15 ++++++++------- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/case_utils/__init__.py b/case_utils/__init__.py index 275e665..e6bbc09 100644 --- a/case_utils/__init__.py +++ b/case_utils/__init__.py @@ -13,13 +13,17 @@ __version__ = "0.2.1" +import typing import warnings import rdflib.util # type: ignore from . import local_uuid -def guess_format(fpath, fmap=None): +def guess_format( + fpath : str, + fmap : typing.Optional[typing.Dict[str, str]] = None +) -> typing.Optional[str]: warnings.warn("The functionality in case_utils.guess_format is now upstream. Please revise your code to use rdflib.util.guess_format. The function arguments remain the same. case_utils.guess_format will be removed in case_utils 0.4.0.", DeprecationWarning) return rdflib.util.guess_format(fpath, fmap) diff --git a/case_utils/case_file/__init__.py b/case_utils/case_file/__init__.py index de6d905..395fa77 100644 --- a/case_utils/case_file/__init__.py +++ b/case_utils/case_file/__init__.py @@ -20,6 +20,7 @@ import datetime import hashlib import os +import typing import rdflib # type: ignore @@ -234,7 +235,7 @@ def main() -> None: else: output_format = args.output_format - serialize_kwargs = { + serialize_kwargs : typing.Dict[str, typing.Any] = { "format": output_format } if output_format == "json-ld": diff --git a/case_utils/case_sparql_construct/__init__.py b/case_utils/case_sparql_construct/__init__.py index 797d625..f53df06 100644 --- a/case_utils/case_sparql_construct/__init__.py +++ b/case_utils/case_sparql_construct/__init__.py @@ -20,6 +20,7 @@ import argparse import os import logging +import typing import rdflib.plugins.sparql # type: ignore @@ -74,7 +75,7 @@ def main() -> None: else: output_format = args.output_format - serialize_kwargs = { + serialize_kwargs : typing.Dict[str, typing.Any] = { "format": output_format } if output_format == "json-ld": diff --git a/case_utils/local_uuid.py b/case_utils/local_uuid.py index fea615b..c4cb5a1 100644 --- a/case_utils/local_uuid.py +++ b/case_utils/local_uuid.py @@ -21,17 +21,17 @@ import sys import uuid -USE_DEMO_UUID = False +USE_DEMO_UUID : bool = False -DEMO_UUID_COUNTER = 0 +DEMO_UUID_COUNTER : int = 0 -def configure(): +def configure() -> None: global USE_DEMO_UUID if os.getenv("DEMO_UUID_REQUESTING_NONRANDOM") == "NONRANDOM_REQUESTED": USE_DEMO_UUID = True -def demo_uuid(): +def demo_uuid() -> str: """ This function generates a repeatable UUID, drawing on non-varying elements of the environment and process call for entropy. @@ -52,16 +52,17 @@ def demo_uuid(): parts.append(str(DEMO_UUID_COUNTER)) # Component: Present working directory, replacing $HOME with '~'. - parts.append(os.getcwd().replace(os.getenv("HOME"), "~")) + env_HOME : str = os.getenv("HOME", "/nonexistent") + parts.append(os.getcwd().replace(env_HOME, "~")) # Component: Argument vector. parts.extend(sys.argv) return str(uuid.uuid5(uuid.NAMESPACE_URL, "/".join(parts))) -def local_uuid(): +def local_uuid() -> str: """ - Generate either a UUID4, or if requested via environment configuration, a non-random demo UUID. Returns a string. + Generate either a UUID4, or if requested via environment configuration, a non-random demo UUID. """ global USE_DEMO_UUID if USE_DEMO_UUID: From 8854561e57233dc6c32ce85968fc60dfa5091f3e Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 7 Oct 2021 12:46:22 -0400 Subject: [PATCH 08/49] Use warnings.warn instead of unused variable _logger After adding a type signature to create_file_node(), mypy complained that _logger was undefined. That was correct, as I'd copied and pasted that section from DFXML's walk_to_dfxml.py. Another issue around a multi-value-types dictionary will require a bigger patch before the type signature gets committed. References: * [AC-211] Add static type checking to CASE-Utilities-Python Signed-off-by: Alex Nelson --- case_utils/case_file/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/case_utils/case_file/__init__.py b/case_utils/case_file/__init__.py index 395fa77..d373858 100644 --- a/case_utils/case_file/__init__.py +++ b/case_utils/case_file/__init__.py @@ -21,6 +21,7 @@ import hashlib import os import typing +import warnings import rdflib # type: ignore @@ -166,7 +167,7 @@ def create_file_node(graph, filepath, node_iri=None, node_prefix=DEFAULT_PREFIX, raise ValueError("Failed to confirm hashes of file %r." % filepath) if successful_hashdict["filesize"] != file_stat.st_size: # TODO - Discuss with AC whether this should be something stronger, like an assertion error. - _logger.warning( + warnings.warn( "Inode file size and hashed file sizes disagree: %d vs. %d.", file_stat.st_size, successful_hashdict["filesize"] From 7fb54ef3d535bd3f709b9e2d284b7257e838990a Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 7 Oct 2021 12:50:41 -0400 Subject: [PATCH 09/49] Add type signatures to case_utils.case_file.create_file_node This uses an alternative light-class definition style more focused on type signatures. The example origin is cited inline. References: * [AC-211] Add static type checking to CASE-Utilities-Python Signed-off-by: Alex Nelson --- case_utils/case_file/__init__.py | 55 ++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/case_utils/case_file/__init__.py b/case_utils/case_file/__init__.py index d373858..a25481d 100644 --- a/case_utils/case_file/__init__.py +++ b/case_utils/case_file/__init__.py @@ -36,7 +36,24 @@ NS_UCO_VOCABULARY = rdflib.Namespace("https://unifiedcyberontology.org/ontology/uco/vocabulary#") NS_XSD = rdflib.XSD -def create_file_node(graph, filepath, node_iri=None, node_prefix=DEFAULT_PREFIX, disable_hashes=False, disable_mtime=False): +# Shortcut syntax for defining an immutable named tuple is noted here: +# https://docs.python.org/3/library/typing.html#typing.NamedTuple +# via the "See also" box here: https://docs.python.org/3/library/collections.html#collections.namedtuple +class HashDict(typing.NamedTuple): + filesize : int + md5 : str + sha1 : str + sha256 : str + sha512 : str + +def create_file_node( + graph : rdflib.Graph, + filepath : str, + node_iri : typing.Optional[str] = None, + node_prefix : str = DEFAULT_PREFIX, + disable_hashes : bool = False, + disable_mtime : bool = False +) -> rdflib.URIRef: r""" This function characterizes the file at filepath. @@ -121,10 +138,10 @@ def create_file_node(graph, filepath, node_iri=None, node_prefix=DEFAULT_PREFIX, )) # Compute hashes until they are re-computed and match once. (This is a lesson learned from working with a NAS that had a subtly faulty network cable.) - successful_hashdict = None - last_hashdict = dict() + + successful_hashdict : typing.Optional[HashDict] = None + last_hashdict : typing.Optional[HashDict] = None for attempt_no in [0, 1, 2, 3]: - current_hashdict = dict() # Hash file's contents. # This hashing logic was partially copied from DFXML's walk_to_dfxml.py. md5obj = hashlib.md5() @@ -132,9 +149,9 @@ def create_file_node(graph, filepath, node_iri=None, node_prefix=DEFAULT_PREFIX, sha256obj = hashlib.sha256() sha512obj = hashlib.sha512() stashed_error = None + byte_tally = 0 with open(filepath, "rb") as in_fh: chunk_size = 2**22 - byte_tally = 0 while True: buf = b"" try: @@ -149,13 +166,15 @@ def create_file_node(graph, filepath, node_iri=None, node_prefix=DEFAULT_PREFIX, sha1obj.update(buf) sha256obj.update(buf) sha512obj.update(buf) - current_hashdict["filesize"] = byte_tally if not stashed_error is None: raise stashed_error - current_hashdict["md5"] = md5obj.hexdigest() - current_hashdict["sha1"] = sha1obj.hexdigest() - current_hashdict["sha256"] = sha256obj.hexdigest() - current_hashdict["sha512"] = sha512obj.hexdigest() + current_hashdict = HashDict( + byte_tally, + md5obj.hexdigest(), + sha1obj.hexdigest(), + sha256obj.hexdigest(), + sha512obj.hexdigest() + ) if last_hashdict == current_hashdict: successful_hashdict = current_hashdict break @@ -165,22 +184,23 @@ def create_file_node(graph, filepath, node_iri=None, node_prefix=DEFAULT_PREFIX, del current_hashdict if successful_hashdict is None: raise ValueError("Failed to confirm hashes of file %r." % filepath) - if successful_hashdict["filesize"] != file_stat.st_size: + if successful_hashdict.filesize != file_stat.st_size: # TODO - Discuss with AC whether this should be something stronger, like an assertion error. warnings.warn( - "Inode file size and hashed file sizes disagree: %d vs. %d.", - file_stat.st_size, - successful_hashdict["filesize"] + "Inode file size and hashed file sizes disagree: %d vs. %d." % ( + file_stat.st_size, + successful_hashdict.filesize + ) ) # TODO - Discuss whether this property should be recorded even if hashes are not attempted. graph.add(( n_contentdata_facet, NS_UCO_OBSERVABLE.sizeInBytes, - rdflib.Literal(successful_hashdict["filesize"]) + rdflib.Literal(successful_hashdict.filesize) )) # Add confirmed hashes into graph. - for key in successful_hashdict: + for key in successful_hashdict._fields: if not key in ("md5", "sha1", "sha256", "sha512"): continue n_hash = rdflib.BNode() @@ -199,10 +219,11 @@ def create_file_node(graph, filepath, node_iri=None, node_prefix=DEFAULT_PREFIX, NS_UCO_TYPES.hashMethod, rdflib.Literal(key.upper(), datatype=NS_UCO_VOCABULARY.HashNameVocab) )) + hash_value = getattr(successful_hashdict, key) graph.add(( n_hash, NS_UCO_TYPES.hashValue, - rdflib.Literal(successful_hashdict[key].upper(), datatype=NS_XSD.hexBinary) + rdflib.Literal(hash_value.upper(), datatype=NS_XSD.hexBinary) )) return n_file From 42000c982e300cad0daf58b8234b8a9b0a968adf Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 7 Oct 2021 13:00:26 -0400 Subject: [PATCH 10/49] Add type signatures required by mypy --strict One more `# type: ignore` was added while awaiting rdflib PR #1407. These were all identified by adding the `--strict` flag to mypy for a run. I will leave it up for future discussion whether to use that flag, especially to wait for PR 1407 and to see if too much work would be induced versus runtime safety improvements. References: * [AC-211] Add static type checking to CASE-Utilities-Python * https://github.com/RDFLib/rdflib/pull/1407 Signed-off-by: Alex Nelson --- case_utils/__init__.py | 2 +- tests/case_file/test_case_file.py | 11 ++++++++--- .../test_case_sparql_construct.py | 4 +++- tests/hexbinary/test_hexbinary.py | 4 +++- tests/src/compact.py | 5 ++++- tests/src/isomorphic_diff.py | 5 ++++- 6 files changed, 23 insertions(+), 8 deletions(-) diff --git a/case_utils/__init__.py b/case_utils/__init__.py index e6bbc09..678e6e7 100644 --- a/case_utils/__init__.py +++ b/case_utils/__init__.py @@ -26,4 +26,4 @@ def guess_format( ) -> typing.Optional[str]: warnings.warn("The functionality in case_utils.guess_format is now upstream. Please revise your code to use rdflib.util.guess_format. The function arguments remain the same. case_utils.guess_format will be removed in case_utils 0.4.0.", DeprecationWarning) - return rdflib.util.guess_format(fpath, fmap) + return rdflib.util.guess_format(fpath, fmap) # type: ignore diff --git a/tests/case_file/test_case_file.py b/tests/case_file/test_case_file.py index 29cd749..acbad79 100644 --- a/tests/case_file/test_case_file.py +++ b/tests/case_file/test_case_file.py @@ -38,7 +38,7 @@ SRCDIR = os.path.dirname(__file__) def load_graph( - filename + filename : str ) -> rdflib.Graph: in_graph = rdflib.Graph() in_graph.parse(filename) @@ -52,7 +52,9 @@ def graph_case_file() -> rdflib.Graph: def graph_case_file_disable_hashes() -> rdflib.Graph: return load_graph(os.path.join(SRCDIR, "sample.txt-disable_hashes.ttl")) -def test_confirm_hashes(graph_case_file) -> None: +def test_confirm_hashes( + graph_case_file : rdflib.Graph +) -> None: expected = { "MD5": "098F6BCD4621D373CADE4E832627B4F6", "SHA1": "A94A8FE5CCB19BA61C4C0873D391E987982FBBD3", @@ -93,7 +95,10 @@ def test_confirm_hashes(graph_case_file) -> None: assert expected == computed -def test_confirm_mtime(graph_case_file, graph_case_file_disable_hashes) -> None: +def test_confirm_mtime( + graph_case_file : rdflib.Graph, + graph_case_file_disable_hashes : rdflib.Graph +) -> None: query_confirm_mtime = """ SELECT ?nFile WHERE { diff --git a/tests/case_sparql_construct/test_case_sparql_construct.py b/tests/case_sparql_construct/test_case_sparql_construct.py index eec5216..1d919c1 100644 --- a/tests/case_sparql_construct/test_case_sparql_construct.py +++ b/tests/case_sparql_construct/test_case_sparql_construct.py @@ -17,7 +17,9 @@ import case_utils -def _test_templates_with_blank_nodes_result(filename) -> None: +def _test_templates_with_blank_nodes_result( + filename : str +) -> None: ground_truth_positive = { ("Alice", "Hacker"), ("Bob", "Hacker") diff --git a/tests/hexbinary/test_hexbinary.py b/tests/hexbinary/test_hexbinary.py index d2b96d5..31188de 100644 --- a/tests/hexbinary/test_hexbinary.py +++ b/tests/hexbinary/test_hexbinary.py @@ -263,7 +263,9 @@ def test_rdflib_literal_topython_hexbinarycanonical() -> None: assert l_hb_uppercase.toPython() == l_hbc_uppercase.toPython() -def _query_all_value_matches(graph) -> typing.Set[str]: +def _query_all_value_matches( + graph : rdflib.Graph +) -> typing.Set[str]: """ Return set of all node names (as strings) that have a matching value, where "matching" is determined by the SPARQL engine's type and data coercions. diff --git a/tests/src/compact.py b/tests/src/compact.py index 6ca055a..f314004 100644 --- a/tests/src/compact.py +++ b/tests/src/compact.py @@ -23,6 +23,7 @@ import logging import os import json +import typing import pyld # type: ignore @@ -38,7 +39,9 @@ def main() -> None: # Grab the first occurrence of every key. total_context = dict() - def _accrue_local_context(doc_object): + def _accrue_local_context( + doc_object : typing.Dict[str, typing.Any] + ) -> None: local_context = doc_object.get("@context", dict()) for key in local_context.keys(): if not key in total_context: diff --git a/tests/src/isomorphic_diff.py b/tests/src/isomorphic_diff.py index 08c3b3e..7d0c7c7 100644 --- a/tests/src/isomorphic_diff.py +++ b/tests/src/isomorphic_diff.py @@ -70,7 +70,10 @@ def main() -> None: if i1 == i2: sys.exit(0) - def _report(diff_symbol, graph): + def _report( + diff_symbol : str, + graph : rdflib.Graph + ) -> None: """ This function copied in spirit from: https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html#module-rdflib.compare From 5edb610484530e0879b3c6c2b4d4b7552446d4c8 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 27 Oct 2021 14:50:38 -0400 Subject: [PATCH 11/49] Update string type from graph.serialize The type has changed from bytes() to str() since the isomorphic diff sample file was originally written. Signed-off-by: Alex Nelson --- tests/src/isomorphic_diff.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/isomorphic_diff.py b/tests/src/isomorphic_diff.py index 7d0c7c7..0a2c0ce 100644 --- a/tests/src/isomorphic_diff.py +++ b/tests/src/isomorphic_diff.py @@ -79,9 +79,9 @@ def _report( https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html#module-rdflib.compare """ for line in sorted(graph.serialize(format="nt").splitlines()): - if line.strip() == b"": + if line.strip() == "": continue - _logger.debug("%s %s", diff_symbol, line.decode("ascii")) + _logger.debug("%s %s", diff_symbol, line) #_report("1", g1) #_report("2", g2) From c7439acd03a6ab3dc0d064817558332fbfe0c5c1 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 27 Oct 2021 15:28:20 -0400 Subject: [PATCH 12/49] Add wheel package to tests venv construction This addresses "Legacy mode" notices when installing local packages. References: * [AC-195] Use Python venv instead of virtualenv to build virtual environments for CI Signed-off-by: Alex Nelson --- tests/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/Makefile b/tests/Makefile index 2d09c4b..bb4eaf6 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -48,7 +48,8 @@ all: \ && pip install \ --upgrade \ pip \ - setuptools + setuptools \ + wheel source venv/bin/activate \ && pip install \ --requirement requirements.txt From b5a04aee4e69359805e6839398693df2060313d3 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 27 Oct 2021 15:32:24 -0400 Subject: [PATCH 13/49] Require rdflib >= 6.0.2 This lets us remove the restriction on `pyparsing`. References: * https://github.com/RDFLib/rdflib/issues/1370 Signed-off-by: Alex Nelson --- setup.cfg | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/setup.cfg b/setup.cfg index 0f51d10..743d984 100644 --- a/setup.cfg +++ b/setup.cfg @@ -16,12 +16,9 @@ classifiers = [options] include_package_data = true -# TODO The constraint on pyparsing can be removed when rdflib Issue #1190 is resolved. -# https://github.com/RDFLib/rdflib/issues/1190 install_requires = pandas - pyparsing < 3.0.0 - rdflib >= 6.0.1 + rdflib >= 6.0.2 requests tabulate packages = find: From 8025299a6f79b4ea067959dd347d499a1a27207b Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 27 Oct 2021 15:34:57 -0400 Subject: [PATCH 14/49] Remove tests around Python 3.6 detection rdflib 6.0.0 moved us to Python >= 3.7, so the <3.7 tests are now moot. Signed-off-by: Alex Nelson --- setup.cfg | 1 - tests/Makefile | 16 +++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/setup.cfg b/setup.cfg index 743d984..a99193f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -28,7 +28,6 @@ python_requires = >=3.7 console_scripts = case_file = case_utils.case_file:main case_sparql_construct = case_utils.case_sparql_construct:main - # Note that numpy (pandas dependency, and pandas is dependency of case_sparql_select) is only supported in Python >= 3.7. case_sparql_select = case_utils.case_sparql_select:main [options.package_data] diff --git a/tests/Makefile b/tests/Makefile index bb4eaf6..3676436 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -72,11 +72,8 @@ all-case_sparql_construct: \ all-case_sparql_select: \ .venv.done.log - # Only descend if python>=3.7, due to pandas dependency unsatisfiable in 3.6.x. - # Boolean explanation: sys.exit(False) has exit status 0. - venv/bin/python3 -c 'import sys ; sys.exit(not (sys.version_info < (3, 7)))' \ - || $(MAKE) \ - --directory case_sparql_select + $(MAKE) \ + --directory case_sparql_select # These check calls are provided in preferred run-order. check: \ @@ -106,12 +103,9 @@ check-case_sparql_construct: \ check-case_sparql_select: \ .venv.done.log - # Only descend if python>=3.7, due to pandas dependency unsatisfiable in 3.6.x. - # Boolean explanation: sys.exit(False) has exit status 0. - venv/bin/python3 -c 'import sys ; sys.exit(not (sys.version_info < (3, 7)))' \ - || $(MAKE) \ - --directory case_sparql_select \ - check + $(MAKE) \ + --directory case_sparql_select \ + check check-isomorphic_diff: \ .venv.done.log From 705dc77c29399ba490510f555ceb9fd64d85399e Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 27 Oct 2021 15:56:38 -0400 Subject: [PATCH 15/49] Align test directories with /case_utils structure A follow-on patch will regenerate files that will have updated UUIDs. Signed-off-by: Alex Nelson --- tests/Makefile | 63 +++----------- tests/case_utils/Makefile | 86 +++++++++++++++++++ tests/{ => case_utils}/case_file/.gitignore | 0 tests/{ => case_utils}/case_file/Makefile | 2 +- tests/{ => case_utils}/case_file/kb.json | 0 tests/{ => case_utils}/case_file/kb.ttl | 0 .../case_file/sample.txt-disable_hashes.ttl | 0 .../case_file/sample.txt-nocompact.json | 0 .../case_file/sample.txt.json | 0 .../{ => case_utils}/case_file/sample.txt.ttl | 0 .../{ => case_utils}/case_file/sample_txt.py | 0 .../case_file/test_case_file.py | 0 .../case_file/undefined_vocabulary.txt | 0 .../case_sparql_construct/.gitignore | 0 .../case_sparql_construct/Makefile | 2 +- .../case_sparql_construct/README.md | 0 .../case_sparql_construct/input-1.sparql | 0 .../case_sparql_construct/input-2.ttl | 0 .../case_sparql_construct/input-3.json | 0 .../test_case_sparql_construct.py | 0 .../case_sparql_select/.check-output.html | 0 .../case_sparql_select/.check-output.md | 0 .../case_sparql_select/.gitignore | 0 .../case_sparql_select/Makefile | 2 +- .../case_sparql_select/input-1.sparql | 0 .../case_sparql_select/input-2.ttl | 0 .../case_sparql_select/input-3.json | 0 27 files changed, 100 insertions(+), 55 deletions(-) create mode 100644 tests/case_utils/Makefile rename tests/{ => case_utils}/case_file/.gitignore (100%) rename tests/{ => case_utils}/case_file/Makefile (99%) rename tests/{ => case_utils}/case_file/kb.json (100%) rename tests/{ => case_utils}/case_file/kb.ttl (100%) rename tests/{ => case_utils}/case_file/sample.txt-disable_hashes.ttl (100%) rename tests/{ => case_utils}/case_file/sample.txt-nocompact.json (100%) rename tests/{ => case_utils}/case_file/sample.txt.json (100%) rename tests/{ => case_utils}/case_file/sample.txt.ttl (100%) rename tests/{ => case_utils}/case_file/sample_txt.py (100%) rename tests/{ => case_utils}/case_file/test_case_file.py (100%) rename tests/{ => case_utils}/case_file/undefined_vocabulary.txt (100%) rename tests/{ => case_utils}/case_sparql_construct/.gitignore (100%) rename tests/{ => case_utils}/case_sparql_construct/Makefile (96%) rename tests/{ => case_utils}/case_sparql_construct/README.md (100%) rename tests/{ => case_utils}/case_sparql_construct/input-1.sparql (100%) rename tests/{ => case_utils}/case_sparql_construct/input-2.ttl (100%) rename tests/{ => case_utils}/case_sparql_construct/input-3.json (100%) rename tests/{ => case_utils}/case_sparql_construct/test_case_sparql_construct.py (100%) rename tests/{ => case_utils}/case_sparql_select/.check-output.html (100%) rename tests/{ => case_utils}/case_sparql_select/.check-output.md (100%) rename tests/{ => case_utils}/case_sparql_select/.gitignore (100%) rename tests/{ => case_utils}/case_sparql_select/Makefile (96%) rename tests/{ => case_utils}/case_sparql_select/input-1.sparql (100%) rename tests/{ => case_utils}/case_sparql_select/input-2.ttl (100%) rename tests/{ => case_utils}/case_sparql_select/input-3.json (100%) diff --git a/tests/Makefile b/tests/Makefile index 3676436..340aca2 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -15,22 +15,14 @@ SHELL := /bin/bash top_srcdir := $(shell cd .. ; pwd) -srcdir := $(shell pwd) - PYTHON3 ?= $(shell which python3.9 2>/dev/null || which python3.8 2>/dev/null || which python3.7 2>/dev/null || which python3.6 2>/dev/null || which python3) all: \ - all-case_file \ - all-case_sparql_construct \ - all-case_sparql_select + all-case_utils .PHONY: \ - all-case_file \ - all-case_sparql_construct \ - all-case_sparql_select \ - check-case_file \ - check-case_sparql_construct \ - check-case_sparql_select \ + all-case_utils \ + check-case_utils \ check-isomorphic_diff \ check-mypy \ download @@ -60,51 +52,26 @@ all: \ . touch $@ -all-case_file: \ - .venv.done.log - $(MAKE) \ - --directory case_file - -all-case_sparql_construct: \ - .venv.done.log - $(MAKE) \ - --directory case_sparql_construct -all-case_sparql_select: \ +all-case_utils: \ .venv.done.log $(MAKE) \ - --directory case_sparql_select + --directory case_utils # These check calls are provided in preferred run-order. check: \ - check-isomorphic_diff \ check-mypy \ - check-case_file \ - check-case_sparql_construct \ - check-case_sparql_select + check-isomorphic_diff \ + check-case_utils source venv/bin/activate \ && pytest \ - --ignore case_file \ - --ignore case_sparql_construct \ - --ignore case_sparql_select \ + --ignore case_utils \ --log-level=DEBUG -check-case_file: \ - .venv.done.log - $(MAKE) \ - --directory case_file \ - check - -check-case_sparql_construct: \ - .venv.done.log - $(MAKE) \ - --directory case_sparql_construct \ - check - -check-case_sparql_select: \ +check-case_utils: \ .venv.done.log $(MAKE) \ - --directory case_sparql_select \ + --directory case_utils \ check check-isomorphic_diff: \ @@ -119,21 +86,13 @@ check-mypy: \ source venv/bin/activate \ && mypy \ $(top_srcdir)/case_utils \ - case_file \ - case_sparql_construct \ case_utils \ hexbinary \ src clean: @$(MAKE) \ - --directory case_sparql_select \ - clean - @$(MAKE) \ - --directory case_sparql_construct \ - clean - @$(MAKE) \ - --directory case_file \ + --directory case_utils \ clean @rm -f \ .venv.done.log diff --git a/tests/case_utils/Makefile b/tests/case_utils/Makefile new file mode 100644 index 0000000..14ac4be --- /dev/null +++ b/tests/case_utils/Makefile @@ -0,0 +1,86 @@ +#!/usr/bin/make -f + +# 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) + +tests_srcdir := $(top_srcdir)/tests + +all: \ + all-case_file \ + all-case_sparql_construct \ + all-case_sparql_select + +.PHONY: \ + all-case_file \ + all-case_sparql_construct \ + all-case_sparql_select \ + check-case_file \ + check-case_sparql_construct \ + check-case_sparql_select + +all-case_file: \ + $(tests_srcdir)/.venv.done.log + $(MAKE) \ + --directory case_file + +all-case_sparql_construct: \ + $(tests_srcdir)/.venv.done.log + $(MAKE) \ + --directory case_sparql_construct + +all-case_sparql_select: \ + $(tests_srcdir)/.venv.done.log + $(MAKE) \ + --directory case_sparql_select + +check: \ + check-case_file \ + check-case_sparql_construct \ + check-case_sparql_select + source $(tests_srcdir)/venv/bin/activate \ + && pytest \ + --ignore case_file \ + --ignore case_sparql_construct \ + --ignore case_sparql_select \ + --log-level=DEBUG + +check-case_file: \ + $(tests_srcdir)/.venv.done.log + $(MAKE) \ + --directory case_file \ + check + +check-case_sparql_construct: \ + $(tests_srcdir)/.venv.done.log + $(MAKE) \ + --directory case_sparql_construct \ + check + +check-case_sparql_select: \ + $(tests_srcdir)/.venv.done.log + $(MAKE) \ + --directory case_sparql_select \ + check + +clean: + @$(MAKE) \ + --directory case_sparql_select \ + clean + @$(MAKE) \ + --directory case_sparql_construct \ + clean + @$(MAKE) \ + --directory case_file \ + clean diff --git a/tests/case_file/.gitignore b/tests/case_utils/case_file/.gitignore similarity index 100% rename from tests/case_file/.gitignore rename to tests/case_utils/case_file/.gitignore diff --git a/tests/case_file/Makefile b/tests/case_utils/case_file/Makefile similarity index 99% rename from tests/case_file/Makefile rename to tests/case_utils/case_file/Makefile index 0f91a02..ecf4508 100644 --- a/tests/case_file/Makefile +++ b/tests/case_utils/case_file/Makefile @@ -13,7 +13,7 @@ SHELL := /bin/bash -top_srcdir := $(shell cd ../.. ; pwd) +top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests diff --git a/tests/case_file/kb.json b/tests/case_utils/case_file/kb.json similarity index 100% rename from tests/case_file/kb.json rename to tests/case_utils/case_file/kb.json diff --git a/tests/case_file/kb.ttl b/tests/case_utils/case_file/kb.ttl similarity index 100% rename from tests/case_file/kb.ttl rename to tests/case_utils/case_file/kb.ttl diff --git a/tests/case_file/sample.txt-disable_hashes.ttl b/tests/case_utils/case_file/sample.txt-disable_hashes.ttl similarity index 100% rename from tests/case_file/sample.txt-disable_hashes.ttl rename to tests/case_utils/case_file/sample.txt-disable_hashes.ttl diff --git a/tests/case_file/sample.txt-nocompact.json b/tests/case_utils/case_file/sample.txt-nocompact.json similarity index 100% rename from tests/case_file/sample.txt-nocompact.json rename to tests/case_utils/case_file/sample.txt-nocompact.json diff --git a/tests/case_file/sample.txt.json b/tests/case_utils/case_file/sample.txt.json similarity index 100% rename from tests/case_file/sample.txt.json rename to tests/case_utils/case_file/sample.txt.json diff --git a/tests/case_file/sample.txt.ttl b/tests/case_utils/case_file/sample.txt.ttl similarity index 100% rename from tests/case_file/sample.txt.ttl rename to tests/case_utils/case_file/sample.txt.ttl diff --git a/tests/case_file/sample_txt.py b/tests/case_utils/case_file/sample_txt.py similarity index 100% rename from tests/case_file/sample_txt.py rename to tests/case_utils/case_file/sample_txt.py diff --git a/tests/case_file/test_case_file.py b/tests/case_utils/case_file/test_case_file.py similarity index 100% rename from tests/case_file/test_case_file.py rename to tests/case_utils/case_file/test_case_file.py diff --git a/tests/case_file/undefined_vocabulary.txt b/tests/case_utils/case_file/undefined_vocabulary.txt similarity index 100% rename from tests/case_file/undefined_vocabulary.txt rename to tests/case_utils/case_file/undefined_vocabulary.txt diff --git a/tests/case_sparql_construct/.gitignore b/tests/case_utils/case_sparql_construct/.gitignore similarity index 100% rename from tests/case_sparql_construct/.gitignore rename to tests/case_utils/case_sparql_construct/.gitignore diff --git a/tests/case_sparql_construct/Makefile b/tests/case_utils/case_sparql_construct/Makefile similarity index 96% rename from tests/case_sparql_construct/Makefile rename to tests/case_utils/case_sparql_construct/Makefile index 55343fc..d0dabb3 100644 --- a/tests/case_sparql_construct/Makefile +++ b/tests/case_utils/case_sparql_construct/Makefile @@ -13,7 +13,7 @@ SHELL := /bin/bash -top_srcdir := $(shell cd ../.. ; pwd) +top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests diff --git a/tests/case_sparql_construct/README.md b/tests/case_utils/case_sparql_construct/README.md similarity index 100% rename from tests/case_sparql_construct/README.md rename to tests/case_utils/case_sparql_construct/README.md diff --git a/tests/case_sparql_construct/input-1.sparql b/tests/case_utils/case_sparql_construct/input-1.sparql similarity index 100% rename from tests/case_sparql_construct/input-1.sparql rename to tests/case_utils/case_sparql_construct/input-1.sparql diff --git a/tests/case_sparql_construct/input-2.ttl b/tests/case_utils/case_sparql_construct/input-2.ttl similarity index 100% rename from tests/case_sparql_construct/input-2.ttl rename to tests/case_utils/case_sparql_construct/input-2.ttl diff --git a/tests/case_sparql_construct/input-3.json b/tests/case_utils/case_sparql_construct/input-3.json similarity index 100% rename from tests/case_sparql_construct/input-3.json rename to tests/case_utils/case_sparql_construct/input-3.json diff --git a/tests/case_sparql_construct/test_case_sparql_construct.py b/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py similarity index 100% rename from tests/case_sparql_construct/test_case_sparql_construct.py rename to tests/case_utils/case_sparql_construct/test_case_sparql_construct.py diff --git a/tests/case_sparql_select/.check-output.html b/tests/case_utils/case_sparql_select/.check-output.html similarity index 100% rename from tests/case_sparql_select/.check-output.html rename to tests/case_utils/case_sparql_select/.check-output.html diff --git a/tests/case_sparql_select/.check-output.md b/tests/case_utils/case_sparql_select/.check-output.md similarity index 100% rename from tests/case_sparql_select/.check-output.md rename to tests/case_utils/case_sparql_select/.check-output.md diff --git a/tests/case_sparql_select/.gitignore b/tests/case_utils/case_sparql_select/.gitignore similarity index 100% rename from tests/case_sparql_select/.gitignore rename to tests/case_utils/case_sparql_select/.gitignore diff --git a/tests/case_sparql_select/Makefile b/tests/case_utils/case_sparql_select/Makefile similarity index 96% rename from tests/case_sparql_select/Makefile rename to tests/case_utils/case_sparql_select/Makefile index f88732d..6070739 100644 --- a/tests/case_sparql_select/Makefile +++ b/tests/case_utils/case_sparql_select/Makefile @@ -13,7 +13,7 @@ SHELL := /bin/bash -top_srcdir := $(shell cd ../.. ; pwd) +top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests diff --git a/tests/case_sparql_select/input-1.sparql b/tests/case_utils/case_sparql_select/input-1.sparql similarity index 100% rename from tests/case_sparql_select/input-1.sparql rename to tests/case_utils/case_sparql_select/input-1.sparql diff --git a/tests/case_sparql_select/input-2.ttl b/tests/case_utils/case_sparql_select/input-2.ttl similarity index 100% rename from tests/case_sparql_select/input-2.ttl rename to tests/case_utils/case_sparql_select/input-2.ttl diff --git a/tests/case_sparql_select/input-3.json b/tests/case_utils/case_sparql_select/input-3.json similarity index 100% rename from tests/case_sparql_select/input-3.json rename to tests/case_utils/case_sparql_select/input-3.json From 444ae1f53d68697b661312c3c8402b44df485fd0 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 27 Oct 2021 16:04:42 -0400 Subject: [PATCH 16/49] Regenerate Make-managed files UUIDs were expected to change, as present working directory is part of the hashed data. Signed-off-by: Alex Nelson --- tests/case_utils/case_file/kb.json | 4 +- tests/case_utils/case_file/kb.ttl | 4 +- .../case_file/sample.txt-disable_hashes.ttl | 2 +- .../case_file/sample.txt-nocompact.json | 62 +++++++++---------- tests/case_utils/case_file/sample.txt.json | 58 ++++++++--------- tests/case_utils/case_file/sample.txt.ttl | 2 +- 6 files changed, 66 insertions(+), 66 deletions(-) diff --git a/tests/case_utils/case_file/kb.json b/tests/case_utils/case_file/kb.json index a2d427a..5f3863b 100644 --- a/tests/case_utils/case_file/kb.json +++ b/tests/case_utils/case_file/kb.json @@ -9,7 +9,7 @@ }, "@graph": [ { - "@id": "kb:file-16d49634-ba5d-5f46-ab4e-7a577a4e096d", + "@id": "kb:file-69751792-9d04-5f5f-8791-99ca3729cd3c", "@type": "uco-observable:ObservableObject", "uco-core:hasFacet": { "@type": "uco-observable:FileFacet", @@ -25,7 +25,7 @@ } }, { - "@id": "kb:file-57400969-69d0-5d5d-95c4-9dd7de330d3d", + "@id": "kb:file-9477a6eb-3a94-590b-b51e-6ce6892f0941", "@type": "uco-observable:ObservableObject", "uco-core:hasFacet": [ { diff --git a/tests/case_utils/case_file/kb.ttl b/tests/case_utils/case_file/kb.ttl index 4e0b8a8..0fb50ca 100644 --- a/tests/case_utils/case_file/kb.ttl +++ b/tests/case_utils/case_file/kb.ttl @@ -8,7 +8,7 @@ @prefix uco-vocabulary: . @prefix xsd: . -kb:file-16d49634-ba5d-5f46-ab4e-7a577a4e096d +kb:file-69751792-9d04-5f5f-8791-99ca3729cd3c a uco-observable:ObservableObject ; uco-core:hasFacet [ a uco-observable:FileFacet ; @@ -18,7 +18,7 @@ kb:file-16d49634-ba5d-5f46-ab4e-7a577a4e096d ] ; . -kb:file-57400969-69d0-5d5d-95c4-9dd7de330d3d +kb:file-9477a6eb-3a94-590b-b51e-6ce6892f0941 a uco-observable:ObservableObject ; uco-core:hasFacet [ diff --git a/tests/case_utils/case_file/sample.txt-disable_hashes.ttl b/tests/case_utils/case_file/sample.txt-disable_hashes.ttl index 4462c33..0bc4d82 100644 --- a/tests/case_utils/case_file/sample.txt-disable_hashes.ttl +++ b/tests/case_utils/case_file/sample.txt-disable_hashes.ttl @@ -6,7 +6,7 @@ @prefix uco-observable: . @prefix xsd: . -kb:file-16d49634-ba5d-5f46-ab4e-7a577a4e096d +kb:file-69751792-9d04-5f5f-8791-99ca3729cd3c a uco-observable:ObservableObject ; uco-core:hasFacet [ a uco-observable:FileFacet ; diff --git a/tests/case_utils/case_file/sample.txt-nocompact.json b/tests/case_utils/case_file/sample.txt-nocompact.json index 563291d..6d2569b 100644 --- a/tests/case_utils/case_file/sample.txt-nocompact.json +++ b/tests/case_utils/case_file/sample.txt-nocompact.json @@ -12,93 +12,93 @@ }, "@graph": [ { - "@id": "http://example.org/kb/file-72a7af43-7798-5794-88fd-49c0d3c76ccb", + "@id": "http://example.org/kb/file-4216a9f3-45fc-55aa-8e48-a9f828173625", "@type": "https://unifiedcyberontology.org/ontology/uco/observable#ObservableObject", "https://unifiedcyberontology.org/ontology/uco/core#hasFacet": [ { - "@id": "_:N9465521b80bf49c586f914908dfc46a2" + "@id": "_:Ncbd74ec540fa42b09802cdf033ec0e86" }, { - "@id": "_:Ne7887bd0a239424bb588bed06ec4fc77" + "@id": "_:N1b091168b6e746ca8ffef67ba546f52c" } ] }, { - "@id": "_:N9465521b80bf49c586f914908dfc46a2", + "@id": "_:Ncbd74ec540fa42b09802cdf033ec0e86", + "@type": "https://unifiedcyberontology.org/ontology/uco/observable#FileFacet", + "https://unifiedcyberontology.org/ontology/uco/observable#fileName": "sample.txt", + "https://unifiedcyberontology.org/ontology/uco/observable#modifiedTime": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2010-01-02T03:04:56+00:00" + }, + "https://unifiedcyberontology.org/ontology/uco/observable#sizeInBytes": 4 + }, + { + "@id": "_:N1b091168b6e746ca8ffef67ba546f52c", "@type": "https://unifiedcyberontology.org/ontology/uco/observable#ContentDataFacet", "https://unifiedcyberontology.org/ontology/uco/observable#hash": [ { - "@id": "_:Nad6171b4933a4a84b83faa5d48fd4ddb" + "@id": "_:Nf0f6ff73c49045ffa53e2fc83249d20b" }, { - "@id": "_:N1ee7a053f4bd466e8fca1105b8392292" + "@id": "_:Na2470e1f29914026a1690b0e9386cc1f" }, { - "@id": "_:N098fa95f7ef2409b864a9fb6b291ab08" + "@id": "_:Nd8473ff30e87456d8dcd034729ba27ed" }, { - "@id": "_:Na99d1f2a83814ac491c9b02662ea8587" + "@id": "_:Ncaa10f1e5cf84d8286f1d1c536b9fa06" } ], "https://unifiedcyberontology.org/ontology/uco/observable#sizeInBytes": 4 }, { - "@id": "_:Nad6171b4933a4a84b83faa5d48fd4ddb", + "@id": "_:Nf0f6ff73c49045ffa53e2fc83249d20b", "@type": "https://unifiedcyberontology.org/ontology/uco/types#Hash", "https://unifiedcyberontology.org/ontology/uco/types#hashMethod": { "@type": "https://unifiedcyberontology.org/ontology/uco/vocabulary#HashNameVocab", - "@value": "SHA512" + "@value": "MD5" }, "https://unifiedcyberontology.org/ontology/uco/types#hashValue": { "@type": "http://www.w3.org/2001/XMLSchema#hexBinary", - "@value": "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff" + "@value": "098f6bcd4621d373cade4e832627b4f6" } }, { - "@id": "_:N1ee7a053f4bd466e8fca1105b8392292", + "@id": "_:Na2470e1f29914026a1690b0e9386cc1f", "@type": "https://unifiedcyberontology.org/ontology/uco/types#Hash", "https://unifiedcyberontology.org/ontology/uco/types#hashMethod": { "@type": "https://unifiedcyberontology.org/ontology/uco/vocabulary#HashNameVocab", - "@value": "SHA256" + "@value": "SHA1" }, "https://unifiedcyberontology.org/ontology/uco/types#hashValue": { "@type": "http://www.w3.org/2001/XMLSchema#hexBinary", - "@value": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" + "@value": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3" } }, { - "@id": "_:N098fa95f7ef2409b864a9fb6b291ab08", + "@id": "_:Nd8473ff30e87456d8dcd034729ba27ed", "@type": "https://unifiedcyberontology.org/ontology/uco/types#Hash", "https://unifiedcyberontology.org/ontology/uco/types#hashMethod": { "@type": "https://unifiedcyberontology.org/ontology/uco/vocabulary#HashNameVocab", - "@value": "SHA1" + "@value": "SHA256" }, "https://unifiedcyberontology.org/ontology/uco/types#hashValue": { "@type": "http://www.w3.org/2001/XMLSchema#hexBinary", - "@value": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3" + "@value": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" } }, { - "@id": "_:Na99d1f2a83814ac491c9b02662ea8587", + "@id": "_:Ncaa10f1e5cf84d8286f1d1c536b9fa06", "@type": "https://unifiedcyberontology.org/ontology/uco/types#Hash", "https://unifiedcyberontology.org/ontology/uco/types#hashMethod": { "@type": "https://unifiedcyberontology.org/ontology/uco/vocabulary#HashNameVocab", - "@value": "MD5" + "@value": "SHA512" }, "https://unifiedcyberontology.org/ontology/uco/types#hashValue": { "@type": "http://www.w3.org/2001/XMLSchema#hexBinary", - "@value": "098f6bcd4621d373cade4e832627b4f6" + "@value": "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff" } - }, - { - "@id": "_:Ne7887bd0a239424bb588bed06ec4fc77", - "@type": "https://unifiedcyberontology.org/ontology/uco/observable#FileFacet", - "https://unifiedcyberontology.org/ontology/uco/observable#fileName": "sample.txt", - "https://unifiedcyberontology.org/ontology/uco/observable#modifiedTime": { - "@type": "http://www.w3.org/2001/XMLSchema#dateTime", - "@value": "2010-01-02T03:04:56+00:00" - }, - "https://unifiedcyberontology.org/ontology/uco/observable#sizeInBytes": 4 } ] -} +} \ No newline at end of file diff --git a/tests/case_utils/case_file/sample.txt.json b/tests/case_utils/case_file/sample.txt.json index dfc3075..c2b4f6e 100644 --- a/tests/case_utils/case_file/sample.txt.json +++ b/tests/case_utils/case_file/sample.txt.json @@ -12,74 +12,84 @@ }, "@graph": [ { - "@id": "kb:file-d30556a8-8082-5ffb-95a5-ca3839414d4f", + "@id": "kb:file-a44b2ee3-968f-5528-883a-fa65ac45ce2c", "@type": "uco-observable:ObservableObject", "uco-core:hasFacet": [ { - "@id": "_:N0db8031480664f87b08e49c18a767095" + "@id": "_:N4acc005af38245cb843d4a7009cce7df" }, { - "@id": "_:Nddb40eef75a94f8e979ff1fbfad9aca5" + "@id": "_:Nc02deac289534fbf93c061d03bbb589d" } ] }, { - "@id": "_:N0db8031480664f87b08e49c18a767095", + "@id": "_:N4acc005af38245cb843d4a7009cce7df", + "@type": "uco-observable:FileFacet", + "uco-observable:fileName": "sample.txt", + "uco-observable:modifiedTime": { + "@type": "xsd:dateTime", + "@value": "2010-01-02T03:04:56+00:00" + }, + "uco-observable:sizeInBytes": 4 + }, + { + "@id": "_:Nc02deac289534fbf93c061d03bbb589d", "@type": "uco-observable:ContentDataFacet", "uco-observable:hash": [ { - "@id": "_:N839986b2d63a4963beafbb65016449da" + "@id": "_:Nbbf71d61d9fa4615bc074268fd60b4b5" }, { - "@id": "_:N065fc8f395464db38cf36008593a16f9" + "@id": "_:N6741cf44d9da464191c6a0014dbb602b" }, { - "@id": "_:N379cd3902adc4912a74a8eacd32afb9c" + "@id": "_:N3b6cc89816394294bc260958408d74de" }, { - "@id": "_:N77e79676ee5449ea9f6db813fb9dc095" + "@id": "_:Nfc008212dd584b16a8d4d50df33f0a47" } ], "uco-observable:sizeInBytes": 4 }, { - "@id": "_:N839986b2d63a4963beafbb65016449da", + "@id": "_:Nbbf71d61d9fa4615bc074268fd60b4b5", "@type": "uco-types:Hash", "uco-types:hashMethod": { "@type": "uco-vocabulary:HashNameVocab", - "@value": "SHA256" + "@value": "MD5" }, "uco-types:hashValue": { "@type": "xsd:hexBinary", - "@value": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" + "@value": "098f6bcd4621d373cade4e832627b4f6" } }, { - "@id": "_:N065fc8f395464db38cf36008593a16f9", + "@id": "_:N6741cf44d9da464191c6a0014dbb602b", "@type": "uco-types:Hash", "uco-types:hashMethod": { "@type": "uco-vocabulary:HashNameVocab", - "@value": "MD5" + "@value": "SHA1" }, "uco-types:hashValue": { "@type": "xsd:hexBinary", - "@value": "098f6bcd4621d373cade4e832627b4f6" + "@value": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3" } }, { - "@id": "_:N379cd3902adc4912a74a8eacd32afb9c", + "@id": "_:N3b6cc89816394294bc260958408d74de", "@type": "uco-types:Hash", "uco-types:hashMethod": { "@type": "uco-vocabulary:HashNameVocab", - "@value": "SHA1" + "@value": "SHA256" }, "uco-types:hashValue": { "@type": "xsd:hexBinary", - "@value": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3" + "@value": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" } }, { - "@id": "_:N77e79676ee5449ea9f6db813fb9dc095", + "@id": "_:Nfc008212dd584b16a8d4d50df33f0a47", "@type": "uco-types:Hash", "uco-types:hashMethod": { "@type": "uco-vocabulary:HashNameVocab", @@ -89,16 +99,6 @@ "@type": "xsd:hexBinary", "@value": "ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff" } - }, - { - "@id": "_:Nddb40eef75a94f8e979ff1fbfad9aca5", - "@type": "uco-observable:FileFacet", - "uco-observable:fileName": "sample.txt", - "uco-observable:modifiedTime": { - "@type": "xsd:dateTime", - "@value": "2010-01-02T03:04:56+00:00" - }, - "uco-observable:sizeInBytes": 4 } ] -} +} \ No newline at end of file diff --git a/tests/case_utils/case_file/sample.txt.ttl b/tests/case_utils/case_file/sample.txt.ttl index f5d275b..16029aa 100644 --- a/tests/case_utils/case_file/sample.txt.ttl +++ b/tests/case_utils/case_file/sample.txt.ttl @@ -8,7 +8,7 @@ @prefix uco-vocabulary: . @prefix xsd: . -kb:file-57400969-69d0-5d5d-95c4-9dd7de330d3d +kb:file-9477a6eb-3a94-590b-b51e-6ce6892f0941 a uco-observable:ObservableObject ; uco-core:hasFacet [ From 73800db9ecee48734937baa396813b1f685f4be1 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 28 Oct 2021 18:22:22 -0400 Subject: [PATCH 17/49] Track CASE ontology as submodule References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- .gitmodules | 3 +++ Makefile | 16 ++++++++++++++++ README.md | 6 +++--- dependencies/CASE | 1 + 4 files changed, 23 insertions(+), 3 deletions(-) create mode 160000 dependencies/CASE diff --git a/.gitmodules b/.gitmodules index ef6a81d..ef6def1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ +[submodule "dependencies/CASE"] + path = dependencies/CASE + url = https://github.com/casework/CASE.git [submodule "dependencies/CASE-Examples-QC"] path = dependencies/CASE-Examples-QC url = https://github.com/ajnelson-nist/CASE-Examples-QC.git diff --git a/Makefile b/Makefile index 4661b8e..92e8cbd 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,9 @@ all: $(MAKE) \ --directory dependencies/CASE-Examples-QC/tests \ ontology_vocabulary.txt + test -r dependencies/CASE/ontology/master/case.ttl \ + || (git submodule init dependencies/CASE && git submodule update dependencies/CASE) + test -r dependencies/CASE/ontology/master/case.ttl touch $@ check: \ @@ -50,6 +53,19 @@ clean: clean @rm -f \ .git_submodule_init.done.log + @test ! -r dependencies/CASE/README.md \ + || @$(MAKE) \ + --directory dependencies/CASE \ + clean + @# Restore CASE validation output files that do not affect CASE build process. + @test ! -r dependencies/CASE/README.md \ + || ( \ + cd dependencies/CASE \ + && git checkout \ + -- \ + tests/examples \ + || true \ + ) @#Remove flag files that are normally set after deeper submodules and rdf-toolkit are downloaded. @rm -f \ dependencies/CASE-Examples-QC/.git_submodule_init.done.log \ diff --git a/README.md b/README.md index 4bd97e5..b5cf55e 100644 --- a/README.md +++ b/README.md @@ -86,10 +86,10 @@ This project follows [SEMVER 2.0.0](https://semver.org/) where versions are decl ## Ontology versions supported -This repository supports the ontology versions that are linked as submodules in the [CASE Examples QC](https://github.com/ajnelson-nist/CASE-Examples-QC) repository. Currently, the ontology versions are: +This repository supports the CASE ontology version that is linked as a submodule [here](dependencies/CASE). Currently, the ontology versions are: -* CASE - 0.4.0 -* UCO - 0.6.0 +* CASE - 0.5.0 +* UCO - 0.7.0 ## Repository locations diff --git a/dependencies/CASE b/dependencies/CASE new file mode 160000 index 0000000..6f55b7b --- /dev/null +++ b/dependencies/CASE @@ -0,0 +1 @@ +Subproject commit 6f55b7bd1d8d95dfe7fe31b3fbf25881fd76a5d1 From 78de18af366b5dcb1d1042dfe087e1289694cfad Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Fri, 29 Oct 2021 16:08:54 -0400 Subject: [PATCH 18/49] Use Java 8 for rdf-toolkit This applies a fix made to the CASE and UCO ontology repositories. References: * [UCO OC-164] (CP-71) Ontology syntax-check CI does not run with Java 11 Signed-off-by: Alex Nelson --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e976a0..b4d0c35 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,6 +27,10 @@ jobs: steps: - uses: actions/checkout@v2 + - uses: actions/setup-java@v2 + with: + distribution: 'adopt' + java-version: '8' - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: From f508280c3351ed83abda688b9007c8c12fa2d198 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 28 Oct 2021 18:44:14 -0400 Subject: [PATCH 19/49] Add recipes and instructions to build ontology References: * [AC-210] Add validation command to CASE-Utilities-Python * [ONT-445] (CP-38) rdf-toolkit base-iri flag degenerates versionIRI when slash IRI form is used Signed-off-by: Alex Nelson --- CONTRIBUTE.md | 34 ++++++++++++++++++++ Makefile | 34 ++++++++++++++++++-- README.md | 5 ++- case_utils/ontology/Makefile | 49 +++++++++++++++++++++++++++++ case_utils/ontology/__init__.py | 10 ++++++ case_utils/ontology/version_info.py | 35 +++++++++++++++++++++ setup.cfg | 1 + 7 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 CONTRIBUTE.md create mode 100644 case_utils/ontology/Makefile create mode 100644 case_utils/ontology/__init__.py create mode 100644 case_utils/ontology/version_info.py diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md new file mode 100644 index 0000000..6d1e781 --- /dev/null +++ b/CONTRIBUTE.md @@ -0,0 +1,34 @@ +# Contributing to CASE-Utilities-Python + + +## Deploying a new ontology version + +1. After cloning this repository, ensure the CASE submodule is checked out. This can be done with either `git submodule init && git submodule update`, `make .git_submodule_init.done.log`, or `make check`. +2. Update the CASE submodule pointer to the new tagged release. +3. The version of CASE is also hard-coded in [`case_utils/ontology/version_info.py`](case_utils/ontology/version_info.py). Edit the variable `CURRENT_CASE_VERSION`. +4. From the top source directory, run `make clean`. This guarantees a clean state of this repository as well as the ontology submodules. +5. Still from the top source directory, run `make`. +6. Any new `.ttl` files will be created under [`case_utils/ontology/`](case_utils/ontology/). Use `git add` to add each of them. (The patch-weight of these files could overshadow manual revisions, so it is fine to commit the built files after the manual changes are committed.) + +Here is a sample sequence of shell commands to run the build: + +```bash +# (Starting from fresh `git clone`.) +make check +pushd dependencies/CASE + git checkout master + git pull +popd +git add dependencies/CASE +# (Here, edits should be made to case_utils/ontology/version_info.py) +make +pushd case_utils/ontology + git add case-0.6.0.ttl # Assuming CASE 0.6.0 was just released. + # and/or + git add uco-0.8.0.ttl # Assuming UCO 0.8.0 was adopted in CASE 0.6.0. +popd +make check +# Assuming `make check` passes: +git commit -m "Update CASE ontology pointer to version 0.6.0" dependencies/CASE case_utils/ontology/version_info.py +git commit -m "Build CASE 0.6.0.ttl" case_utils/ontology/case-0.6.0.ttl +``` diff --git a/Makefile b/Makefile index 92e8cbd..da58060 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,13 @@ SHELL := /bin/bash PYTHON3 ?= $(shell which python3.9 2>/dev/null || which python3.8 2>/dev/null || which python3.7 2>/dev/null || which python3.6 2>/dev/null || which python3) -all: +case_version := $(shell $(PYTHON3) case_utils/ontology/version_info.py) +ifeq ($(case_version),) +$(error Unable to determine CASE version) +endif + +all: \ + .ontology.done.log .PHONY: \ download @@ -38,10 +44,25 @@ all: test -r dependencies/CASE/ontology/master/case.ttl \ || (git submodule init dependencies/CASE && git submodule update dependencies/CASE) test -r dependencies/CASE/ontology/master/case.ttl + $(MAKE) \ + --directory dependencies/CASE \ + .git_submodule_init.done.log \ + .lib.done.log + touch $@ + +.ontology.done.log: \ + dependencies/CASE/ontology/master/case.ttl + # Do not rebuild the current ontology file if it is already present. It is expected not to change once built. + # touch -c: Do not create the file if it does not exist. This will convince the recursive make nothing needs to be done if the file is present. + touch -c case_utils/ontology/case-$(case_version).ttl + $(MAKE) \ + --directory case_utils/ontology + # Confirm the current monolithic file is in place. + test -r case_utils/ontology/case-$(case_version).ttl touch $@ check: \ - .git_submodule_init.done.log + .ontology.done.log $(MAKE) \ PYTHON3=$(PYTHON3) \ --directory tests \ @@ -52,7 +73,8 @@ clean: --directory tests \ clean @rm -f \ - .git_submodule_init.done.log + .*.done.log + @# 'clean' in the ontology directory should only happen when testing and building new ontology versions. Hence, it is not called from the top-level Makefile. @test ! -r dependencies/CASE/README.md \ || @$(MAKE) \ --directory dependencies/CASE \ @@ -71,6 +93,12 @@ clean: dependencies/CASE-Examples-QC/.git_submodule_init.done.log \ dependencies/CASE-Examples-QC/.lib.done.log +# This recipe guarantees timestamp update order, and is otherwise intended to be a no-op. +dependencies/CASE/ontology/master/case.ttl: \ + .git_submodule_init.done.log + test -r $@ + touch $@ + distclean: \ clean @rm -rf \ diff --git a/README.md b/README.md index b5cf55e..370b29d 100644 --- a/README.md +++ b/README.md @@ -86,10 +86,9 @@ This project follows [SEMVER 2.0.0](https://semver.org/) where versions are decl ## Ontology versions supported -This repository supports the CASE ontology version that is linked as a submodule [here](dependencies/CASE). Currently, the ontology versions are: +This repository supports the CASE ontology version that is linked as a submodule [here](dependencies/CASE). The CASE version is encoded as a variable (and checked in unit tests) in [`case_utils/ontology/version_info.py`](case_utils/ontology/version_info.py), and used throughout this code base, as `CURRENT_CASE_VERSION`. -* CASE - 0.5.0 -* UCO - 0.7.0 +For instructions on how to update the CASE version for an ontology release, see [`CONTRIBUTE.md`](CONTRIBUTE.md). ## Repository locations diff --git a/case_utils/ontology/Makefile b/case_utils/ontology/Makefile new file mode 100644 index 0000000..bd53acb --- /dev/null +++ b/case_utils/ontology/Makefile @@ -0,0 +1,49 @@ +#!/usr/bin/make -f + +# 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) + +case_srcdir := $(top_srcdir)/dependencies/CASE + +uco_srcdir := $(case_srcdir)/dependencies/UCO + +RDF_TOOLKIT_JAR := $(case_srcdir)/lib/rdf-toolkit.jar + +case_version := $(shell python3 version_info.py) + +all: \ + case-$(case_version).ttl + +case-$(case_version).ttl: \ + $(top_srcdir)/.git_submodule_init.done.log \ + $(RDF_TOOLKIT_JAR) + $(MAKE) \ + --directory $(case_srcdir)/tests \ + case_monolithic.ttl + #TODO This cleanup step should be removed after the 0.3.0 release of CASE-Utility-SHACL-Inheritance-Reviewer. + test ! -d $(uco_srcdir)/dependencies/CASE-Utility-SHACL-Inheritance-Reviewer/build \ + || rm -rf \ + $(uco_srcdir)/dependencies/CASE-Utility-SHACL-Inheritance-Reviewer/build + #TODO This normalization step will not be needed after resolution of ONT-445. + java -jar $(RDF_TOOLKIT_JAR) \ + --inline-blank-nodes \ + --source $(case_srcdir)/tests/case_monolithic.ttl \ + --source-format turtle \ + --target _$@ \ + --target-format turtle + mv _$@ $@ + +clean: + @rm -f case-$(case_version).ttl diff --git a/case_utils/ontology/__init__.py b/case_utils/ontology/__init__.py new file mode 100644 index 0000000..081745d --- /dev/null +++ b/case_utils/ontology/__init__.py @@ -0,0 +1,10 @@ +# 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. diff --git a/case_utils/ontology/version_info.py b/case_utils/ontology/version_info.py new file mode 100644 index 0000000..5c8be8e --- /dev/null +++ b/case_utils/ontology/version_info.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +# 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. + +""" +This program serves two roles: +1. As a module, it houses the hard-coded values for the current CASE version packaged with case_utils. +2. As a script, it prints that version when called. + +When preparing to build a new monolithic ontology, please edit this variable to match the new respective version. +""" + +__version__ = "0.1.0" + +__all__ = [ + "CURRENT_CASE_VERSION" +] + +# Tested with CI to match versionInfo of . +CURRENT_CASE_VERSION : str = "0.5.0" + +def main() -> None: + print(CURRENT_CASE_VERSION) + +if __name__ == "__main__": + main() diff --git a/setup.cfg b/setup.cfg index a99193f..d6439d0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,3 +32,4 @@ console_scripts = [options.package_data] case_utils = py.typed +case_utils.ontology = *.ttl From 4e78ef891efc5bee7ed0dd3714fcaad1da652a81 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 28 Oct 2021 18:51:12 -0400 Subject: [PATCH 20/49] Build case-0.5.0.ttl References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- case_utils/ontology/case-0.5.0.ttl | 16271 +++++++++++++++++++++++++++ 1 file changed, 16271 insertions(+) create mode 100644 case_utils/ontology/case-0.5.0.ttl diff --git a/case_utils/ontology/case-0.5.0.ttl b/case_utils/ontology/case-0.5.0.ttl new file mode 100644 index 0000000..9f9fe5e --- /dev/null +++ b/case_utils/ontology/case-0.5.0.ttl @@ -0,0 +1,16271 @@ +# imports: https://ontology.caseontology.org/case/investigation +# imports: https://ontology.caseontology.org/case/vocabulary +# imports: https://unifiedcyberontology.org/ontology/uco/action +# imports: https://unifiedcyberontology.org/ontology/uco/core +# imports: https://unifiedcyberontology.org/ontology/uco/identity +# imports: https://unifiedcyberontology.org/ontology/uco/location +# imports: https://unifiedcyberontology.org/ontology/uco/marking +# imports: https://unifiedcyberontology.org/ontology/uco/observable +# imports: https://unifiedcyberontology.org/ontology/uco/pattern +# imports: https://unifiedcyberontology.org/ontology/uco/role +# imports: https://unifiedcyberontology.org/ontology/uco/time +# imports: https://unifiedcyberontology.org/ontology/uco/tool +# imports: https://unifiedcyberontology.org/ontology/uco/types +# imports: https://unifiedcyberontology.org/ontology/uco/uco +# imports: https://unifiedcyberontology.org/ontology/uco/victim +# imports: https://unifiedcyberontology.org/ontology/uco/vocabulary + +@prefix action: . +@prefix core: . +@prefix dct: . +@prefix identity: . +@prefix investigation: . +@prefix location: . +@prefix marking: . +@prefix observable: . +@prefix owl: . +@prefix pattern: . +@prefix rdf: . +@prefix rdfs: . +@prefix role: . +@prefix sh: . +@prefix time: . +@prefix tool: . +@prefix types: . +@prefix victim: . +@prefix vocab: . +@prefix vocabulary1: . +@prefix xsd: . + + + a owl:Ontology ; + rdfs:label "case-master"@en ; + rdfs:comment "The Cyber-investigation Analysis Standard Expression (CASE) ontology is a community-developed standard that defines concepts used in a broad range of cyber-investigation domains, including digital forensic science, incident response, counter-terrorism, criminal justice, forensic intelligence, and situational awareness. CASE includes all aspects of the digital forensic process, from evidence-gathering and chain of custody, to generating a final report. The goal is to increase sharing and interoperability of cyber-investigation information among organizations and between forensic analytic tools. CASE aligns with and extends the Unified Cyber Ontology (UCO). The preferred namespace abbreviation for this ontology is: case-master."@en ; + dct:title "Cyber-investigation Analysis Standard Expression (CASE)"@en ; + owl:imports + , + , + + ; + owl:incompatibleWith ; + owl:ontologyIRI ; + owl:priorVersion ; + owl:versionInfo "0.5.0" ; + . + + + a owl:Ontology ; + rdfs:label "investigation"@en ; + rdfs:comment "This ontology defines key concepts, and their associated properties and relationships, for characterizing cyber-investigations in the broadest range of contexts, including security incidents, criminal investigations, civil and regulatory matters, intelligence operations, international disputes, accident inquiries, policy violations, and others." ; + owl:imports + , + , + , + , + + ; + . + + + a owl:Ontology ; + rdfs:label "vocabularies"@en ; + . + + + a owl:Ontology ; + rdfs:label "uco-action"@en ; + rdfs:comment "This ontology defines classes and properties for characterizing actions."@en-US ; + owl:imports + , + , + , + , + + ; + . + + + a owl:Ontology ; + rdfs:label "uco-core"@en ; + rdfs:comment "This ontology defines classes and properties that are shared across the various UCO ontologies. At a high-level, the UCO core ontology provides base classes, relationship-oriented classes, content-aggregation classes, and shared classes."@en ; + owl:imports ; + . + + + a owl:Ontology ; + rdfs:label "uco-identity"@en ; + owl:imports + , + + ; + . + + + a owl:Ontology ; + rdfs:label "uco-location"@en ; + owl:imports ; + . + + + a owl:Ontology ; + rdfs:label "uco-marking"@en ; + rdfs:comment "Data markings represent restrictions, permissions, and other guidance for how data can be used and shared."@en ; + owl:imports ; + . + + + a owl:Ontology ; + rdfs:label "uco-observable"@en ; + owl:imports + , + , + , + , + , + + ; + . + + + a owl:Ontology ; + rdfs:label "uco-pattern"@en ; + owl:imports ; + . + + + a owl:Ontology ; + rdfs:label "uco-role"@en ; + owl:imports ; + . + + + a owl:Ontology ; + rdfs:label "uco-time"@en ; + owl:imports ; + . + + + a owl:Ontology ; + rdfs:label "uco-tool"@en ; + owl:imports ; + . + + + a owl:Ontology ; + rdfs:label "uco-types"@en ; + owl:imports + , + + ; + . + + + a owl:Ontology ; + rdfs:label "uco-master"@en ; + owl:imports + , + , + , + , + , + , + , + , + , + , + , + + ; + owl:versionInfo "0.7.0" ; + . + + + a owl:Ontology ; + rdfs:label "uco-victim"@en ; + owl:imports + , + + ; + . + + + a owl:Ontology ; + rdfs:label "uco-vocabularies"@en ; + . + +investigation:Attorney + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf role:Role ; + rdfs:label "Attorney"@en ; + rdfs:comment "Attorney is a role involved in preparing, interpreting, and applying law."@en ; + . + +investigation:Authorization + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Authorization"@en ; + rdfs:comment "An authorization is a grouping of characteristics unique to some form of authoritative permission identified for investigative action."@en ; + sh:property + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:startTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path investigation:authorizationType ; + ] , + [ + sh:datatype xsd:string ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path investigation:authorizationIdentifier ; + ] + ; + . + +investigation:Examiner + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf role:Role ; + rdfs:label "Examiner"@en ; + rdfs:comment "Examiner is a role involved in providing scientific evaluations of evidence that are used to aid law enforcement investigations and court cases."@en ; + . + +investigation:ExaminerActionLifecylce + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf action:ActionLifecycle ; + rdfs:label "ExaminerActionLifecylce"@en ; + rdfs:comment "An examiner action life cycle is an action pattern consisting of an ordered set of actions or subordinate action-lifecycles performed by an entity acting in a role involved in providing scientific evaluations of evidence that is used to aid law enforcement investigations and court cases."@en ; + . + +investigation:Investigation + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:ContextualCompilation ; + rdfs:label "Investigation"@en ; + rdfs:comment "An investigation is a grouping of characteristics unique to an exploration of the facts involved in a cyber-relevant set of suspicious activity."@en ; + sh:property + [ + sh:class investigation:Authorization ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path investigation:relevantAuthorization ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:startTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path investigation:investigationStatus ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path investigation:focus ; + ] , + [ + sh:datatype vocab:InvestigationFormVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path investigation:investigationForm ; + ] + ; + . + +investigation:InvestigativeAction + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf action:Action ; + rdfs:label "InvestigativeAction"@en ; + rdfs:comment "An investigative action is something that may be done or performed within the context of an investigation, typically to examine or analyze evidence or other data."@en ; + sh:property [ + sh:class investigation:InvestigativeAction ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path investigation:wasInformedBy ; + ] ; + . + +investigation:Investigator + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf role:Role ; + rdfs:label "Investigator"@en ; + rdfs:comment "Investigator is a role involved in coordinating an investigation."@en ; + . + +investigation:ProvenanceRecord + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:ContextualCompilation ; + rdfs:label "ProvenanceRecord"@en ; + rdfs:comment "A provenance record is a grouping of characteristics unique to the provenantial (chronology of the ownership, custody or location) connection between an investigative action and a set of observations (items and/or actions) or interpretations that result from it."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path investigation:exhibitNumber ; + ] , + [ + sh:datatype xsd:string ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path investigation:rootExhibitNumber ; + ] + ; + . + +investigation:Subject + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf role:Role ; + rdfs:label "Subject"@en ; + rdfs:comment "Subject is a role whose conduct is within the scope of an investigation."@en ; + . + +investigation:SubjectActionLifecycle + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf action:ActionLifecycle ; + rdfs:label "SubjectActionLifecycle"@en ; + rdfs:comment "A subject action life cycle is an action pattern consisting of an ordered set of multiple actions or subordinate action-lifecycles performed by an entity acting in a role whose conduct may be within the scope of an investigation."@en ; + . + +investigation:VictimActionLifecycle + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf action:ActionLifecycle ; + rdfs:label "VictimActionLifecycle"@en ; + rdfs:comment "A victim action life cycle is an action pattern consisting of an ordered set of multiple actions or subordinate action-lifecycles performed by an entity acting in a role characterized by its potential to be harmed as a result of a crime, accident, or other event or action."@en ; + . + +investigation:authorizationIdentifier + a owl:DatatypeProperty ; + rdfs:label "authorizationIdentifier"@en ; + rdfs:comment "The identifier for a particular authorization (e.g. warrant number)"@en ; + rdfs:range xsd:string ; + . + +investigation:authorizationType + a owl:DatatypeProperty ; + rdfs:label "authorizationType"@en ; + rdfs:comment "A label categorizing a type of authorization (e.g. warrant)"@en ; + rdfs:range xsd:string ; + . + +investigation:exhibitNumber + a owl:DatatypeProperty ; + rdfs:label "exhibitNumber"@en ; + rdfs:comment "Specifies a unique identifier assigned to a given object at any stage of an investigation to differentiate it from all other objects."@en ; + rdfs:range xsd:string ; + . + +investigation:focus + a owl:DatatypeProperty ; + rdfs:label "focus"@en ; + rdfs:comment "Specifies the topical focus of an investigation."@en ; + rdfs:range xsd:string ; + . + +investigation:investigationForm + a owl:DatatypeProperty ; + rdfs:label "investigationForm"@en ; + rdfs:comment "A label categorizing a type of investigation (case, incident, suspicious-activity, etc.)"@en ; + rdfs:range vocab:InvestigationFormVocab ; + . + +investigation:investigationStatus + a owl:DatatypeProperty ; + rdfs:label "investigationStatus"@en ; + rdfs:comment "A label characterizing the status of an investigation (open, closed, etc.)."@en ; + rdfs:range xsd:string ; + . + +investigation:relevantAuthorization + a owl:ObjectProperty ; + rdfs:label "relevantAuthorization"@en ; + rdfs:comment "Specifies an authorization relevant to a particular investigation."@en ; + rdfs:range investigation:Authorization ; + . + +investigation:rootExhibitNumber + a owl:DatatypeProperty ; + rdfs:label "rootExhibitNumber"@en ; + rdfs:comment "Specifies a unique identifier assigned to a given object at the start of its treatment as part of an investigation. The first node in a provenance chain, which can be viewed as a heirarchical tree originating from a single root."@en ; + rdfs:range xsd:string ; + . + +investigation:wasDerivedFrom + a owl:ObjectProperty ; + rdfs:label "wasDerivedFrom"@en ; + rdfs:comment "A re-implementation of the wasDerivedFrom property in W3C PROV-O. The definition of this property is 'A derivation is a transformation of an entity into another, an update of an entity resulting in a new one, or the construction of a new entity based on a pre-existing entity.' [Ref: https://www.w3.org/TR/prov-o/#wasDerivedFrom]"@en ; + rdfs:domain core:UcoObject ; + rdfs:range core:UcoObject ; + . + +investigation:wasInformedBy + a owl:ObjectProperty ; + rdfs:label "wasInformedBy"@en ; + rdfs:comment "A re-implementation of the wasInformedBy property in W3C PROV-O, where an entity is exchanged by two activities, 'one activity using the entity generated by the other'. [Ref: https://www.w3.org/TR/prov-o/#wasInformedBy]"@en ; + rdfs:domain investigation:InvestigativeAction ; + rdfs:range investigation:InvestigativeAction ; + . + +vocab:InvestigationFormVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Investigation Form Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of investigation forms."@en-US ; + owl:oneOf ( + "case"^^vocab:InvestigationFormVocab + "incident"^^vocab:InvestigationFormVocab + "suspicious-activity"^^vocab:InvestigationFormVocab + ) ; + . + +action:Action + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Action"@en ; + rdfs:comment "An action is something that may be done or performed."@en ; + sh:property + [ + sh:class action:Action ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:subaction ; + ] , + [ + sh:class core:UcoObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:error ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:startTime ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionCount ; + ] , + [ + sh:datatype vocabulary1:ActionStatusTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionStatus ; + ] + ; + sh:targetClass action:Action ; + . + +action:ActionArgumentFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ActionArgumentFacet"@en ; + rdfs:comment "An action argument facet is a grouping of characteristics unique to a single parameter of an action."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:argumentName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:value ; + ] + ; + sh:targetClass action:ActionArgumentFacet ; + . + +action:ActionEstimationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ActionEstimationFacet"@en ; + rdfs:comment "An action estimation facet is a grouping of characteristics unique to decision-focused approximation aspects for an action that may potentially be performed."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:estimatedCost ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:estimatedEfficacy ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:estimatedImpact ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:objective ; + ] + ; + sh:targetClass action:ActionEstimationFacet ; + . + +action:ActionFrequencyFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ActionFrequencyFacet"@en ; + rdfs:comment "An action frequency facet is a grouping of characteristics unique to the frequency of occurrence for an action."@en ; + sh:property + [ + sh:datatype xsd:float ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:rate ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:scale ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:units ; + ] , + [ + sh:datatype vocabulary1:TrendVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:trend ; + ] + ; + sh:targetClass action:ActionFrequencyFacet ; + . + +action:ActionLifecycle + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf action:Action ; + rdfs:label "ActionLifecycle"@en ; + rdfs:comment "An action lifecycle is an action pattern consisting of an ordered set of multiple actions or subordinate action lifecycles."@en ; + sh:property + [ + sh:class action:ArrayOfAction ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:phase ; + ] , + [ + sh:class core:UcoObject ; + sh:maxCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:error ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:startTime ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionCount ; + ] , + [ + sh:datatype vocabulary1:ActionStatusTypeVocab ; + sh:maxCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionStatus ; + ] + ; + sh:targetClass action:ActionLifecycle ; + . + +action:ActionPattern + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + action:Action , + pattern:Pattern + ; + rdfs:label "ActionPattern"@en ; + rdfs:comment "An action pattern is a grouping of characteristics unique to a combination of actions forming a consistent or characteristic arrangement."@en ; + sh:targetClass action:ActionPattern ; + . + +action:ActionReferencesFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ActionReferencesFacet"@en ; + rdfs:comment """An action references facet is a grouping of characteristics unique to the core elements (who, how, with what, where, etc.) for an action. The characteristics are references to separate UCO objects detailing the particular characteristic. + """@en ; + sh:property + [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:environment ; + ] , + [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:performer ; + ] , + [ + sh:class core:UcoObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:instrument ; + ] , + [ + sh:class core:UcoObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:object ; + ] , + [ + sh:class core:UcoObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:participant ; + ] , + [ + sh:class core:UcoObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:result ; + ] , + [ + sh:class location:Location ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:location ; + ] + ; + sh:targetClass action:ActionReferencesFacet ; + . + +action:ArrayOfAction + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ArrayOfAction"@en ; + rdfs:comment "An array of action is an ordered list of references to things that may be done or performed."@en ; + sh:property [ + sh:class action:Action ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:action ; + ] ; + sh:targetClass action:ArrayOfAction ; + . + +action:action + a owl:ObjectProperty ; + rdfs:label "action"@en ; + rdfs:comment "A characterization of a single action."@en ; + rdfs:range action:Action ; + . + +action:actionCount + a owl:DatatypeProperty ; + rdfs:label "actionCount"@en ; + rdfs:comment "The number of times that the action was performed."@en ; + rdfs:range xsd:nonNegativeInteger ; + . + +action:actionStatus + a owl:DatatypeProperty ; + rdfs:label "actionStatus"@en ; + rdfs:comment "The current state of the action."@en ; + rdfs:range vocabulary1:ActionStatusTypeVocab ; + . + +action:argumentName + a owl:DatatypeProperty ; + rdfs:label "argumentName"@en ; + rdfs:comment "The identifying label of an argument."@en ; + rdfs:range xsd:string ; + . + +action:endTime + a owl:DatatypeProperty ; + rdfs:label "endTime"@en ; + rdfs:comment "The time at which performance of the action ended."@en ; + rdfs:range xsd:dateTime ; + . + +action:environment + a owl:ObjectProperty ; + rdfs:label "environment"@en ; + rdfs:comment "The environment wherein an action occurs."@en ; + rdfs:range core:UcoObject ; + . + +action:error + a owl:ObjectProperty ; + rdfs:label "error"@en ; + rdfs:comment "A characterization of the differences between the expected and the actual performance of the action."@en ; + rdfs:range core:UcoObject ; + . + +action:estimatedCost + a owl:DatatypeProperty ; + rdfs:label "estimatedCost"@en ; + rdfs:comment "An estimation of the cost if the action is performed."@en ; + rdfs:range xsd:string ; + . + +action:estimatedEfficacy + a owl:DatatypeProperty ; + rdfs:label "estimatedEfficacy"@en ; + rdfs:comment "An estimation of the effectiveness of the action at achieving its objective if the action is performed."@en ; + rdfs:range xsd:string ; + . + +action:estimatedImpact + a owl:DatatypeProperty ; + rdfs:label "estimatedImpact"@en ; + rdfs:comment "An estimation of the impact if the action is performed."@en ; + rdfs:range xsd:string ; + . + +action:instrument + a owl:ObjectProperty ; + rdfs:label "instrument"@en ; + rdfs:comment "The things used to perform an action."@en ; + rdfs:range core:UcoObject ; + . + +action:location + a owl:ObjectProperty ; + rdfs:label "location"@en ; + rdfs:comment "The locations where an action occurs."@en ; + rdfs:range location:Location ; + . + +action:object + a owl:ObjectProperty ; + rdfs:label "object"@en ; + rdfs:comment "The things that the action is performed on/against."@en ; + rdfs:range core:UcoObject ; + . + +action:objective + a owl:DatatypeProperty ; + rdfs:label "objective"@en ; + rdfs:comment "The intended purpose for performing the action."@en ; + rdfs:range xsd:string ; + . + +action:participant + a owl:ObjectProperty ; + rdfs:label "participant"@en ; + rdfs:comment "The supporting (non-primary) performers of an action."@en ; + rdfs:range core:UcoObject ; + . + +action:performer + a owl:ObjectProperty ; + rdfs:label "performer"@en ; + rdfs:comment "The primary performer of an action."@en ; + rdfs:range core:UcoObject ; + . + +action:phase + a owl:ObjectProperty ; + rdfs:subPropertyOf action:subaction ; + rdfs:label "phase"@en ; + rdfs:comment "The ordered set of actions or sub action-lifecycles that represent the action lifecycle."@en ; + rdfs:range action:ArrayOfAction ; + . + +action:rate + a owl:DatatypeProperty ; + rdfs:label "rate"@en ; + rdfs:comment "The frequency rate for the occurence of an action."@en ; + rdfs:range xsd:float ; + . + +action:result + a owl:ObjectProperty ; + rdfs:label "result"@en ; + rdfs:comment "The things resulting from performing an action."@en ; + rdfs:range core:UcoObject ; + . + +action:scale + a owl:DatatypeProperty ; + rdfs:label "scale"@en ; + rdfs:comment "The time scale utilized for the frequency rate count for the occurence of an action."@en ; + rdfs:range xsd:string ; + . + +action:startTime + a owl:DatatypeProperty ; + rdfs:label "startTime"@en ; + rdfs:comment "The time at which performance of the action began."@en ; + rdfs:range xsd:dateTime ; + . + +action:subaction + a owl:ObjectProperty ; + rdfs:label "subaction"@en ; + rdfs:comment "References to other actions that make up part of a larger more complex action."@en ; + rdfs:range action:Action ; + . + +action:trend + a owl:DatatypeProperty ; + rdfs:label "trend"@en ; + rdfs:comment "A characterization of the frequency trend for the occurence of an action."@en ; + rdfs:range vocabulary1:TrendVocab ; + . + +action:units + a owl:DatatypeProperty ; + rdfs:label "units"@en ; + rdfs:comment "The units of measure utilized for the frequency rate count for the occurence of an action."@en ; + rdfs:range xsd:string ; + . + +action:value + a owl:DatatypeProperty ; + rdfs:label "value"@en ; + rdfs:comment "The value of an action parameter."@en ; + rdfs:range xsd:string ; + . + +core:Annotation + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Assertion ; + rdfs:label "Annotation"@en ; + rdfs:comment "An annotation is an assertion made in relation to one or more objects."@en ; + sh:property [ + sh:class core:UcoObject ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:object ; + ] ; + sh:targetClass core:Annotation ; + . + +core:Assertion + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Assertion"@en ; + rdfs:comment "An assertion is a statement declared to be true."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path core:statement ; + ] ; + sh:targetClass core:Assertion ; + . + +core:AttributedName + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "AttributedName"@en ; + rdfs:comment "An attributed name is a name of an entity issued by some attributed naming authority."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:namingAuthority ; + ] ; + sh:targetClass core:AttributedName ; + . + +core:Bundle + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:EnclosingCompilation ; + rdfs:label "Bundle"@en ; + rdfs:comment "A bundle is a container for a grouping of UCO content with no presumption of shared context."@en ; + sh:targetClass core:Bundle ; + . + +core:Compilation + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Compilation"@en ; + rdfs:comment "A compilation is a grouping of things."@en ; + sh:targetClass core:Compilation ; + . + +core:ConfidenceFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ConfidenceFacet"@en ; + rdfs:comment "A confidence is a grouping of characteristics unique to an asserted level of certainty in the accuracy of some information."@en ; + sh:property [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:confidence ; + ] ; + sh:targetClass core:ConfidenceFacet ; + . + +core:ContextualCompilation + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Compilation ; + rdfs:label "ContextualCompilation"@en ; + rdfs:comment "A contextual compilation is a grouping of things sharing some context (e.g., a set of network connections observed on a given day, all accounts associated with a given person)."@en ; + sh:property [ + sh:class core:UcoObject ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:object ; + ] ; + sh:targetClass core:ContextualCompilation ; + . + +core:ControlledVocabulary + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "ControlledVocabulary"@en ; + rdfs:comment "A controlled vocabulary is an explicitly constrained set of string values."@en ; + sh:property + [ + sh:datatype xsd:anyURI ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:constrainingVocabularyReference ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:value ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:constrainingVocabularyName ; + ] + ; + sh:targetClass core:ControlledVocabulary ; + . + +core:EnclosingCompilation + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Compilation ; + rdfs:label "EnclosingCompilation"@en ; + rdfs:comment "An enclosing compilation is a container for a grouping of things."@en ; + sh:property + [ + sh:class core:UcoObject ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:object ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:description ; + ] + ; + sh:targetClass core:EnclosingCompilation ; + . + +core:ExternalReference + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ExternalReference"@en ; + rdfs:comment "Characteristics of a reference to a resource outside of the UCO."@en ; + sh:property + [ + sh:datatype xsd:anyURI ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:referenceURL ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:definingContext ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:externalIdentifier ; + ] + ; + sh:targetClass core:ExternalReference ; + . + +core:Facet + a + owl:Class , + sh:NodeShape + ; + rdfs:label "Facet"@en ; + rdfs:comment "A facet is a grouping of characteristics unique to a particular aspect of an object."@en ; + sh:targetClass core:Facet ; + . + +core:Grouping + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:ContextualCompilation ; + rdfs:label "Grouping"@en ; + rdfs:comment "A grouping is a compilation of referenced UCO content with a shared context."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path core:context ; + ] ; + sh:targetClass core:Grouping ; + . + +core:IdentityAbstraction + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "IdentityAbstraction"@en ; + rdfs:comment "An identity abstraction is a grouping of identifying characteristics unique to an individual or organization. This class is an ontological structural abstraction for this concept. Implementations of this concept should utilize the identity:Identity class."@en ; + sh:targetClass core:IdentityAbstraction ; + . + +core:Item + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Item"@en ; + rdfs:comment "An item is a distinct article or unit."@en ; + sh:targetClass core:Item ; + . + +core:MarkingDefinitionAbstraction + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "MarkingDefinitionAbstraction"@en ; + rdfs:comment "A marking definition abstraction is a grouping of characteristics unique to the expression of a specific data marking conveying restrictions, permissions, and other guidance for how marked data can be used and shared. This class is an ontological structural abstraction for this concept. Implementations of this concept should utilize the marking:MarkingDefinition class."@en ; + sh:targetClass core:MarkingDefinitionAbstraction ; + . + +core:ModusOperandi + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "ModusOperandi"@en ; + rdfs:comment "A modus operandi is a particular method of operation (how a particular entity behaves or the resources they use)."@en ; + sh:targetClass core:ModusOperandi ; + . + +core:Relationship + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Relationship"@en ; + rdfs:comment "A relationship is a grouping of characteristics unique to an assertion that one or more objects are related to another object in some way."@en ; + sh:property + [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:target ; + ] , + [ + sh:class core:UcoObject ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:source ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:isDirectional ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:nodeKind sh:Literal ; + sh:path core:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:nodeKind sh:Literal ; + sh:path core:startTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:kindOfRelationship ; + ] + ; + sh:targetClass core:Relationship ; + . + +core:UcoObject + a + owl:Class , + sh:NodeShape + ; + rdfs:label "UcoObject"@en ; + rdfs:comment "A UCO object is a representation of a fundamental concept either directly inherent to the cyber domain or indirectly related to the cyber domain and necessary for contextually characterizing cyber domain concepts and relationships. Within the Unified Cyber Ontology (UCO) structure this is the base class acting as a consistent, unifying and interoperable foundation for all explicit and inter-relatable content objects."@en ; + sh:property + [ + sh:class core:ExternalReference ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:externalReference ; + ] , + [ + sh:class core:Facet ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:hasFacet ; + ] , + [ + sh:class core:IdentityAbstraction ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:createdBy ; + ] , + [ + sh:class core:MarkingDefinitionAbstraction ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:objectMarking ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:objectCreatedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:nodeKind sh:Literal ; + sh:path core:modifiedTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:name ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:specVersion ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path core:description ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path core:tag ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path core:type ; + ] , + [ + sh:datatype types:Identifier ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:id ; + ] + ; + sh:targetClass core:UcoObject ; + . + +core:confidence + a owl:DatatypeProperty ; + rdfs:label "confidence"@en ; + rdfs:comment "An asserted level of certainty in the accuracy of some information."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:onDatatype xsd:nonNegativeInteger ; + owl:withRestrictions ( + [ + xsd:maxInclusive "100"^^xsd:nonNegativeInteger ; + ] + ) ; + ] ; + . + +core:constrainingVocabularyName + a owl:DatatypeProperty ; + rdfs:label "constrainingVocabularyName"@en ; + rdfs:comment "The name of an explicitly constrained set of string values."@en ; + rdfs:range xsd:string ; + . + +core:constrainingVocabularyReference + a owl:DatatypeProperty ; + rdfs:label "constrainingVocabularyReference"@en ; + rdfs:comment "A reference to a specification for an explicitly constrained set of string values. The specification may be unstructured (e.g., web page listing string values) or structured (e.g. RDF/OWL enumeration)."@en ; + rdfs:range xsd:anyURI ; + . + +core:context + a owl:DatatypeProperty ; + rdfs:label "context"@en ; + rdfs:comment "A description of particular contextual affinity."@en ; + rdfs:range xsd:string ; + . + +core:createdBy + a owl:ObjectProperty ; + rdfs:label "createdBy"@en ; + rdfs:comment "The identity that created a characterization of a concept."@en ; + rdfs:range core:IdentityAbstraction ; + . + +core:definingContext + a owl:DatatypeProperty ; + rdfs:label "definingContext"@en ; + rdfs:comment "A description of the context relevant to the definition of a particular external reference identifier."@en ; + rdfs:range xsd:string ; + . + +core:description + a owl:DatatypeProperty ; + rdfs:label "description"@en ; + rdfs:comment "A description of a particular concept characterization."@en ; + rdfs:range xsd:string ; + . + +core:endTime + a owl:DatatypeProperty ; + rdfs:label "endTime"@en ; + rdfs:comment "The ending time of a time range."@en ; + rdfs:range xsd:dateTime ; + . + +core:externalIdentifier + a owl:DatatypeProperty ; + rdfs:label "externalIdentifier"@en ; + rdfs:comment "An identifier for some information defined external to the UCO context."@en ; + rdfs:range xsd:string ; + . + +core:externalReference + a owl:ObjectProperty ; + rdfs:label "External Reference"@en-US ; + rdfs:comment "Specifies a reference to a resource outside of the UCO."@en-US ; + rdfs:range core:ExternalReference ; + . + +core:hasFacet + a owl:ObjectProperty ; + rdfs:label "hasFacet"@en ; + rdfs:comment "Further sets of properties characterizing a concept based on the particular context of the class and of the particular instance of the concept being characterized."@en ; + rdfs:range core:Facet ; + . + +core:id + a owl:DatatypeProperty ; + rdfs:label "id"@en ; + rdfs:comment "A globally unique identifier for a characterization of a concept."@en ; + rdfs:range types:Identifier ; + . + +core:isDirectional + a owl:DatatypeProperty ; + rdfs:label "isDirectional"@en ; + rdfs:comment "A specification whether or not a relationship assertion is limited to the context FROM a source object(s) TO a target object."@en ; + rdfs:range xsd:boolean ; + . + +core:kindOfRelationship + a owl:DatatypeProperty ; + rdfs:label "kindOfRelationship"@en ; + rdfs:comment "A characterization of the nature of a relationship between objects."@en ; + rdfs:range xsd:string ; + . + +core:modifiedTime + a owl:DatatypeProperty ; + rdfs:label "modifiedTime"@en ; + rdfs:comment "Specifies the time that this particular version of the object was modified. The object creator can use the time it deems most appropriate as the time this version of the object was modified. The value of the modified property for a given object version MUST be later than or equal to the value of the created property. Object creators MUST update the modified property when creating a new version of an object. The modified timestamp MUST be precise to the nearest millisecond (exactly three digits after the decimal place in seconds)."@en-us ; + rdfs:range xsd:dateTime ; + . + +core:name + a owl:DatatypeProperty ; + rdfs:label "name"@en ; + rdfs:comment "The name of a particular concept characterization."@en ; + rdfs:range xsd:string ; + . + +core:namingAuthority + a owl:DatatypeProperty ; + rdfs:label "namingAuthority"@en ; + rdfs:comment "Specifies the naming authority that issued the name of the entity."@en ; + rdfs:range xsd:string ; + . + +core:object + a owl:ObjectProperty ; + rdfs:label "object"@en ; + rdfs:comment "Specifies one or more UcoObjects."@en ; + rdfs:range core:UcoObject ; + . + +core:objectCreatedTime + a owl:DatatypeProperty ; + rdfs:label "objectCreatedTime"@en ; + rdfs:comment "The time at which a characterization of a concept is created. This time pertains to the time of creating the record object, and is not an intrinsic characteristic of the concept."@en ; + rdfs:range xsd:dateTime ; + . + +core:objectMarking + a owl:ObjectProperty ; + rdfs:label "objectMarking"@en ; + rdfs:comment "Marking definitions to be applied to a particular concept characterization in its entirety."@en ; + rdfs:range core:MarkingDefinitionAbstraction ; + . + +core:referenceURL + a owl:DatatypeProperty ; + rdfs:label "referenceURL"@en ; + rdfs:comment "A URL for some information defined external to the UCO context."@en ; + rdfs:range xsd:anyURI ; + . + +core:source + a owl:ObjectProperty ; + rdfs:label "source"@en ; + rdfs:comment "The originating node of a specified relationship."@en ; + rdfs:range core:UcoObject ; + . + +core:specVersion + a owl:DatatypeProperty ; + rdfs:label "specVersion"@en ; + rdfs:comment "The version of UCO ontology or subontology specification used to characterize a concept."@en ; + rdfs:range xsd:string ; + . + +core:startTime + a owl:DatatypeProperty ; + rdfs:label "startTime"@en ; + rdfs:comment "The initial time of a time range."@en ; + rdfs:range xsd:dateTime ; + . + +core:statement + a owl:DatatypeProperty ; + rdfs:label "statement"@en ; + rdfs:comment "A textual statement of an assertion."@en ; + rdfs:range xsd:string ; + . + +core:tag + a owl:DatatypeProperty ; + rdfs:label "tag"@en ; + rdfs:comment "A generic tag/label."@en ; + rdfs:range xsd:string ; + . + +core:target + a owl:ObjectProperty ; + rdfs:label "target"@en ; + rdfs:comment "The terminating node of a specified relationship."@en ; + rdfs:range core:UcoObject ; + . + +core:type + a owl:DatatypeProperty ; + rdfs:label "type"@en ; + rdfs:comment "The explicitly-defined type of characterization of a concept."@en ; + rdfs:range xsd:string ; + . + +core:value + a owl:DatatypeProperty ; + rdfs:label "value"@en ; + rdfs:comment "A string value."@en ; + rdfs:range xsd:string ; + . + +identity:AddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "AddressFacet"@en ; + rdfs:comment "An address facet is a grouping of characteristics unique to an administrative identifier for a geolocation associated with a specific identity."@en ; + sh:property [ + sh:class location:Location ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path identity:address ; + ] ; + sh:targetClass identity:AddressFacet ; + . + +identity:AffiliationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "AffiliationFacet"@en ; + rdfs:comment "An affiliation is a grouping of characteristics unique to the established affiliations of an entity."@en ; + sh:targetClass identity:AffiliationFacet ; + . + +identity:BirthInformationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "BirthInformationFacet"@en ; + rdfs:comment "Birth information is a grouping of characteristics unique to information pertaining to the birth of an entity."@en ; + sh:property [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path identity:birthdate ; + ] ; + sh:targetClass identity:BirthInformationFacet ; + . + +identity:CountryOfResidenceFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "CountryOfResidenceFacet"@en ; + rdfs:comment "Country of residence is a grouping of characteristics unique to information related to the country, or countries, where an entity resides."@en ; + sh:targetClass identity:CountryOfResidenceFacet ; + . + +identity:EventsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "EventsFacet"@en ; + rdfs:comment "Events is a grouping of characteristics unique to information related to specific relevant things that happen in the lifetime of an entity."@en ; + sh:targetClass identity:EventsFacet ; + . + +identity:IdentifierFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "IdentifierFacet"@en ; + rdfs:comment "Identifier is a grouping of characteristics unique to information that uniquely and specifically identities an entity."@en ; + sh:targetClass identity:IdentifierFacet ; + . + +identity:Identity + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:IdentityAbstraction ; + rdfs:label "Identity"@en ; + rdfs:comment "An identity is a grouping of identifying characteristics unique to an individual or organization."@en ; + sh:targetClass identity:Identity ; + . + +identity:IdentityFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "IdentityFacet"@en ; + rdfs:comment "An identity facet is a grouping of characteristics unique to a particular aspect of an identity."@en ; + sh:targetClass identity:IdentityFacet ; + . + +identity:LanguagesFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "LanguagesFacet"@en ; + rdfs:comment "Languages is a grouping of characteristics unique to specific syntactically and grammatically standardized forms of communication (human or computer) in which an entity has proficiency (comprehends, speaks, reads, or writes)."@en ; + sh:targetClass identity:LanguagesFacet ; + . + +identity:NationalityFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "NationalityFacet"@en ; + rdfs:comment "Nationality is a grouping of characteristics unique to the condition of an entity belonging to a particular nation."@en ; + sh:targetClass identity:NationalityFacet ; + . + +identity:OccupationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "OccupationFacet"@en ; + rdfs:comment "Occupation is a grouping of characteristics unique to the job or profession of an entity."@en ; + sh:targetClass identity:OccupationFacet ; + . + +identity:Organization + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:Identity ; + rdfs:label "Organization"@en ; + rdfs:comment "An organization is a grouping of identifying characteristics unique to a group of people who work together in an organized way for a shared purpose. [based on https://dictionary.cambridge.org/us/dictionary/english/organization]"@en ; + sh:targetClass identity:Organization ; + . + +identity:OrganizationDetailsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "OrganizationDetailsFacet"@en ; + rdfs:comment "Organization details is a grouping of characteristics unique to an identity representing an administrative and functional structure."@en ; + sh:targetClass identity:OrganizationDetailsFacet ; + . + +identity:Person + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:Identity ; + rdfs:label "Person"@en ; + rdfs:comment "A person is a grouping of identifying characteristics unique to a human being regarded as an individual. [based on https://www.lexico.com/en/definition/person]"@en ; + sh:targetClass identity:Person ; + . + +identity:PersonalDetailsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "PersonalDetailsFacet"@en ; + rdfs:comment "Personal details is a grouping of characteristics unique to an identity representing an individual person."@en ; + sh:targetClass identity:PersonalDetailsFacet ; + . + +identity:PhysicalInfoFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "PhysicalInfoFacet"@en ; + rdfs:comment "Physical info is a grouping of characteristics unique to the outwardly observable nature of an individual person."@en ; + sh:targetClass identity:PhysicalInfoFacet ; + . + +identity:QualificationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "QualificationFacet"@en ; + rdfs:comment "Qualification is a grouping of characteristics unique to particular skills, capabilities or their related achievements (educational, professional, etc.) of an entity."@en ; + sh:targetClass identity:QualificationFacet ; + . + +identity:RelatedIdentityFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "RelatedIdentityFacet"@en ; + rdfs:comment ""@en ; + sh:targetClass identity:RelatedIdentityFacet ; + . + +identity:SimpleNameFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "SimpleNameFacet"@en ; + rdfs:comment "A simple name facet is a grouping of characteristics unique to the personal name (e.g., Dr. John Smith Jr.) held by an identity."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path identity:familyName ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path identity:givenName ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path identity:honorificPrefix ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path identity:honorificSuffix ; + ] + ; + sh:targetClass identity:SimpleNameFacet ; + . + +identity:VisaFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf identity:IdentityFacet ; + rdfs:label "VisaFacet"@en ; + rdfs:comment "Visa is a grouping of characteristics unique to information related to a person's ability to enter, leave, or stay for a specified period of time in a country."@en ; + sh:targetClass identity:VisaFacet ; + . + +identity:address + a owl:ObjectProperty ; + rdfs:label "address"@en ; + rdfs:comment ""@en ; + rdfs:range location:Location ; + . + +identity:birthdate + a owl:DatatypeProperty ; + rdfs:label "birthdate"@en ; + rdfs:comment ""@en ; + rdfs:range xsd:dateTime ; + . + +identity:familyName + a owl:DatatypeProperty ; + rdfs:label "familyName"@en ; + rdfs:comment ""@en ; + rdfs:range xsd:string ; + . + +identity:givenName + a owl:DatatypeProperty ; + rdfs:label "givenName"@en ; + rdfs:comment ""@en ; + rdfs:range xsd:string ; + . + +identity:honorificPrefix + a owl:DatatypeProperty ; + rdfs:label "honorificPrefix"@en ; + rdfs:comment ""@en ; + rdfs:range xsd:string ; + . + +identity:honorificSuffix + a owl:DatatypeProperty ; + rdfs:label "honorificSuffix"@en ; + rdfs:comment ""@en ; + rdfs:range xsd:string ; + . + +location:GPSCoordinatesFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "GPSCoordinatesFacet"@en ; + rdfs:comment "A GPS coordinates facet is a grouping of characteristics unique to the expression of quantified dilution of precision (DOP) for an asserted set of geolocation coordinates typically associated with satellite navigation such as the Global Positioning System (GPS)."@en ; + sh:property + [ + sh:datatype xsd:double ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:hdop ; + ] , + [ + sh:datatype xsd:double ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:pdop ; + ] , + [ + sh:datatype xsd:double ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:tdop ; + ] , + [ + sh:datatype xsd:double ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:vdop ; + ] + ; + sh:targetClass location:GPSCoordinatesFacet ; + . + +location:LatLongCoordinatesFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "LatLongCoordinatesFacet"@en ; + rdfs:comment "A lat long coordinates facet is a grouping of characteristics unique to the expression of a geolocation as the intersection of specific latitude, longitude, and altitude values."@en ; + sh:property + [ + sh:datatype xsd:decimal ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:altitude ; + ] , + [ + sh:datatype xsd:decimal ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:latitude ; + ] , + [ + sh:datatype xsd:decimal ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:longitude ; + ] + ; + sh:targetClass location:LatLongCoordinatesFacet ; + . + +location:Location + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Location"@en ; + rdfs:comment "A location is a geospatial place, site, or position."@en ; + sh:targetClass location:Location ; + . + +location:SimpleAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "SimpleAddressFacet"@en ; + rdfs:comment "A simple address facet is a grouping of characteristics unique to a geolocation expressed as an administrative address."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:addressType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:country ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:locality ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:postalCode ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:region ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:street ; + ] + ; + sh:targetClass location:SimpleAddressFacet ; + . + +location:addressType + a owl:DatatypeProperty ; + rdfs:label "addressType"@en ; + rdfs:comment "The type of the address, for instance home or work."@en ; + rdfs:range xsd:string ; + . + +location:altitude + a owl:DatatypeProperty ; + rdfs:label "altitude"@en ; + rdfs:comment "The altitude coordinate of a geolocation."@en ; + rdfs:range xsd:decimal ; + . + +location:country + a owl:DatatypeProperty ; + rdfs:label "country"@en ; + rdfs:comment "The name of the geolocation country."@en ; + rdfs:range xsd:string ; + . + +location:hdop + a owl:DatatypeProperty ; + rdfs:label "hdop"@en ; + rdfs:comment "The horizontal dilution of precision of the GPS location."@en ; + rdfs:range xsd:double ; + . + +location:latitude + a owl:DatatypeProperty ; + rdfs:label "latitude"@en ; + rdfs:comment "The latitude coordinate of a geolocation."@en ; + rdfs:range xsd:decimal ; + . + +location:locality + a owl:DatatypeProperty ; + rdfs:label "locality"@en ; + rdfs:comment "The name of the geolocation locality (e.g., city)."@en ; + rdfs:range xsd:string ; + . + +location:longitude + a owl:DatatypeProperty ; + rdfs:label "longitude"@en ; + rdfs:comment "The longitude coordinate of a geolocation."@en ; + rdfs:range xsd:decimal ; + . + +location:pdop + a owl:DatatypeProperty ; + rdfs:label "pdop"@en ; + rdfs:comment "The positional (3D) dilution of precision of the GPS location."@en ; + rdfs:range xsd:double ; + . + +location:postalCode + a owl:DatatypeProperty ; + rdfs:label "postalCode"@en ; + rdfs:comment "The zip-code."@en ; + rdfs:range xsd:string ; + . + +location:region + a owl:DatatypeProperty ; + rdfs:label "region"@en ; + rdfs:comment "The name of the geolocation region (e.g., state)."@en ; + rdfs:range xsd:string ; + . + +location:street + a owl:DatatypeProperty ; + rdfs:label "street"@en ; + rdfs:comment "The name of the street."@en ; + rdfs:range xsd:string ; + . + +location:tdop + a owl:DatatypeProperty ; + rdfs:label "tdop"@en ; + rdfs:comment "The temporal dilution of precision of the GPS location."@en ; + rdfs:range xsd:double ; + . + +location:vdop + a owl:DatatypeProperty ; + rdfs:label "vdop"@en ; + rdfs:comment "The vertical dilution of precision of the GPS location."@en ; + rdfs:range xsd:double ; + . + +marking:GranularMarking + a + owl:Class , + sh:NodeShape + ; + rdfs:label "GranularMarking"@en ; + rdfs:comment "A granular marking is a grouping of characteristics unique to specification of marking definitions (restrictions, permissions, and other guidance for how data can be used and shared) that apply to particular portions of a particular UCO object."@en ; + sh:property + [ + sh:class marking:MarkingDefinition ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path marking:marking ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path marking:contentSelectors ; + ] + ; + sh:targetClass marking:GranularMarking ; + . + +marking:LicenseMarking + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf marking:MarkingModel ; + rdfs:label "License Marking"@en ; + rdfs:comment "A license marking is a grouping of characteristics unique to the expression of data marking definitions (restrictions, permissions, and other guidance for how data can be used and shared) to convey details of license restrictions that apply to the data."@en-US ; + sh:property + [ + sh:datatype xsd:string ; + sh:hasValue "license" ; + sh:nodeKind sh:Literal ; + sh:path marking:definitionType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path marking:license ; + ] + ; + sh:targetClass marking:LicenseMarking ; + . + +marking:MarkingDefinition + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:MarkingDefinitionAbstraction ; + rdfs:label "MarkingDefinition"@en ; + rdfs:comment "A marking definition is a grouping of characteristics unique to the expression of a specific data marking conveying restrictions, permissions, and other guidance for how marked data can be used and shared."@en ; + sh:property + [ + sh:class marking:MarkingModel ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path marking:definition ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path marking:definitionType ; + ] + ; + sh:targetClass marking:MarkingDefinition ; + . + +marking:MarkingModel + a + owl:Class , + sh:NodeShape + ; + rdfs:label "MarkingModel"@en ; + rdfs:comment "A marking model is a grouping of characteristics unique to the expression of a particular form of data marking definitions (restrictions, permissions, and other guidance for how data can be used and shared)."@en ; + sh:targetClass marking:MarkingModel ; + . + +marking:ReleaseToMarking + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf marking:MarkingModel ; + rdfs:label "Release-To Marking"@en ; + rdfs:comment "A release-to marking is a grouping of characteristics unique to the expression of data marking definitions (restrictions, permissions, and other guidance for how data can be used and shared) to convey details of authorized persons and/or organizations to which to the associated content may be released. The existence of the Release-To marking restricts access to ONLY those identities explicitly listed, regardless of whether another data marking exists that allows sharing with other members of the community."@en-US ; + sh:property + [ + sh:datatype xsd:string ; + sh:hasValue "release-to" ; + sh:nodeKind sh:Literal ; + sh:path marking:definitionType ; + ] , + [ + sh:datatype xsd:string ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path marking:authorizedIdentities ; + ] + ; + sh:targetClass marking:ReleaseToMarking ; + . + +marking:StatementMarking + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf marking:MarkingModel ; + rdfs:label "Statement Marking"@en ; + rdfs:comment "A statement marking is a grouping of characteristics unique to the expression of data marking definitions (restrictions, permissions, and other guidance for how data can be used and shared) to convey details of a textual marking statement, (e.g., copyright) whose semantic meaning should apply to the associated content. Statement markings are generally not machine-readable. An example of this would be a simple marking to apply copyright information, such as 'Copyright 2014 Acme Inc.'."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:hasValue "statement" ; + sh:nodeKind sh:Literal ; + sh:path marking:definitionType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path marking:statement ; + ] + ; + sh:targetClass marking:StatementMarking ; + . + +marking:TermsOfUseMarking + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf marking:MarkingModel ; + rdfs:label "Terms Of Use Marking"@en ; + rdfs:comment "A terms of use marking is a grouping of characteristics unique to the expression of data marking definitions (restrictions, permissions, and other guidance for how data can be used and shared) to convey details of a textual statement specifying the Terms of Use (that is, the conditions under which the content may be shared, applied, or otherwise used) of the marked content. An example of this would be used to communicate a simple statement, such as 'Acme Inc. is not responsible for the content of this file'."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:hasValue "terms-of-use" ; + sh:nodeKind sh:Literal ; + sh:path marking:definitionType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path marking:termsOfUse ; + ] + ; + sh:targetClass marking:TermsOfUseMarking ; + . + +marking:authorizedIdentities + a owl:DatatypeProperty ; + rdfs:label "Authorized Identities"@en ; + rdfs:comment "Specifies the identities that are authorized to access the data to which the data marking is associated. The list of authorized identities are represented as UUIDs."@en ; + rdfs:range xsd:string ; + . + +marking:contentSelectors + a owl:DatatypeProperty ; + rdfs:label "contentSelectors"@en ; + rdfs:comment """Explicit specification of exactly which portions of a UCO object to apply marking definitions to. + Specific syntax for how to specify the UCO object portions is dependent on the particular syntactic serialization implementation (XML, JSON, etc.) of UCO and MUST be explicitly specified in a separate binding specification for that syntactic serialization implementation (e.g. a UCO XML Binding Specification). """@en ; + rdfs:range xsd:string ; + . + +marking:definition + a owl:ObjectProperty ; + rdfs:label "definition"@en ; + rdfs:comment "Explicit specification of a data marking instance."@en ; + rdfs:range marking:MarkingModel ; + . + +marking:definitionType + a owl:DatatypeProperty ; + rdfs:label "definitionType"@en ; + rdfs:comment "Specifies the Marking Model for a Marking Definition."@en ; + rdfs:range xsd:string ; + . + +marking:license + a owl:DatatypeProperty ; + rdfs:label "License" ; + rdfs:comment "Specifies the identifier for the type of license" ; + rdfs:range xsd:string ; + . + +marking:marking + a owl:ObjectProperty ; + rdfs:label "marking"@en ; + rdfs:comment "Represents specific marking definitions to be applied to UCO data."@en ; + rdfs:range marking:MarkingDefinition ; + . + +marking:statement + a owl:DatatypeProperty ; + rdfs:label "Statement"@en-US ; + rdfs:comment "Specifies the statement to apply to the structure for which the Marking is to be applied."@en-US ; + rdfs:range xsd:string ; + . + +marking:termsOfUse + a owl:DatatypeProperty ; + rdfs:label "Terms of Use"@en-US ; + rdfs:comment "Specifies the terms of use that apply to the structure for which the Marking is to be applied."@en-US ; + rdfs:range xsd:string ; + . + +observable:API + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "API"@en ; + rdfs:comment "An API (application programming interface) is a computing interface that defines interactions between multiple software or mixed hardware-software intermediaries. It defines the kinds of calls or requests that can be made, how to make them, the data formats that should be used, the conventions to follow, etc. [based on https://en.wikipedia.org/wiki/API]"@en ; + sh:targetClass observable:API ; + . + +observable:ARPCache + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "ARPCache"@en ; + rdfs:comment "An ARP cache is a collection of Address Resolution Protocol (ARP) entries (mostly dynamic) that are created when an IP address is resolved to a MAC address (so the computer can effectively communicate with the IP address). [based on https://en.wikipedia.org/wiki/ARP_cache]"@en ; + sh:targetClass observable:ARPCache ; + . + +observable:ARPCacheEntry + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "ARPCacheEntry"@en ; + rdfs:comment "An ARP cache entry is a single Address Resolution Protocol (ARP) response record that is created when an IP address is resolved to a MAC address (so the computer can effectively communicate with the IP address). [based on https://en.wikipedia.org/wiki/ARP_cache]"@en ; + sh:targetClass observable:ARPCacheEntry ; + . + +observable:Account + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Account"@en ; + rdfs:comment "An account is an arrangement with an entity to enable and control the provision of some capability or service."@en ; + sh:targetClass observable:Account ; + . + +observable:AccountAuthenticationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "AccountAuthenticationFacet"@en ; + rdfs:comment "An account authentication facet is a grouping of characteristics unique to the mechanism of accessing an account."@en ; + sh:property + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:passwordLastChanged ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:password ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:passwordType ; + ] + ; + sh:targetClass observable:AccountAuthenticationFacet ; + . + +observable:AccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "AccountFacet"@en ; + rdfs:comment "An account facet is a grouping of characteristics unique to an arrangement with an entity to enable and control the provision of some capability or service."@en ; + sh:property + [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:accountIssuer ; + ] , + [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:owner ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isActive ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:expirationTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:modifiedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:accountIdentifier ; + ] , + [ + sh:datatype vocabulary1:AccountTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:accountType ; + ] + ; + sh:targetClass observable:AccountFacet ; + . + +observable:Address + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Address"@en ; + rdfs:comment "An address is an identifier assigned to enable routing and management of information."@en ; + sh:targetClass observable:Address ; + . + +observable:AlternateDataStream + a + owl:Class , + sh:NodeShape + ; + rdfs:label "AlternateDataStream"@en ; + rdfs:comment "An alternate data stream is data content stored within an NTFS file that is independent of the standard content stream of the file and is hidden from access by default NTFS file viewing mechanisms."@en ; + sh:property + [ + sh:class types:Hash ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:hashes ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:size ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:name ; + ] + ; + sh:targetClass observable:AlternateDataStream ; + . + +observable:Appliance + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Device ; + rdfs:label "Appliance"@en ; + rdfs:comment "An appliance is a purpose-built computer with software or firmware that is designed to provide a specific computing capability or resource. [based on https://en.wikipedia.org/wiki/Computer_appliance]"@en ; + sh:targetClass observable:Appliance ; + . + +observable:Application + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Application"@en ; + rdfs:comment "An application is a particular software program designed for end users."@en ; + sh:targetClass observable:Application ; + . + +observable:ApplicationAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAccount ; + rdfs:label "ApplicationAccount"@en ; + rdfs:comment "An application account is an account within a particular software program designed for end users."@en ; + sh:targetClass observable:ApplicationAccount ; + . + +observable:ApplicationAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ApplicationAccountFacet"@en ; + rdfs:comment "An application account facet is a grouping of characteristics unique to an account within a particular software program designed for end users."@en ; + sh:property [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] ; + sh:targetClass observable:ApplicationAccountFacet ; + . + +observable:ApplicationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ApplicationFacet"@en ; + rdfs:comment "An application facet is a grouping of characteristics unique to a particular software program designed for ends users."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:operatingSystem ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:numberOfLaunches ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:applicationIdentifier ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:version ; + ] + ; + sh:targetClass observable:ApplicationFacet ; + . + +observable:ArchiveFile + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:File ; + rdfs:label "ArchiveFile"@en ; + rdfs:comment "An archive file is a file that is composed of one or more computer files along with metadata."@en ; + sh:targetClass observable:ArchiveFile ; + . + +observable:ArchiveFileFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ArchiveFileFacet"@en ; + rdfs:comment "An archive file facet is a grouping of characteristics unique to a file that is composed of one or more computer files along with metadata."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:archiveType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:comment ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:version ; + ] + ; + sh:targetClass observable:ArchiveFileFacet ; + . + +observable:AttachmentFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "AttachmentFacet"@en ; + rdfs:comment "An attachment facet is a grouping of characteristics unique to the inclusion of an associated object as part of a message."@en ; + sh:property [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:url ; + ] ; + sh:targetClass observable:AttachmentFacet ; + . + +observable:Audio + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Audio"@en ; + rdfs:comment "Audio is a digital representation of sound."@en ; + sh:targetClass observable:Audio ; + . + +observable:AudioFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "AudioFacet"@en ; + rdfs:comment "An audio facet is a grouping of characteristics unique to a digital representation of sound."@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:bitRate ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:duration ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:audioType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:format ; + ] + ; + sh:targetClass observable:AudioFacet ; + . + +observable:AutonomousSystem + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "AutonomousSystem"@en ; + rdfs:comment "An autonomous system is a collection of connected Internet Protocol (IP) routing prefixes under the control of one or more network operators on behalf of a single administrative entity or domain that presents a common, clearly defined routing policy to the Internet. [based on https://en.wikipedia.org/wiki/Autonomous_system_(Internet)]"@en ; + sh:targetClass observable:AutonomousSystem ; + . + +observable:AutonomousSystemFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "AutonomousSystemFacet"@en ; + rdfs:comment "An autonomous system facet is a grouping of characteristics unique to a collection of connected Internet Protocol (IP) routing prefixes under the control of one or more network operators on behalf of a single administrative entity or domain that presents a common, clearly defined routing policy to the Internet. [based on https://en.wikipedia.org/wiki/Autonomous_system_(Internet)]"@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:number ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:asHandle ; + ] , + [ + sh:datatype vocabulary1:RegionalRegistryTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:regionalInternetRegistry ; + ] + ; + sh:targetClass observable:AutonomousSystemFacet ; + . + +observable:BlockDeviceNode + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "BlockDeviceNode"@en ; + rdfs:comment "A block device node is a UNIX filesystem special file that serves as a conduit to communicate with devices, providing buffered randomly accesible input and output. Block device nodes are used to apply access rights to the devices and to direct operations on the files to the appropriate device drivers. [based on https://en.wikipedia.org/wiki/Unix_file_types]"@en ; + sh:targetClass observable:BlockDeviceNode ; + . + +observable:BluetoothAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:MACAddress ; + rdfs:label "BluetoothAddress"@en ; + rdfs:comment "A Bluetooth address is a Bluetooth standard conformant identifier assigned to a Bluetooth device to enable routing and management of Bluetooth standards conformant communication to or from that device."@en ; + sh:targetClass observable:BluetoothAddress ; + . + +observable:BluetoothAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:MACAddressFacet ; + rdfs:label "BluetoothAddressFacet"@en ; + rdfs:comment "A Bluetooth address facet is a grouping of characteristics unique to a Bluetooth standard conformant identifier assigned to a Bluetooth device to enable routing and management of Bluetooth standards conformant communication to or from that device."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] ; + sh:targetClass observable:BluetoothAddressFacet ; + . + +observable:BotConfiguration + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "BotConfiguration"@en ; + rdfs:comment "A bot configuration is a set of contextual settings for a software application that runs automated tasks (scripts) over the Internet at a much higher rate than would be possible for a human alone."@en ; + sh:targetClass observable:BotConfiguration ; + . + +observable:BrowserBookmark + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "BrowserBookmark"@en ; + rdfs:comment "A browser bookmark is a saved shortcut that directs a WWW (World Wide Web) browser software program to a particular WWW accessible resource. [based on https://techterms.com/definition/bookmark]"@en ; + sh:targetClass observable:BrowserBookmark ; + . + +observable:BrowserBookmarkFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "BrowserBookmarkFacet"@en ; + rdfs:comment "A browser bookmark facet is a grouping of characteristics unique to a saved shortcut that directs a WWW (World Wide Web) browser software program to a particular WWW accessible resource. [based on https://techterms.com/definition/bookmark]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:datatype xsd:anyURI ; + sh:nodeKind sh:Literal ; + sh:path observable:urlTargeted ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:accessedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:modifiedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:visitCount ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:bookmarkPath ; + ] + ; + sh:targetClass observable:BrowserBookmarkFacet ; + . + +observable:BrowserCookie + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "BrowserCookie"@en ; + rdfs:comment "A browser cookie is a piece of of data sent from a website and stored on the user's computer by the user's web browser while the user is browsing. [based on https://en.wikipedia.org/wiki/HTTP_cookie]"@en ; + sh:targetClass observable:BrowserCookie ; + . + +observable:BrowserCookieFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "BrowserCookieFacet"@en ; + rdfs:comment "A browser cookie facet is a grouping of characteristics unique to a piece of data sent from a website and stored on the user's computer by the user's web browser while the user is browsing. [based on https://en.wikipedia.org/wiki/HTTP_cookie]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:cookieDomain ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isSecure ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:accessedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:expirationTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:cookieName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:cookiePath ; + ] + ; + sh:targetClass observable:BrowserCookieFacet ; + . + +observable:Calendar + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Calendar"@en ; + rdfs:comment "A calendar is a collection of appointments, meetings, and events."@en ; + sh:targetClass observable:Calendar ; + . + +observable:CalendarEntry + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "CalendarEntry"@en ; + rdfs:comment "A calendar entry is an appointment, meeting or event within a collection of appointments, meetings and events."@en ; + sh:targetClass observable:CalendarEntry ; + . + +observable:CalendarEntryFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "CalendarEntryFacet"@en ; + rdfs:comment "A calendar entry facet is a grouping of characteristics unique to an appointment, meeting, or event within a collection of appointments, meetings, and events."@en ; + sh:property + [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:owner ; + ] , + [ + sh:class identity:Identity ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:attendant ; + ] , + [ + sh:class location:Location ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:location ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isPrivate ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:modifiedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:remindTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:startTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:duration ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:eventStatus ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:eventType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:recurrence ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subject ; + ] + ; + sh:targetClass observable:CalendarEntryFacet ; + . + +observable:CalendarFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "CalendarFacet"@en ; + rdfs:comment "A calendar facet is a grouping of characteristics unique to a collection of appointments, meetings, and events."@en ; + sh:property + [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:owner ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] + ; + sh:targetClass observable:CalendarFacet ; + . + +observable:CharacterDeviceNode + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "CharacterDeviceNode"@en ; + rdfs:comment "A character device node is a UNIX filesystem special file that serves as a conduit to communicate with devices, providing only a serial stream of input or accepting a serial stream of output. Character device nodes are used to apply access rights to the devices and to direct operations on the files to the appropriate device drivers. [based on https://en.wikipedia.org/wiki/Unix_file_types]"@en ; + sh:targetClass observable:CharacterDeviceNode ; + . + +observable:Code + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Code"@en ; + rdfs:comment "Code is a direct representation (source, byte or binary) of a collection of computer instructions that form software which tell a computer how to work. [based on https://en.wikipedia.org/wiki/Software]"@en ; + sh:targetClass observable:Code ; + . + +observable:CompressedStreamFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "CompressedStreamFacet"@en ; + rdfs:comment "A compressed stream facet is a grouping of characteristics unique to the application of a size-reduction process to a body of data content."@en ; + sh:property + [ + sh:datatype xsd:double ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:compressionRatio ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:compressionMethod ; + ] + ; + sh:targetClass observable:CompressedStreamFacet ; + . + +observable:ComputerSpecification + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "ComputerSpecification"@en ; + rdfs:comment "A computer specification is the hardware and software of a programmable electronic device that can store, retrieve, and process data. {based on merriam-webster.com/dictionary/computer]"@en ; + sh:targetClass observable:ComputerSpecification ; + . + +observable:ComputerSpecificationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ComputerSpecificationFacet"@en ; + rdfs:comment "A computer specificaiton facet is a grouping of characteristics unique to the hardware and software of a programmable electronic device that can store, retrieve, and process data. [based on merriam-webster.com/dictionary/computer]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:networkInterface ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:biosDate ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:biosReleaseDate ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:currentSystemDate ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:localTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:systemTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:availableRam ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:totalRam ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:biosManufacturer ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:biosSerialNumber ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:biosVersion ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:cpu ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:cpuFamily ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:gpu ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:gpuFamily ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:hostname ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:processorArchitecture ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:timezoneDST ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:timezoneStandard ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:uptime ; + ] + ; + sh:targetClass observable:ComputerSpecificationFacet ; + . + +observable:Contact + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Contact"@en ; + rdfs:comment "A contact is a set of identification and communication related details for a single entity."@en ; + sh:targetClass observable:Contact ; + . + +observable:ContactAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ContactAddress"@en ; + rdfs:comment "A contact address is a grouping of characteristics unique to a geolocation address of a contact entity."@en ; + sh:property + [ + sh:class location:Location ; + sh:datatype location:Location ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:geolocationAddress ; + ] , + [ + sh:datatype vocabulary1:ContactAddressScopeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contactAddressScope ; + ] + ; + sh:targetClass observable:ContactAddress ; + . + +observable:ContactAffiliation + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ContactListAffiliation"@en ; + rdfs:comment "A contact affiliation is a grouping of characteristics unique to details of an organizational affiliation for a single contact entity."@en ; + sh:property + [ + sh:class identity:Organization ; + sh:datatype identity:Organization ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactOrganization ; + ] , + [ + sh:class observable:ContactAddress ; + sh:datatype observable:ContactAddress ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:organizationLocation ; + ] , + [ + sh:class observable:ContactEmail ; + sh:datatype observable:ContactEmail ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactEmail ; + ] , + [ + sh:class observable:ContactMessaging ; + sh:datatype observable:ContactMessaging ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactMessaging ; + ] , + [ + sh:class observable:ContactPhone ; + sh:datatype observable:ContactPhone ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactPhone ; + ] , + [ + sh:class observable:ContactProfile ; + sh:datatype observable:ContactProfile ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactProfile ; + ] , + [ + sh:class observable:ContactURL ; + sh:datatype observable:ContactURL ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactURL ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:organizationDepartment ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:organizationPosition ; + ] + ; + sh:targetClass observable:ContactAffiliation ; + . + +observable:ContactEmail + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ContactEmail"@en ; + rdfs:comment "A contact email is a grouping of characteristics unique to details for contacting a contact entity by email."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:emailAddress ; + ] , + [ + sh:datatype vocabulary1:ContactEmailScopeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contactEmailScope ; + ] + ; + sh:targetClass observable:ContactEmail ; + . + +observable:ContactFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ContactFacet"@en ; + rdfs:comment "A contact facet is a grouping of characteristics unique to a set of identification and communication related details for a single entity."@en ; + sh:property + [ + sh:class observable:ContactAddress ; + sh:datatype observable:ContactAddress ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactAddress ; + ] , + [ + sh:class observable:ContactAffiliation ; + sh:datatype observable:ContactAffiliation ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactAffiliation ; + ] , + [ + sh:class observable:ContactEmail ; + sh:datatype observable:ContactEmail ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactEmail ; + ] , + [ + sh:class observable:ContactMessaging ; + sh:datatype observable:ContactMessaging ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactMessaging ; + ] , + [ + sh:class observable:ContactPhone ; + sh:datatype observable:ContactPhone ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactPhone ; + ] , + [ + sh:class observable:ContactProfile ; + sh:datatype observable:ContactProfile ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactProfile ; + ] , + [ + sh:class observable:ContactSIP ; + sh:datatype observable:ContactSIP ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactSIP ; + ] , + [ + sh:class observable:ContactURL ; + sh:datatype observable:ContactURL ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactURL ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:sourceApplication ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path identity:birthdate ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:lastTimeContacted ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:numberTimesContacted ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contactID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:firstName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:lastName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:middleName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:namePhonetic ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:namePrefix ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:nameSuffix ; + ] , + [ + sh:datatype xsd:string ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contactGroup ; + ] , + [ + sh:datatype xsd:string ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contactNote ; + ] , + [ + sh:datatype xsd:string ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:nickname ; + ] + ; + sh:targetClass observable:ContactFacet ; + . + +observable:ContactList + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "ContactList"@en ; + rdfs:comment "A contact list is a set of multiple individual contacts such as that found in a digital address book."@en ; + sh:targetClass observable:ContactList ; + . + +observable:ContactListFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ContactListFacet"@en ; + rdfs:comment "A contact list facet is a grouping of characteristics unique to a set of multiple individual contacts such as that found in a digital address book."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:sourceApplication ; + ] , + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contact ; + ] + ; + sh:targetClass observable:ContactListFacet ; + . + +observable:ContactMessaging + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ContactMessaging"@en ; + rdfs:comment "A contact messaging is a grouping of characteristics unique to details for contacting a contact entity by digital messaging."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactMessagingPlatform ; + ] , + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:messagingAddress ; + ] + ; + sh:targetClass observable:ContactMessaging ; + . + +observable:ContactPhone + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ContactPhone"@en ; + rdfs:comment "A contact phone is a grouping of characteristics unique to details for contacting a contact entity by telephone."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactPhoneNumber ; + ] , + [ + sh:datatype vocabulary1:ContactPhoneScopeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contactPhoneScope ; + ] + ; + sh:targetClass observable:ContactPhone ; + . + +observable:ContactProfile + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ContactProfile"@en ; + rdfs:comment "A contact profile is a grouping of characteristics unique to details for contacting a contact entity by online service."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactProfilePlatform ; + ] , + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profile ; + ] + ; + sh:targetClass observable:ContactProfile ; + . + +observable:ContactSIP + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ContactSIP"@en ; + rdfs:comment "A contact SIP is a grouping of characteristics unique to details for contacting a contact entity by Session Initiation Protocol (SIP)."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:sipAddress ; + ] , + [ + sh:datatype vocabulary1:ContactSIPScopeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contactSIPScope ; + ] + ; + sh:targetClass observable:ContactSIP ; + . + +observable:ContactURL + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ContactURL"@en ; + rdfs:comment "A contact URL is a grouping of characteristics unique to details for contacting a contact entity by Uniform Resource Locator (URL)."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:datatype observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:url ; + ] , + [ + sh:datatype vocabulary1:ContactURLScopeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contactURLScope ; + ] + ; + sh:targetClass observable:ContactURL ; + . + +observable:ContentData + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "ContentData"@en ; + rdfs:comment "Content data is a block of digital data."@en ; + sh:targetClass observable:ContentData ; + . + +observable:ContentDataFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ContentDataFacet"@en ; + rdfs:comment "A content data facet is a grouping of characteristics unique to a block of digital data."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:dataPayloadReferenceURL ; + ] , + [ + sh:class types:Hash ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:hash ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isEncrypted ; + ] , + [ + sh:datatype xsd:double ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:entropy ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeInBytes ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:dataPayload ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:magicNumber ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mimeClass ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mimeType ; + ] , + [ + sh:datatype vocabulary1:EndiannessTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:byteOrder ; + ] + ; + sh:targetClass observable:ContentDataFacet ; + . + +observable:CookieHistory + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "CookieHistory"@en ; + rdfs:comment "A cookie history is the stored web cookie history for a particular web browser."@en ; + sh:targetClass observable:CookieHistory ; + . + +observable:Credential + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Credential"@en ; + rdfs:comment "A credential is a single specific login and password combination for authorization of access to a digital account or system."@en ; + sh:targetClass observable:Credential ; + . + +observable:CredentialDump + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "CredentialDump"@en ; + rdfs:comment "A credential dump is a collection (typically forcibly extracted from a system) of specific login and password combinations for authorization of access to a digital account or system."@en ; + sh:targetClass observable:CredentialDump ; + . + +observable:DNSCache + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "DNSCache"@en ; + rdfs:comment "An DNS cache is a temporary locally stored collection of previous Domain Name System (DNS) query results (created when an domain name is resolved to a IP address) for a particular computer."@en ; + sh:targetClass observable:DNSCache ; + . + +observable:DNSRecord + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "DNSRecord"@en ; + rdfs:comment "A DNS record is a single Domain Name System (DNS) artifact specifying information of a particular type (routing, authority, responsibility, security, etc.) for a specific Internet domain name."@en ; + sh:targetClass observable:DNSRecord ; + . + +observable:DataRangeFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DataRangeFacet"@en ; + rdfs:comment "A data range facet is a grouping of characteristics unique to a particular contiguous scope within a block of digital data."@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:rangeOffset ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:rangeSize ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:rangeOffsetType ; + ] + ; + sh:targetClass observable:DataRangeFacet ; + . + +observable:DefinedEffectFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DefinedEffectFacet"@en ; + rdfs:comment "A defined effect facet is a grouping of characteristics unique to the effect of an observable action in relation to one or more observable objects."@en ; + sh:targetClass observable:DefinedEffectFacet ; + . + +observable:Device + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Device"@en ; + rdfs:comment "A device is a piece of equipment or a mechanism designed to serve a special purpose or perform a special function. [based on https://www.merriam-webster.com/dictionary/device]"@en ; + sh:targetClass observable:Device ; + . + +observable:DeviceFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DeviceFacet"@en ; + rdfs:comment "A device facet is a grouping of characteristics unique to a piece of equipment or a mechanism designed to serve a special purpose or perform a special function. [based on https://www.merriam-webster.com/dictionary/device]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:deviceType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:manufacturer ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:model ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:serialNumber ; + ] + ; + sh:targetClass observable:DeviceFacet ; + . + +observable:DigitalAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Account ; + rdfs:label "DigitalAccount"@en ; + rdfs:comment "A digital account is an arrangement with an entity to enable and control the provision of some capability or service within the digital domain."@en ; + sh:targetClass observable:DigitalAccount ; + . + +observable:DigitalAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DigitalAccountFacet"@en ; + rdfs:comment "A digital account facet is a grouping of characteristics unique to an arrangement with an entity to enable and control the provision of some capability or service within the digital domain."@en ; + sh:property + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isDisabled ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:firstLoginTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:lastLoginTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:accountLogin ; + ] + ; + sh:targetClass observable:DigitalAccountFacet ; + . + +observable:DigitalAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Address ; + rdfs:label "DigitalAddress"@en ; + rdfs:comment "A digital address is an identifier assigned to enable routing and management of digital communication."@en ; + sh:targetClass observable:DigitalAddress ; + . + +observable:DigitalAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DigitalAddressFacet"@en ; + rdfs:comment "A digital address facet is a grouping of characteristics unique to an identifier assigned to enable routing and management of digital communication."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] + ; + sh:targetClass observable:DigitalAddressFacet ; + . + +observable:DigitalSignatureInfo + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "DigitalSignatureInfo"@en ; + rdfs:comment "A digital signature info is a value calculated via a mathematical scheme for demonstrating the authenticity of an electronic message or document."@en ; + sh:targetClass observable:DigitalSignatureInfo ; + . + +observable:DigitalSignatureInfoFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DigitalSignatureInfoFacet"@en ; + rdfs:comment "A digital signature info facet is a grouping of characteristics unique to a value calculated via a mathematical scheme for demonstrating the authenticity of an electronic message or document."@en ; + sh:property + [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:certificateSubject ; + ] , + [ + sh:class identity:Identity ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:certificateIssuer ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:signatureExists ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:signatureVerified ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:signatureDescription ; + ] + ; + sh:targetClass observable:DigitalSignatureInfoFacet ; + . + +observable:Directory + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "Directory"@en ; + rdfs:comment "A directory is a file system cataloging structure which contains references to other computer files, and possibly other directories. On many computers, directories are known as folders, or drawers, analogous to a workbench or the traditional office filing cabinet. In UNIX a directory is implemented as a special file. [based on https://en.wikipedia.org/wiki/Directory_(computing)]"@en ; + sh:targetClass observable:Directory ; + . + +observable:Disk + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Disk"@en ; + rdfs:comment "A disk is a storage mechanism where data is recorded by various electronic, magnetic, optical, or mechanical changes to a surface layer of one or more rotating disks."@en ; + sh:targetClass observable:Disk ; + . + +observable:DiskFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DiskFacet"@en ; + rdfs:comment "A disk facet is a grouping of characteristics unique to a storage mechanism where data is recorded by various electronic, magnetic, optical, or mechanical changes to a surface layer of one or more rotating disks."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:partition ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:diskSize ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:freeSpace ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:diskType ; + ] + ; + sh:targetClass observable:DiskFacet ; + . + +observable:DiskPartition + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "DiskPartition"@en ; + rdfs:comment "A disk partition is a particular managed region on a storage mechanism where data is recorded by various electronic, magnetic, optical, or mechanical changes to a surface layer of one or more rotating disks. [based on https://en.wikipedia.org/wiki/Disk_storage]"@en ; + sh:targetClass observable:DiskPartition ; + . + +observable:DiskPartitionFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DiskPartitionFacet"@en ; + rdfs:comment "A disk partition facet is a grouping of characteristics unique to a particular managed region on a storage mechanism."@en ; + sh:property + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:partitionLength ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:partitionOffset ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:spaceLeft ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:spaceUsed ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:totalSpace ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:diskPartitionType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mountPoint ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:partitionID ; + ] + ; + sh:targetClass observable:DiskPartitionFacet ; + . + +observable:DomainName + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "DomainName"@en ; + rdfs:comment "A domain name is an identification string that defines a realm of administrative autonomy, authority or control within the Internet. [based on https://en.wikipedia.org/wiki/Domain_name]"@en ; + sh:targetClass observable:DomainName ; + . + +observable:DomainNameFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "DomainNameFacet"@en ; + rdfs:comment "A domain name facet is a grouping of characteristics unique to an identification string that defines a realm of administrative autonomy, authority or control within the Internet. [based on https://en.wikipedia.org/wiki/Domain_name]"@en ; + sh:property + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isTLD ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:value ; + ] + ; + sh:targetClass observable:DomainNameFacet ; + . + +observable:ESN + a owl:DatatypeProperty ; + rdfs:label "ESN"@en ; + rdfs:comment "Electronic Serial Number ."@en ; + rdfs:range xsd:string ; + . + +observable:EXIFFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "EXIFFacet"@en ; + rdfs:comment "An EXIF (exchangeable image file format) facet is a grouping of characteristics unique to the formats for images, sound, and ancillary tags used by digital cameras (including smartphones), scanners and other systems handling image and sound files recorded by digital cameras conformant to JEIDA/JEITA/CIPA specifications. [based on https://en.wikipedia.org/wiki/Exif]"@en ; + sh:property [ + sh:class types:ControlledDictionary ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:exifData ; + ] ; + sh:targetClass observable:EXIFFacet ; + . + +observable:EmailAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAccount ; + rdfs:label "EmailAccount"@en ; + rdfs:comment "An email account is an arrangement with an entity to enable and control the provision of electronic mail (email) capabilities or services."@en ; + sh:targetClass observable:EmailAccount ; + . + +observable:EmailAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "EmailAccountFacet"@en ; + rdfs:comment "An email account facet is a grouping of characteristics unique to an arrangement with an entity to enable and control the provision of electronic mail (email) capabilities or services."@en ; + sh:property [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:emailAddress ; + ] ; + sh:targetClass observable:EmailAccountFacet ; + . + +observable:EmailAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddress ; + rdfs:label "EmailAddress"@en ; + rdfs:comment "An email address is an identifier for an electronic mailbox to which electronic mail messages (conformant to the Simple Mail Transfer Protocol (SMTP)) are sent from and delivered to."@en ; + sh:targetClass observable:EmailAddress ; + . + +observable:EmailAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddressFacet ; + rdfs:label "EmailAddressFacet"@en ; + rdfs:comment "An email address facet is a grouping of characteristics unique to an identifier for an electronic mailbox to which electronic mail messages (conformant to the Simple Mail Transfer Protocol (SMTP)) are sent from and delivered to."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] + ; + sh:targetClass observable:EmailAddressFacet ; + . + +observable:EmailMessage + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Message ; + rdfs:label "EmailMessage"@en ; + rdfs:comment "An email message is a message that is an instance of an electronic mail correspondence conformant to the internet message format described in RFC 5322 and related RFCs."@en ; + sh:targetClass observable:EmailMessage ; + . + +observable:EmailMessageFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "EmailMessageFacet"@en ; + rdfs:comment "An email message facet is a grouping of characteristics unique to a message that is an instance of an electronic mail correspondence conformant to the internet message format described in RFC 5322 and related RFCs."@en ; + sh:property + [ + sh:class observable:MimePartType ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:bodyMultipart ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:bodyRaw ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:from ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:headerRaw ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:inReplyTo ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:sender ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:xOriginatingIP ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:bcc ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:cc ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:references ; + ] , + [ + sh:class types:Dictionary ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:otherHeaders ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isMimeEncoded ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isMultipart ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isRead ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:modifiedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:receivedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sentTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:body ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contentDisposition ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contentType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:messageID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:priority ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subject ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:xMailer ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:categories ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:labels ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:receivedLines ; + ] + ; + sh:targetClass observable:EmailMessageFacet ; + . + +observable:EncodedStreamFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "EncodedStreamFacet"@en ; + rdfs:comment "An encoded stream facet is a grouping of characteristics unique to the conversion of a body of data content from one form to another form."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:encodingMethod ; + ] ; + sh:targetClass observable:EncodedStreamFacet ; + . + +observable:EncryptedStreamFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "EncryptedStreamFacet"@en ; + rdfs:comment "An encrypted stream facet is a grouping of characteristics unique to the conversion of a body of data content from one form to another obfuscated form in such a way that reversing the conversion to obtain the original data form can only be accomplished through possession and use of a specific key."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:encryptionMethod ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:encryptionMode ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:encryptionIV ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:encryptionKey ; + ] + ; + sh:targetClass observable:EncryptedStreamFacet ; + . + +observable:EnvironmentVariable + a + owl:Class , + sh:NodeShape + ; + rdfs:label "EnvironmentVariable"@en ; + rdfs:comment "An environment variable is a grouping of characteristics unique to a dynamic-named value that can affect the way running processes will behave on a computer. [based on https://en.wikipedia.org/wiki/Environment_variable]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:name ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:value ; + ] + ; + sh:targetClass observable:EnvironmentVariable ; + . + +observable:Event + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Event"@en ; + rdfs:comment "An event is something that happens in a digital context (e.g., operating system events)."@en ; + sh:targetClass observable:Event ; + . + +observable:EventFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "EventFacet"@en ; + rdfs:comment "An event facet is a grouping of characteristics unique to something that happens in a digital context (e.g., operating system events)."@en ; + sh:property + [ + sh:class observable:ObservableAction ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:cyberAction ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:computerName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:eventID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:eventText ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:eventType ; + ] + ; + sh:targetClass observable:EventFacet ; + . + +observable:EventLog + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "EventLog"@en ; + rdfs:comment "An event log is a recorded collection of events."@en ; + sh:targetClass observable:EventLog ; + . + +observable:ExtInodeFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ExtInodeFacet"@en ; + rdfs:comment "An extInode facet is a grouping of characteristics unique to a file system object (file, directory, etc.) conformant to the extended file system (EXT or related derivations) specification."@en ; + sh:property + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extDeletionTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extInodeChangeTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extFileType ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extFlags ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extHardLinkCount ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extInodeID ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extPermissions ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extSGID ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extSUID ; + ] + ; + sh:targetClass observable:ExtInodeFacet ; + . + +observable:ExtractedString + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ExtractedString"@en ; + rdfs:comment "An extracted string is a grouping of characteristics unique to a series of characters pulled from an observable object."@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:length ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:encoding ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:englishTranslation ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:language ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:stringValue ; + ] , + [ + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:byteStringValue ; + ] + ; + sh:targetClass observable:ExtractedString ; + . + +observable:ExtractedStringsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ExtractedStringsFacet"@en ; + rdfs:comment "An extracted strings facet is a grouping of characteristics unique to one or more sequences of characters pulled from an observable object."@en ; + sh:property [ + sh:class observable:ExtractedString ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:strings ; + ] ; + sh:targetClass observable:ExtractedStringsFacet ; + . + +observable:File + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "File"@en ; + rdfs:comment "A file is a computer resource for recording data discretely on a computer storage device."@en ; + sh:targetClass observable:File ; + . + +observable:FileFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "FileFacet"@en ; + rdfs:comment "A file facet is a grouping of characteristics unique to the storage of a file (computer resource for recording data discretely in a computer storage device) on a file system (process that manages how and where data on a storage device is stored, accessed and managed). [based on https://en.wikipedia.org/Computer_file and https://www.techopedia.com/definition/5510/file-system]"@en ; + sh:property + [ + rdfs:comment "When used to characterize a file the sizeInBytes property conveys the recorded size of a file in a file system."@en ; + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeInBytes ; + ] , + [ + sh:datatype xsd:boolean ; + sh:nodeKind sh:Literal ; + sh:path observable:isDirectory ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:accessedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:metadataChangeTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:modifiedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:allocationStatus ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extension ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:fileSystemType ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:fileName ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:filePath ; + ] + ; + sh:targetClass observable:FileFacet ; + . + +observable:FilePermissionsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "FilePermissionsFacet"@en ; + rdfs:comment "A file permissions facet is a grouping of characteristics unique to the access rights (e.g., view, change, navigate, execute) of a file on a file system."@en ; + sh:property [ + sh:class core:UcoObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:owner ; + ] ; + sh:targetClass observable:FilePermissionsFacet ; + . + +observable:FileSystem + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "FileSystem"@en ; + rdfs:comment "A file system is the process that manages how and where data on a storage medium is stored, accessed and managed. [based on https://www.techopedia.com/definition/5510/file-system]"@en ; + sh:targetClass observable:FileSystem ; + . + +observable:FileSystemFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "FileSystemFacet"@en ; + rdfs:comment "A file system facet is a grouping of characteristics unique to the process that manages how and where data on a storage medium is stored, accessed and managed. [based on https://www.techopedia.com/definition/5510/file-system]"@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:clusterSize ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:fileSystemType ; + ] + ; + sh:targetClass observable:FileSystemFacet ; + . + +observable:FileSystemObject + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "FileSystemObject"@en ; + rdfs:comment "A file system object is an informational object represented and managed within a file system."@en ; + sh:targetClass observable:FileSystemObject ; + . + +observable:ForumPost + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Message ; + rdfs:label "ForumPost"@en ; + rdfs:comment "A forum post is message submitted by a user account to an online forum where the message content (and typically metadata including who posted it and when) is viewable by any party with viewing permissions on the forum."@en ; + sh:targetClass observable:ForumPost ; + . + +observable:ForumPrivateMessage + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Message ; + rdfs:label "ForumPrivateMessage"@en ; + rdfs:comment "A forum private message (aka PM or DM (direct message)) is a one-to-one message from one specific user account to another specific user account on an online form where transmission is managed by the online forum platform and the message is only viewable by the parties directly involved."@en ; + sh:targetClass observable:ForumPrivateMessage ; + . + +observable:FragmentFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "FragmentFacet"@en ; + rdfs:comment "A fragment facet is a grouping of characteristics unique to an individual piece of the content of a file."@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:fragmentIndex ; + ] , + [ + sh:datatype xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:totalFragments ; + ] + ; + sh:targetClass observable:FragmentFacet ; + . + +observable:GUI + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "GUI"@en ; + rdfs:comment "A GUI is a graphical user interface that allows users to interact with electronic devices through graphical icons and audio indicators such as primary notation, instead of text-based user interfaces, typed command labels or text navigation. [based on https://en.wikipedia.org/wiki/Graphical_user_interface]"@en ; + sh:targetClass observable:GUI ; + . + +observable:GenericObservableObject + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "GenericObservableObject"@en ; + rdfs:comment "A generic observable object is an article or unit within the digital domain."@en ; + sh:targetClass observable:GenericObservableObject ; + . + +observable:GeoLocationEntry + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "GeoLocationEntry"@en ; + rdfs:comment "A geolocation entry is a single application-specific geolocation entry."@en ; + sh:targetClass observable:GeoLocationEntry ; + . + +observable:GeoLocationEntryFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "GeoLocationEntryFacet"@en ; + rdfs:comment "A geolocation entry facet is a grouping of characteristics unique to a single application-specific geolocation entry."@en ; + sh:property + [ + sh:class location:Location ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:location ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] + ; + sh:targetClass observable:GeoLocationEntryFacet ; + . + +observable:GeoLocationLog + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "GeoLocationLog"@en ; + rdfs:comment "A geolocation log is a record containing geolocation tracks and/or geolocation entries."@en ; + sh:targetClass observable:GeoLocationLog ; + . + +observable:GeoLocationLogFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "GeoLocationLogFacet"@en ; + rdfs:comment "A geolocation log facet is a grouping of characteristics unique to a record containing geolocation tracks and/or geolocation entries."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] + ; + sh:targetClass observable:GeoLocationLogFacet ; + . + +observable:GeoLocationTrack + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "GeoLocationTrack"@en ; + rdfs:comment "A geolocation track is a set of contiguous geolocation entries representing a path/track taken."@en ; + sh:targetClass observable:GeoLocationTrack ; + . + +observable:GeoLocationTrackFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "GeoLocationTrackFacet"@en ; + rdfs:comment "A geolocation track facet is a grouping of characteristics unique to a set of contiguous geolocation entries representing a path/track taken."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:geoLocationEntry ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:startTime ; + ] + ; + sh:targetClass observable:GeoLocationTrackFacet ; + . + +observable:GlobalFlagType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "GlobalFlagType"@en ; + rdfs:comment 'A global flag type is a grouping of characteristics unique to the Windows systemwide global variable named NtGlobalFlag that enables various internal debugging, tracing, and validation support in the operating system. [based on "Windows Global Flags, Chapter 3: System Mechanisms of Windows Internals by Solomon, Russinovich, and Ionescu]'@en ; + sh:property + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:hexadecimalValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:abbreviation ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:destination ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:symbolicName ; + ] + ; + sh:targetClass observable:GlobalFlagType ; + . + +observable:HTTPConnection + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:NetworkConnection ; + rdfs:label "HTTPConnection"@en ; + rdfs:comment "An HTTP connection is network connection that is conformant to the Hypertext Transfer Protocol (HTTP) standard."@en ; + sh:targetClass observable:HTTPConnection ; + . + +observable:HTTPConnectionFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "HTTPConnectionFacet"@en ; + rdfs:comment "An HTTP connection facet is a grouping of characteristics unique to portions of a network connection that are conformant to the Hypertext Transfer Protocol (HTTP) standard."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:httpMessageBodyData ; + ] , + [ + sh:class types:Dictionary ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:httpRequestHeader ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:httpMesageBodyLength ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:requestMethod ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:requestValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:requestVersion ; + ] + ; + sh:targetClass observable:HTTPConnectionFacet ; + . + +observable:Hostname + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Hostname"@en ; + rdfs:comment "A hostname is a label that is assigned to a device connected to a computer network and that is used to identify the device in various forms of electronic communication, such as the World Wide Web. A hostname may be a domain name, if it is properly organized into the domain name system. A domain name may be a hostname if it has been assigned to an Internet host and associated with the host's IP address. [based on https://en.wikipedia.org/wiki/Hostname]"@en ; + sh:targetClass observable:Hostname ; + . + +observable:ICCID + a owl:DatatypeProperty ; + rdfs:label "ICCID"@en ; + rdfs:comment "Integrated circuit card identifier (http://www.itu.int/)."@en ; + rdfs:range xsd:string ; + . + +observable:ICMPConnection + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:NetworkConnection ; + rdfs:label "ICMPConnection"@en ; + rdfs:comment "An ICMP connection is a network connection that is conformant to the Internet Control Message Protocol (ICMP) standard."@en ; + sh:targetClass observable:ICMPConnection ; + . + +observable:ICMPConnectionFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ICMPConnectionFacet"@en ; + rdfs:comment "An ICMP connection facet is a grouping of characteristics unique to portions of a network connection that are conformant to the Internet Control Message Protocol (ICMP) standard."@en ; + sh:property + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:icmpCode ; + ] , + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:icmpType ; + ] + ; + sh:targetClass observable:ICMPConnectionFacet ; + . + +observable:IComHandlerActionType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "IComHandlerActionType"@en ; + rdfs:comment "An IComHandler action type is a grouping of characteristics unique to a Windows Task-related action that fires a Windows COM handler (smart code in the client address space that can optimize calls between a client and server). [based on https://docs.microsoft.com/en-us/windows/win32/taskschd/comhandleraction]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:comClassID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:comData ; + ] + ; + sh:targetClass observable:IComHandlerActionType ; + . + +observable:IExecActionType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "IExecActionType"@en ; + rdfs:comment "An IExec action type is a grouping of characteristics unique to an action that executes a command-line operation on a Windows operating system. [based on https://docs.microsoft.com/en-us/windows/win32/api/taskschd/nn-taskschd-iexecaction?redirectedfrom=MSDN]"@en ; + sh:property + [ + sh:class types:Hash ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:execProgramHashes ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:execArguments ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:execProgramPath ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:execWorkingDirectory ; + ] + ; + sh:targetClass observable:IExecActionType ; + . + +observable:IMEI + a owl:DatatypeProperty ; + rdfs:label "IMEI"@en ; + rdfs:comment "International Mobile Equipment Identity (IMEI)."@en ; + rdfs:range xsd:string ; + . + +observable:IMSI + a owl:DatatypeProperty ; + rdfs:label "IMSI"@en ; + rdfs:comment "An International Mobile Subscriber Identity (IMSI) is a unique identification associated with all GSM and UMTS network mobile phone users. It is stored as a 64-bit field in the SIM inside the phone and is sent by the phone to the network."@en ; + rdfs:range xsd:string ; + . + +observable:IPAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddress ; + rdfs:label "IPAddress"@en ; + rdfs:comment "An IP address is an Internet Protocol (IP) standards conformant identifier assigned to a device to enable routing and management of IP standards conformant communication to or from that device."@en ; + sh:targetClass observable:IPAddress ; + . + +observable:IPAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddressFacet ; + rdfs:label "IPAddressFacet"@en ; + rdfs:comment "An IP address facet is a grouping of characteristics unique to an Internet Protocol (IP) standards conformant identifier assigned to a device to enable routing and management of IP standards conformant communication to or from that device."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] + ; + sh:targetClass observable:IPAddressFacet ; + . + +observable:IPNetmask + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "IPNetmask"@en ; + rdfs:comment "An IP netmask is a 32-bit \"mask\" used to divide an IP address into subnets and specify the network's available hosts."@en ; + sh:targetClass observable:IPNetmask ; + . + +observable:IPv4Address + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:IPAddress ; + rdfs:label "IPv4Address"@en ; + rdfs:comment "An IPv4 (Internet Protocol version 4) address is an IPv4 standards conformant identifier assigned to a device to enable routing and management of IPv4 standards conformant communication to or from that device."@en ; + sh:targetClass observable:IPv4Address ; + . + +observable:IPv4AddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:IPAddressFacet ; + rdfs:label "IPv4AddressFacet"@en ; + rdfs:comment "An IPv4 (Internet Protocol version 4) address facet is a grouping of characteristics unique to an IPv4 standards conformant identifier assigned to a device to enable routing and management of IPv4 standards conformant communication to or from that device."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] ; + sh:targetClass observable:IPv4AddressFacet ; + . + +observable:IPv6Address + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:IPAddress ; + rdfs:label "IPv6Address"@en ; + rdfs:comment "An IPv6 (Internet Protocol version 6) address is an IPv6 standards conformant identifier assigned to a device to enable routing and management of IPv6 standards conformant communication to or from that device."@en ; + sh:targetClass observable:IPv6Address ; + . + +observable:IPv6AddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:IPAddressFacet ; + rdfs:label "IPv6AddressFacet"@en ; + rdfs:comment "An IPv6 (Internet Protocol version 6) address facet is a grouping of characteristics unique to an IPv6 standards conformant identifier assigned to a device to enable routing and management of IPv6 standards conformant communication to or from that device."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] ; + sh:targetClass observable:IPv6AddressFacet ; + . + +observable:IShowMessageActionType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "IShowMessageActionType"@en ; + rdfs:comment "An IShow message action type is a grouping of characteristics unique to an action that shows a message box when a task is activate. [based on https://docs.microsoft.com/en-us/windows/win32/api/taskschd/nn-taskschd-ishowmessageaction?redirectedfrom=MSDN]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:showMessageBody ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:showMessageTitle ; + ] + ; + sh:targetClass observable:IShowMessageActionType ; + . + +observable:Image + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Image"@en ; + rdfs:comment "An image is a complete copy of a hard disk, memory, or other digital media."@en ; + sh:targetClass observable:Image ; + . + +observable:ImageFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ImageFacet"@en ; + rdfs:comment "An image facet is a grouping of characteristics unique to a complete copy of a hard disk, memory, or other digital media."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:imageType ; + ] ; + sh:targetClass observable:ImageFacet ; + . + +observable:InstantMessagingAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddress ; + rdfs:label "InstantMessagingAddress"@en ; + rdfs:comment ""@en ; + sh:targetClass observable:InstantMessagingAddress ; + . + +observable:InstantMessagingAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddressFacet ; + rdfs:label "InstantMessagingAddressFacet"@en ; + rdfs:comment "An instant messaging address facet is a grouping of characteristics unique to an identifier assigned to enable routing and management of instant messaging digital communication."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] + ; + sh:targetClass observable:InstantMessagingAddressFacet ; + . + +observable:Junction + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "Junction"@en ; + rdfs:comment "A junction is a specific NTFS (New Technology File System) reparse point to redirect a directory access to another directory which can be on the same volume or another volume. A junction is similar to a directory symbolic link but may differ on whether they are processed on the local system or on the remote file server. [based on https://jp-andre.pagesperso-orange.fr/junctions.html]"@en ; + sh:targetClass observable:Junction ; + . + +observable:Library + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Library"@en ; + rdfs:comment "A library is a suite of data and programming code that is used to develop software programs and applications. [based on https://www.techopedia.com/definition/3828/software-library]"@en ; + sh:targetClass observable:Library ; + . + +observable:LibraryFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "LibraryFacet"@en ; + rdfs:comment "A library facet is a grouping of characteristics unique to a suite of data and programming code that is used to develop software programs and applications. [based on https://www.techopedia.com/definition/3828/software-library]"@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:libraryType ; + ] ; + sh:targetClass observable:LibraryFacet ; + . + +observable:MACAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddress ; + rdfs:label "MACAddress"@en ; + rdfs:comment "A MAC address is a media access control standards conformant identifier assigned to a network interface to enable routing and management of communications at the data link layer of a network segment."@en ; + sh:targetClass observable:MACAddress ; + . + +observable:MACAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddressFacet ; + rdfs:label "MACAddressFacet"@en ; + rdfs:comment "A MAC address facet is a grouping of characteristics unique to a media access control standards conformant identifier assigned to a network interface to enable routing and management of communications at the data link layer of a network segment."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] ; + sh:targetClass observable:MACAddressFacet ; + . + +observable:MSISDN + a owl:DatatypeProperty ; + rdfs:label "MSISDN"@en ; + rdfs:comment "Mobile Station International Subscriber Directory Number (MSISDN) is a number used to identify a mobile phone number internationally. MSISDN is defined by the E.164 numbering plan. This number includes a country code and a National Destination Code which identifies the subscriber's operator."@en ; + rdfs:range xsd:string ; + . + +observable:MSISDNType + a owl:DatatypeProperty ; + rdfs:label "MSISDNType"@en ; + rdfs:comment "???."@en ; + rdfs:range xsd:string ; + . + +observable:Memory + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Memory"@en ; + rdfs:comment "Memory is a particular region of temporary information storage (e.g., RAM (random access memory), ROM (read only memory)) on a digital device."@en ; + sh:targetClass observable:Memory ; + . + +observable:MemoryFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "MemoryFacet"@en ; + rdfs:comment "A memory facet is a grouping of characteristics unique to a particular region of temporary information storage (e.g., RAM (random access memory), ROM (read only memory)) on a digital device."@en ; + sh:property + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isInjected ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isMapped ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isProtected ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isVolatile ; + ] , + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:regionEndAddress ; + ] , + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:regionStartAddress ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:regionSize ; + ] , + [ + sh:datatype vocabulary1:MemoryBlockTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:blockType ; + ] + ; + sh:targetClass observable:MemoryFacet ; + . + +observable:Message + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Message"@en ; + rdfs:comment "A message is a discrete unit of electronic communication intended by the source for consumption by some recipient or group of recipients. [based on https://en.wikipedia.org/wiki/Message]"@en ; + sh:targetClass observable:Message ; + . + +observable:MessageFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "MessageFacet"@en ; + rdfs:comment "A message facet is a grouping of characteristics unique to a discrete unit of electronic communication intended by the source for consumption by some recipient or group of recipients. [based on https://en.wikipedia.org/wiki/Message]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:from ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sentTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:messageID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:messageText ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:messageType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sessionID ; + ] + ; + sh:targetClass observable:MessageFacet ; + . + +observable:MessageThread + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "MessageTread"@en ; + rdfs:comment "A message thread is a running commentary of electronic messages pertaining to one topic or question."@en ; + sh:targetClass observable:MessageThread ; + . + +observable:MessageThreadFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "MessageThreadFacet"@en ; + rdfs:comment "A message thread facet is a grouping of characteristics unique to a running commentary of electronic messages pertaining to one topic or question."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:message ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:participant ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:visibility ; + ] + ; + sh:targetClass observable:MessageThreadFacet ; + . + +observable:MftRecordFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "MftRecordFacet"@en ; + rdfs:comment "An MFT record facet is a grouping of characteristics unique to the details of a single file as managed in an NTFS (new technology filesystem) master file table (which is a collection of information about all files on an NTFS filesystem). [based on https://docs.microsoft.com/en-us/windows/win32/devnotes/master-file-table]"@en ; + sh:property + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftFileNameAccessedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftFileNameCreatedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftFileNameModifiedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftFileNameRecordChangeTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftRecordChangeTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftFileID ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftFileNameLength ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftFlags ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mftParentID ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:ntfsHardLinkCount ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:ntfsOwnerID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:ntfsOwnerSID ; + ] + ; + sh:targetClass observable:MftRecordFacet ; + . + +observable:MimePartType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "MimePartType"@en ; + rdfs:comment "A mime part type is a grouping of characteristics unique to a component of a multi-part email body."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:bodyRaw ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:body ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contentDisposition ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:contentType ; + ] + ; + sh:targetClass observable:MimePartType ; + . + +observable:MobileAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAccount ; + rdfs:label "MobileAccount"@en ; + rdfs:comment "A mobile account is an arrangement with an entity to enable and control the provision of some capability or service on a portable computing device. [based on https://www.lexico.com/definition/mobile_device]"@en ; + sh:targetClass observable:MobileAccount ; + . + +observable:MobileAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "MobileAccountFacet"@en ; + rdfs:comment "A mobile account facet is a grouping of characteristics unique to an arrangement with an entity to enable and control the provision of some capability or service on a portable computing device. [based on https://www.lexico.com/definition/mobile_device]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:IMSI ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:MSISDN ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:MSISDNType ; + ] + ; + sh:targetClass observable:MobileAccountFacet ; + . + +observable:MobileDevice + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Device ; + rdfs:label "MobileDevice"@en ; + rdfs:comment "A mobile device is a portable computing device. [based on https://www.lexico.com.definition/mobile_device]"@en ; + sh:targetClass observable:MobileDevice ; + . + +observable:MobileDeviceFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "MobileDeviceFacet"@en ; + rdfs:comment "A mobile device facet is a grouping of characteristics unique to a portable computing device. [based on https://www.lexico.com/definition/mobile_device]"@en ; + sh:property + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mockLocationsAllowed ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:clockSetting ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:phoneActivationTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:storageCapacityInBytes ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:ESN ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:IMEI ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:bluetoothDeviceName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:keypadUnlockCode ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:network ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:MSISDN ; + ] + ; + sh:targetClass observable:MobileDeviceFacet ; + . + +observable:Mutex + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Mutex"@en ; + rdfs:comment "A mutex is a mechanism that enforces limits on access to a resource when there are many threads of execution. A mutex is designed to enforce a mutual exclusion concurrency control policy, and with a variety of possible methods there exists multiple unique implementations for different applications. [based on https://en.wikipedia.org/wiki/Lock_(computer_science)]"@en ; + sh:targetClass observable:Mutex ; + . + +observable:MutexFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "MutexFacet"@en ; + rdfs:comment "A mutex facet is a grouping of characteristics unique to a mechanism that enforces limits on access to a resource when there are many threads of execution. A mutex is designed to enforce a mutual exclusion concurrency control policy, and with a variety of possible methods there exists multiple unique implementations for different applications. [based on https://en.wikipedia.org/wiki/Lock_(computer_science)]"@en ; + sh:property [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isNamed ; + ] ; + sh:targetClass observable:MutexFacet ; + . + +observable:NTFSFile + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:File ; + rdfs:label "NTFSFile"@en ; + rdfs:comment "An NTFS file is a New Technology File System (NTFS) file."@en ; + sh:targetClass observable:NTFSFile ; + . + +observable:NTFSFileFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "NTFSFileFacet"@en ; + rdfs:comment "An NTFS file facet is a grouping of characteristics unique to a file on an NTFS (new technology filesystem) file system."@en ; + sh:property + [ + sh:class observable:AlternateDataStream ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:alternateDataStreams ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:entryID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sid ; + ] + ; + sh:targetClass observable:NTFSFileFacet ; + . + +observable:NTFSFilePermissionsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "NTFSFilePermissionsFacet"@en ; + rdfs:comment "An NTFS file permissions facet is a grouping of characteristics unique to the access rights (e.g., view, change, navigate, execute) of a file on an NTFS (new technology filesystem) file system."@en ; + sh:targetClass observable:NTFSFilePermissionsFacet ; + . + +observable:NamedPipe + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "NamedPipe"@en ; + rdfs:comment "A named pipe is a mechanism for FIFO (first-in-first-out) inter-process communication. It is persisted as a filesystem object (that can be deleted like any other file), can be written to or read from by any process and exists beyond the lifespan of any process interacting with it (unlike simple anonymous pipes). [based on https://en.wikipedia.org/wiki/Named_pipe]"@en ; + sh:targetClass observable:NamedPipe ; + . + +observable:NetworkAppliance + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Appliance ; + rdfs:label "NetworkAppliance"@en ; + rdfs:comment "A network appliance is a purpose-built computer with software or firmware that is designed to provide a specific network management function."@en ; + sh:targetClass observable:NetworkAppliance ; + . + +observable:NetworkConnection + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "NetworkConnection"@en ; + rdfs:comment "A network connection is a connection (completed or attempted) across a digital network (a group of two or more computer systems linked together). [based on https://www.webopedia.com/TERM/N/network.html]"@en ; + sh:targetClass observable:NetworkConnection ; + . + +observable:NetworkConnectionFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "NetworkConnectionFacet"@en ; + rdfs:comment "A network connection facet is a grouping of characteristics unique to a connection (complete or attempted) accross a digital network (a group of two or more computer systems linked together). [based on https://www.webopedia.com/TERM/N/network.html]"@en ; + sh:property + [ + sh:class core:UcoObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:src ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:dst ; + ] , + [ + sh:class types:ControlledDictionary ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:protocols ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isActive ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:startTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:destinationPort ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sourcePort ; + ] + ; + sh:targetClass observable:NetworkConnectionFacet ; + . + +observable:NetworkFlow + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "NetworkFlow"@en ; + rdfs:comment "A network flow is a sequence of data transiting one or more digital network (a group or two or more computer systems linked together) connections. [based on https://www.webopedia.com/TERM/N/network.html]"@en ; + sh:targetClass observable:NetworkFlow ; + . + +observable:NetworkFlowFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "NetworkFlowFacet"@en ; + rdfs:comment "A network flow facet is a grouping of characteristics unique to a sequence of data transiting one or more digital network (a group of two or more computer systems linked together) connections. [based on https://www.webopedia.com/TERM/N/network.html]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:dstPayload ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:srcPayload ; + ] , + [ + sh:class types:Dictionary ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:ipfix ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:dstBytes ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:dstPackets ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:srcBytes ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:srcPackets ; + ] + ; + sh:targetClass observable:NetworkFlowFacet ; + . + +observable:NetworkInterface + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "NetworkInterface"@en ; + rdfs:comment "A network interface is a software or hardware interface between two pieces of equipment or protocol layers in a computer network."@en ; + sh:targetClass observable:NetworkInterface ; + . + +observable:NetworkInterfaceFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "NetworkInterfaceFacet"@en ; + rdfs:comment "A network interface facet is a grouping of characteristics unique to a software or hardware interface between two pieces of equipment or protocol layers in a computer network."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:macAddress ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:dhcpServer ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:ip ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:ipGateway ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:dhcpLeaseExpires ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:dhcpLeaseObtained ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:adapterName ; + ] + ; + sh:targetClass observable:NetworkInterfaceFacet ; + . + +observable:NetworkProtocol + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "NetworkProtocol"@en ; + rdfs:comment "A network protocol is an established set of structured rules that determine how data is transmitted between different devices in the same network. Essentially, it allows connected devices to communicate with each other, regardless of any differences in their internal processes, structure or design. [based on https://www.comptia.org/content/guides/what-is-a-network-protocol]"@en ; + sh:targetClass observable:NetworkProtocol ; + . + +observable:NetworkRoute + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "NetworkRoute"@en ; + rdfs:comment "A network route is a specific path (of specific network nodes, connections and protocols) for traffic in a network or between or across multiple networks."@en ; + sh:targetClass observable:NetworkRoute ; + . + +observable:NetworkSocketAddressFamily + a rdfs:Datatype ; + owl:equivalentClass [ + a rdfs:Datatype ; + owl:oneOf [ + a rdf:List ; + rdf:first "af_appletalk" ; + rdf:rest [ + a rdf:List ; + rdf:first "af_bth" ; + rdf:rest [ + a rdf:List ; + rdf:first "af_inet" ; + rdf:rest [ + a rdf:List ; + rdf:first "af_inet6" ; + rdf:rest [ + a rdf:List ; + rdf:first "af_ipx" ; + rdf:rest [ + a rdf:List ; + rdf:first "af_irda" ; + rdf:rest [ + a rdf:List ; + rdf:first "af_netbios" ; + rdf:rest [ + a rdf:List ; + rdf:first "af_unspec" ; + rdf:rest rdf:nil ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + . + +observable:NetworkSocketProtocolFamily + a rdfs:Datatype ; + owl:equivalentClass [ + a rdfs:Datatype ; + owl:oneOf [ + a rdf:List ; + rdf:first "pf_appletalk" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_ash" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_atmpvc" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_atmsvc" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_ax25" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_bluetooth" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_bridge" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_decnet" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_econet" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_inet" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_inet6" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_ipx" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_irda" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_key" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_netbeui" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_netlink" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_netrom" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_packet" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_pppox" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_rose" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_route" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_security" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_sna" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_wanpipe" ; + rdf:rest [ + a rdf:List ; + rdf:first "pf_x25" ; + rdf:rest rdf:nil ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + . + +observable:NetworkSocketType + a rdfs:Datatype ; + owl:equivalentClass [ + a rdfs:Datatype ; + owl:oneOf [ + a rdf:List ; + rdf:first "sock_dgram" ; + rdf:rest [ + a rdf:List ; + rdf:first "sock_raw" ; + rdf:rest [ + a rdf:List ; + rdf:first "sock_rdm" ; + rdf:rest [ + a rdf:List ; + rdf:first "sock_seqpacket" ; + rdf:rest [ + a rdf:List ; + rdf:first "sock_stream" ; + rdf:rest rdf:nil ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + . + +observable:NetworkSubnet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "NetworkSubnet"@en ; + rdfs:comment "A network subnet is a logical subdivision of an IP network. [based on https://en.wikipedia.org/wiki/Subnetwork]"@en ; + sh:targetClass observable:NetworkSubnet ; + . + +observable:Note + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Note"@en ; + rdfs:comment "A note is a brief textual record."@en ; + sh:targetClass observable:Note ; + . + +observable:NoteFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "NoteFacet"@en ; + rdfs:comment "A note facet is a grouping of characteristics unique to a brief textual record."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:modifiedTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:text ; + ] + ; + sh:targetClass observable:NoteFacet ; + . + +observable:Observable + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Observable"@en ; + rdfs:comment "An observable is a characterizable item or action within the digital domain."@en ; + sh:targetClass observable:Observable ; + . + +observable:ObservableAction + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + action:Action , + observable:Observable + ; + rdfs:label "ObservableAction"@en ; + rdfs:comment "An observable action is a grouping of characteristics unique to something that may be done or performed within the digital domain."@en ; + sh:targetClass observable:ObservableAction ; + . + +observable:ObservableObject + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + core:Item , + observable:Observable + ; + rdfs:label "ObservableObject"@en ; + rdfs:comment "An observable object is a grouping of characteristics unique to a distinct article or unit within the digital domain."@en ; + sh:property + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:hasChanged ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:state ; + ] + ; + sh:targetClass observable:ObservableObject ; + . + +observable:ObservablePattern + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Observable ; + rdfs:label "ObservablePattern"@en ; + rdfs:comment "An observable pattern is a grouping of characteristics unique to a logical pattern composed of observable object and observable action properties."@en ; + sh:targetClass observable:ObservablePattern ; + . + +observable:ObservableRelationship + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + core:Relationship , + observable:Observable + ; + rdfs:label "ObservableRelationship"@en ; + rdfs:comment "An observable relationship is a grouping of characteristics unique to an assertion of an association between two observable objects."@en ; + sh:targetClass observable:ObservableRelationship ; + . + +observable:Observation + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf action:Action ; + rdfs:label "Observation"@en ; + rdfs:comment "An observation is a temporal perception of an observable."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:hasValue "observe" ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:name ; + ] ; + sh:targetClass observable:Observation ; + . + +observable:OnlineService + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "OnlineService"@en ; + rdfs:comment "An online service is a particular provision mechanism of information access, distribution or manipulation over the Internet."@en ; + sh:targetClass observable:OnlineService ; + . + +observable:OnlineServiceFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "OnlineServiceFacet"@en-US ; + rdfs:comment "An online service facet is a grouping of characteristics unique to a particular provision mechanism of information access, distribution or manipulation over the Internet."@en-US ; + sh:property + [ + sh:class location:Location ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:location ; + ] , + [ + sh:class observable:ObservableObject ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:inetLocation ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:name ; + ] + ; + sh:targetClass observable:OnlineServiceFacet ; + . + +observable:OperatingSystem + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "OperatingSystem"@en ; + rdfs:comment "An operating system is the software that manages computer hardware, software resources, and provides common services for computer programs. [based on https://en.wikipedia.org/wiki/Operating_system]"@en ; + sh:targetClass observable:OperatingSystem ; + . + +observable:OperatingSystemFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "OperatingSystemFacet"@en ; + rdfs:comment "An operating system facet is a grouping of characteristics unique to the software that manages computer hardware, software resources, and provides common services for computer programs. [based on https://en.wikipedia.org/wiki/Operating_system]"@en ; + sh:property + [ + sh:class types:Dictionary ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:environmentVariables ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:installDate ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:bitness ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:manufacturer ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:version ; + ] + ; + sh:targetClass observable:OperatingSystemFacet ; + . + +observable:PDFFile + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:File ; + rdfs:label "PDFFile"@en ; + rdfs:comment "A PDF file is a Portable Document Format (PDF) file."@en ; + sh:targetClass observable:PDFFile ; + . + +observable:PDFFileFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "PDFFileFacet"@en ; + rdfs:comment "A PDF file facet is a grouping of characteristics unique to a PDF (Portable Document Format) file."@en ; + sh:property + [ + sh:class types:ControlledDictionary ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:documentInformationDictionary ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isOptimized ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:pdfId1 ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:version ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:pdfId0 ; + ] + ; + sh:targetClass observable:PDFFileFacet ; + . + +observable:PIN + a owl:DatatypeProperty ; + rdfs:label "PIN"@en ; + rdfs:comment "Personal Identification Number (PIN)."@en ; + rdfs:range xsd:string ; + . + +observable:PUK + a owl:DatatypeProperty ; + rdfs:label "PUK"@en ; + rdfs:comment "Personal Unlocking Key (PUK) to unlock the SIM card."@en ; + rdfs:range xsd:string ; + . + +observable:PathRelationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "PathRelationFacet"@en ; + rdfs:comment "A path relation facet is a grouping of characteristics unique to the location of one object within another containing object."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:path ; + ] ; + sh:targetClass observable:PathRelationFacet ; + . + +observable:PaymentCard + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "PaymentCard"@en ; + rdfs:comment "A payment card is a physical token that is part of a payment system issued by financial institutions, such as a bank, to a customer that enables its owner (the cardholder) to access the funds in the customer's designated bank accounts, or through a credit account and make payments by electronic funds transfer and access automated teller machines (ATMs). [based on https://en.wikipedia.org/wiki/Payment_card]"@en ; + sh:targetClass observable:PaymentCard ; + . + +observable:PhoneAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAccount ; + rdfs:label "PhoneAccount"@en ; + rdfs:comment "A phone account is an arrangement with an entity to enable and control the provision of a telephony capability or service."@en ; + sh:targetClass observable:PhoneAccount ; + . + +observable:PhoneAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "PhoneAccountFacet"@en ; + rdfs:comment "A phone account facet is a grouping of characteristics unique to an arrangement with an entity to enable and control the provision of a telephony capability or service."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:phoneNumber ; + ] ; + sh:targetClass observable:PhoneAccountFacet ; + . + +observable:PhoneCall + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "PhoneCall"@en ; + rdfs:comment "A phone call is a connection over a telephone network between the called party and the calling party. [based on https://en.wikipedia.org/wiki/Telephone_call]"@en ; + sh:targetClass observable:PhoneCall ; + . + +observable:PhoneCallFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "PhoneCallFacet"@en ; + rdfs:comment "A phone call facet is a grouping of characteristics unique to a connection over a telephone network between the called party and the calling party. [based on https://en.wikipedia.org/wiki/Telephone_call]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:from ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:to ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:endTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:startTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:duration ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:callType ; + ] + ; + sh:targetClass observable:PhoneCallFacet ; + . + +observable:Pipe + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Pipe"@en ; + rdfs:comment "A pipe is a mechanism for one-way inter-process communication using message passing where data written by one process is buffered by the operating system until it is read by the next process, and this uni-directional channel disappears when the processes are completed. [based on https://en.wikipedia.org/wiki/Pipeline_(Unix) ; https://en.wikipedia.org/wiki/Anonymous_pipe]"@en ; + sh:targetClass observable:Pipe ; + . + +observable:Post + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Message ; + rdfs:label "Post"@en ; + rdfs:comment "A post is message submitted to an online discussion/publishing site (forum, blog, etc.)."@en ; + sh:targetClass observable:Post ; + . + +observable:Process + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Process"@en ; + rdfs:comment "A process is an instance of a computer program executed on an operating system."@en ; + sh:targetClass observable:Process ; + . + +observable:ProcessFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ProcessFacet"@en ; + rdfs:comment "A process facet is a grouping of characteristics unique to an instance of a computer program executed on an operating system."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:binary ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:creatorUser ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:parent ; + ] , + [ + sh:class types:Dictionary ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:environmentVariables ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isHidden ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:exitTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:exitStatus ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:pid ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:currentWorkingDirectory ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:status ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:arguments ; + ] + ; + sh:targetClass observable:ProcessFacet ; + . + +observable:Profile + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Profile"@en ; + rdfs:comment "A profile is an explicit digital representation of identity and characteristics of the owner of a single user account associated with an online service or application. [based on https://en.wikipedia.org/wiki/User_profile]"@en ; + sh:targetClass observable:Profile ; + . + +observable:ProfileFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ProfileFacet"@en-US ; + rdfs:comment "A profile facet is a grouping of characteristics unique to an explicit digital representation of identity and characteristics of the owner of a single user account associated with an online service or application. [based on https://en.wikipedia.org/wiki/User_profile]"@en-US ; + sh:property + [ + sh:class identity:Identity ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileIdentity ; + ] , + [ + sh:class observable:ContactAddress ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactAddress ; + ] , + [ + sh:class observable:ContactEmail ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactEmail ; + ] , + [ + sh:class observable:ContactMessaging ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactMessaging ; + ] , + [ + sh:class observable:ContactPhone ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactPhone ; + ] , + [ + sh:class observable:ContactURL ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactURL ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileAccount ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileService ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileWebsite ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:profileCreated ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:name ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] , + [ + sh:datatype xsd:string ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:profileLanguage ; + ] + ; + sh:targetClass observable:ProfileFacet ; + . + +observable:PropertiesEnumeratedEffectFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + core:Facet , + observable:DefinedEffectFacet + ; + rdfs:label "PropertiesEnumeratedEffectFacet"@en ; + rdfs:comment "A properties enumerated effect facet is a grouping of characteristics unique to the effects of actions upon observable objects where a characteristic of the observable object is enumerated. An example of this would be startup parameters for a process."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:properties ; + ] ; + sh:targetClass observable:PropertiesEnumeratedEffectFacet ; + . + +observable:PropertyReadEffectFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + core:Facet , + observable:DefinedEffectFacet + ; + rdfs:label "PropertyReadEffectFacet"@en ; + rdfs:comment "A properties read effect facet is a grouping of characteristics unique to the effects of actions upon observable objects where a characteristic is read from an observable object. An example of this would be the current running state of a process."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:propertyName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:value ; + ] + ; + sh:targetClass observable:PropertyReadEffectFacet ; + . + +observable:RasterPicture + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:File ; + rdfs:label "RasterPicture"@en ; + rdfs:comment "A raster picture is a raster (or bitmap) image."@en ; + sh:targetClass observable:RasterPicture ; + . + +observable:RasterPictureFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "RasterPictureFacet"@en ; + rdfs:comment "A raster picture facet is a grouping of characteristics unique to a raster (or bitmap) image."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:camera ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:bitsPerPixel ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:pictureHeight ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:pictureWidth ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:imageCompressionMethod ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:pictureType ; + ] + ; + sh:targetClass observable:RasterPictureFacet ; + . + +observable:RegistryDatatype + a rdfs:Datatype ; + owl:equivalentClass [ + a rdfs:Datatype ; + owl:oneOf [ + a rdf:List ; + rdf:first "reg_binary" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_dword" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_dword_big_endian" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_expand_sz" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_full_resource_descriptor" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_invalid_type" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_link" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_multi_sz" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_none" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_qword" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_resource_list" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_resource_requirements_list" ; + rdf:rest [ + a rdf:List ; + rdf:first "reg_sz" ; + rdf:rest rdf:nil ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + . + +observable:ReparsePoint + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "ReparsePoint"@en ; + rdfs:comment "A reparse point is a type of NTFS (New Technology File System) object which is an optional attribute of files and directories meant to define some sort of preprocessing before accessing the said file or directory. For instance reparse points can be used to redirect access to files which have been moved to long term storage so that some application would retrieve them and make them directly accessible. A reparse point contains a reparse tag and data that are interpreted by a filesystem filter identified by the tag. [based on https://jp-andre.pagesperso-orange.fr/junctions.html ; https://en.wikipedia.org/wiki/NTFS_reparse_point]"@en ; + sh:targetClass observable:ReparsePoint ; + . + +observable:SIMCard + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Device ; + rdfs:label "SIMCard" ; + rdfs:comment "A SIM card is a subscriber identification module card intended to securely store the international mobile subscriber identity (IMSI) number and its related key, which are used to identify and authenticate subscribers on mobile telephony. [based on https://en.wikipedia.org/wiki/SIM_card]"@en ; + sh:targetClass observable:SIMCard ; + . + +observable:SIMCardFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "SIMCardFacet"@en ; + rdfs:comment "A SIM card facet is a grouping of characteristics unique to a subscriber identification module card intended to securely store the international mobile subscriber identity (IMSI) number and its related key, which are used to identify and authenticate subscribers on mobile telephony devices (such as mobile phones and computers). [based on https://en.wikipedia.org/wiki/SIM_card]"@en ; + sh:property + [ + sh:class identity:Identity ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:carrier ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:storageCapacityInBytes ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:ICCID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:IMSI ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:PIN ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:PUK ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:SIMForm ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:SIMType ; + ] + ; + sh:targetClass observable:SIMCardFacet ; + . + +observable:SIMForm + a owl:DatatypeProperty ; + rdfs:label "SIMForm"@en ; + rdfs:comment "The form of SIM card such as SIM, Micro SIM, Nano SIM."@en ; + rdfs:range xsd:string ; + . + +observable:SIMType + a owl:DatatypeProperty ; + rdfs:label "SIMType"@en ; + rdfs:comment "The type of SIM card such as SIM, USIM, UICC."@en ; + rdfs:range xsd:string ; + . + +observable:SIPAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddress ; + rdfs:label "SIPAddress"@en ; + rdfs:comment "A SIP address is an identifier for Session Initiation Protocol (SIP) communication."@en ; + sh:targetClass observable:SIPAddress ; + . + +observable:SIPAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAddressFacet ; + rdfs:label "SIPAddressFacet"@en ; + rdfs:comment "A SIP address facet is a grouping of characteristics unique to a Session Initiation Protocol (SIP) standards conformant identifier assigned to a user to enable routing and management of SIP standards conformant communication to or from that user loosely coupled from any particular devices."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] + ; + sh:targetClass observable:SIPAddressFacet ; + . + +observable:SMSMessage + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Message ; + rdfs:label "SMSMessage"@en ; + rdfs:comment "An SMS message is a message conformant to the short message service (SMS) communication protocol standards."@en ; + sh:targetClass observable:SMSMessage ; + . + +observable:SMSMessageFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "SMSMessageFacet"@en ; + rdfs:comment "A SMS message facet is a grouping of characteristics unique to a message conformant to the short message service (SMS) communication protocol standards."@en ; + sh:property [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isRead ; + ] ; + sh:targetClass observable:SMSMessageFacet ; + . + +observable:SQLiteBlob + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "SQLiteBlob"@en ; + rdfs:comment "An SQLite blob is a blob (binary large object) of data within an SQLite database. [based on https://en.wikipedia.org/wiki/SQLite]"@en ; + sh:targetClass observable:SQLiteBlob ; + . + +observable:SQLiteBlobFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "SQLiteBlobFacet"@en ; + rdfs:comment "An SQLite blob facet is a grouping of characteristics unique to a blob (binary large object) of data within an SQLite database. [based on https://en.wikipedia.org/wiki/SQLite]"@en ; + sh:property + [ + sh:datatype xsd:positiveInteger ; + sh:nodeKind sh:Literal ; + sh:path observable:rowIndex ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:columnName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:rowCondition ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:tableName ; + ] + ; + sh:targetClass observable:SQLiteBlobFacet ; + . + +observable:SecurityAppliance + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Appliance ; + rdfs:label "SecurityAppliance"@en ; + rdfs:comment "A security appliance is a purpose-built computer with software or firmware that is designed to provide a specific security function to protect computer networks."@en ; + sh:targetClass observable:SecurityAppliance ; + . + +observable:Semaphore + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Semaphore"@en ; + rdfs:comment "A semaphore is a variable or abstract data type used to control access to a common resource by multiple processes and avoid critical section problems in a concurrent system such as a multitasking operating system. [based on https://en.wikipedia.org/wiki/Semaphore_(programming)]"@en ; + sh:targetClass observable:Semaphore ; + . + +observable:SendControlCodeEffectFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + core:Facet , + observable:DefinedEffectFacet + ; + rdfs:label "SendControlCodeEffectFacet"@en ; + rdfs:comment "A send control code effect facet is a grouping of characteristics unique to the effects of actions upon observable objects where a control code, or other control-oriented communication signal, is sent to the observable object. An example of this would be an action sending a control code changing the running state of a process."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:controlCode ; + ] ; + sh:targetClass observable:SendControlCodeEffectFacet ; + . + +observable:ShopListing + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "ShopListing"@en ; + rdfs:comment "A shop listing is a listing of offered products on an online marketplace/shop."@en ; + sh:targetClass observable:ShopListing ; + . + +observable:Snapshot + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "Snapshot"@en ; + rdfs:comment "A snapshot is a file system object representing a snapshot of the contents of a part of a file system at a point in time."@en ; + sh:targetClass observable:Snapshot ; + . + +observable:Socket + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "Socket"@en ; + rdfs:comment "A socket is a special file used for inter-process communication, which enables communication between two processes. In addition to sending data, processes can send file descriptors across a Unix domain socket connection using the sendmsg() and recvmsg() system calls. Unlike named pipes which allow only unidirectional data flow, sockets are fully duplex-capable. [based on https://en.wikipedia.org/wiki/Unix_file_types]"@en ; + sh:targetClass observable:Socket ; + . + +observable:SocketAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Address ; + rdfs:label "SocketAddress"@en ; + rdfs:comment "A socket address (combining and IP address and a port number) is a composite identifier for a network socket endpoint supporting internet protocol communications."@en ; + sh:targetClass observable:SocketAddress ; + . + +observable:Software + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Software"@en ; + rdfs:comment "Software is a definitely scoped instance of a collection of data or computer instructions that tell the computer how to work. [based on https://en.wikipedia.org/wiki/Software]"@en ; + sh:targetClass observable:Software ; + . + +observable:SoftwareFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "SoftwareFacet"@en ; + rdfs:comment "A software facet is a grouping of characteristics unique to a software program (a definitively scoped instance of a collection of data or computer instructions that tell the computer how to work). [based on https://en.wikipedia.org/wiki/Software]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:cpeid ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:language ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:manufacturer ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:swid ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:version ; + ] + ; + sh:targetClass observable:SoftwareFacet ; + . + +observable:StateChangeEffectFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + core:Facet , + observable:DefinedEffectFacet + ; + rdfs:label "StateChangeEffectFacet"@en ; + rdfs:comment "A state change effect facet is a grouping of characteristics unique to the effects of actions upon observable objects where a state of the observable object is changed."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:newObject ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:oldObject ; + ] + ; + sh:targetClass observable:StateChangeEffectFacet ; + . + +observable:SymbolicLink + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:FileSystemObject ; + rdfs:label "SymbolicLink"@en ; + rdfs:comment "A symbolic link is a file that contains a reference to another file or directory in the form of an absolute or relative path and that affects pathname resolution. [based on https://en.wikipedia.org/wiki/Symbolic_link]"@en ; + sh:targetClass observable:SymbolicLink ; + . + +observable:SymbolicLinkFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "SymbolicLinkFacet"@en ; + rdfs:comment "A symbolic link facet is a grouping of characteristics unique to a file that contains a reference to another file or directory in the form of an absolute or relative path and that affects pathname resolution. [based on https://en.wikipedia.org/wiki/Symbolic_link]"@en ; + sh:property [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:targetFile ; + ] ; + sh:targetClass observable:SymbolicLinkFacet ; + . + +observable:TCPConnection + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:NetworkConnection ; + rdfs:label "TCPConnection"@en ; + rdfs:comment "A TCP connection is a network connection that is conformant to the Transfer "@en ; + sh:targetClass observable:TCPConnection ; + . + +observable:TCPConnectionFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "TCPConnectionFacet"@en ; + rdfs:comment "A TCP connection facet is a grouping of characteristics unique to portions of a network connection that are conformant to the Transmission Control Protocl (TCP) standard."@en ; + sh:property + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:sourceFlags ; + ] , + [ + sh:nodeKind sh:Literal ; + sh:path observable:destinationFlags ; + ] + ; + sh:targetClass observable:TCPConnectionFacet ; + . + +observable:TaskActionType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "TaskActionType"@en ; + rdfs:comment "A task action type is a grouping of characteristics for a scheduled action to be completed."@en ; + sh:property + [ + sh:class observable:IComHandlerActionType ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:iComHandlerAction ; + ] , + [ + sh:class observable:IExecActionType ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:iExecAction ; + ] , + [ + sh:class observable:IShowMessageActionType ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:iShowMessageAction ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:iEmailAction ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:actionID ; + ] , + [ + sh:datatype vocabulary1:TaskActionTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:actionType ; + ] + ; + sh:targetClass observable:TaskActionType ; + . + +observable:Thread + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Thread"@en ; + rdfs:comment "A thread is the smallest sequence of programmed instructions that can be managed independently by a scheduler on a computer, which is typically a part of the operating system. It is a component of a process. Multiple threads can exist within one process, executing concurrently and sharing resources such as memory, while different processes do not share these resources. In particular, the threads of a process share its executable code and the values of its dynamically allocated variables and non-thread-local global variables at any given time. [based on https://en.wikipedia.org/wiki/Thread_(computing)]"@en ; + sh:targetClass observable:Thread ; + . + +observable:TriggerType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "TriggerType"@en ; + rdfs:comment "A trigger type is a grouping of characterizes unique to a set of criteria that, when met, starts the execution of a task within a Windows operating system. [based on https://docs.microsoft.com/en-us/windows/win32/taskschd/task-triggers]"@en ; + sh:property + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isEnabled ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:triggerBeginTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:triggerEndTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:triggerDelay ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:triggerMaxRunTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:triggerSessionChangeType ; + ] , + [ + sh:datatype vocabulary1:TriggerFrequencyVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:triggerFrequency ; + ] , + [ + sh:datatype vocabulary1:TriggerTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:triggerType ; + ] + ; + sh:targetClass observable:TriggerType ; + . + +observable:Tweet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Message ; + rdfs:label "Tweet"@en ; + rdfs:comment "A tweet is message submitted by a Twitter user account to the Twitter microblogging platform."@en ; + sh:targetClass observable:Tweet ; + . + +observable:TwitterProfileFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "TwitterProfileFacet" ; + rdfs:comment "A twitter profile facet is a grouping of characteristics unique to an explicit digital representation of identity and characteristics of the owner of a single Twitter user account. [based on https://en.wikipedia.org/wiki/User_profile]" ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileBackgroundLocation ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileBannerLocation ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileImageLocation ; + ] , + [ + sh:class types:Hash ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileBackgroundHash ; + ] , + [ + sh:class types:Hash ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileBannerHash ; + ] , + [ + sh:class types:Hash ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:profileImageHash ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:profileIsProtected ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:profileIsVerified ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:listedCount ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:favoritesCount ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:followersCount ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:friendsCount ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:statusesCount ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:twitterId ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:twitterHandle ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:userLocationString ; + ] + ; + sh:targetClass observable:TwitterProfileFacet ; + . + +observable:UNIXAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAccount ; + rdfs:label "UNIXAccount"@en ; + rdfs:comment "A UNIX account is an account on a UNIX operating system."@en ; + sh:targetClass observable:UNIXAccount ; + . + +observable:UNIXAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "UNIXAccountFacet"@en ; + rdfs:comment "A UNIX account facet is a grouping of characteristics unique to an account on a UNIX operating system."@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:gid ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:shell ; + ] + ; + sh:targetClass observable:UNIXAccountFacet ; + . + +observable:UNIXFile + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:File ; + rdfs:label "UNIXFile"@en ; + rdfs:comment "A UNIX file is a file pertaining to the UNIX operating system."@en ; + sh:targetClass observable:UNIXFile ; + . + +observable:UNIXFilePermissionsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "UNIXFilePermissionsFacet"@en ; + rdfs:comment "A UNIX file permissions facet is a grouping of characteristics unique to the access rights (e.g., view, change, navigate, execute) of a file on a UNIX file system."@en ; + sh:targetClass observable:UNIXFilePermissionsFacet ; + . + +observable:UNIXProcess + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Process ; + rdfs:label "UNIXProcess"@en ; + rdfs:comment "A UNIX process is an instance of a computer program executed on a UNIX operating system."@en ; + sh:targetClass observable:UNIXProcess ; + . + +observable:UNIXProcessFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "UNIXProcessFacet"@en ; + rdfs:comment "A UNIX process facet is a grouping of characteristics unique to an instance of a computer program executed on a UNIX operating system."@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:openFileDescriptor ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:nodeKind sh:Literal ; + sh:path observable:ruid ; + ] + ; + sh:targetClass observable:UNIXProcessFacet ; + . + +observable:UNIXVolumeFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "UNIXVolumeFacet"@en ; + rdfs:comment "A UNIX volume facet is a grouping of characteristics unique to a single accessible storage area (volume) with a single UNIX file system. [based on https://en.wikipedia.org/wiki/Volume_(computing)]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mountPoint ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:options ; + ] + ; + sh:targetClass observable:UNIXVolumeFacet ; + . + +observable:URL + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "URL"@en ; + rdfs:comment "A URL is a uniform resource locator (URL) acting as a resolvable address to a particular WWW (World Wide Web) accessible resource."@en ; + sh:targetClass observable:URL ; + . + +observable:URLFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "URLFacet"@en ; + rdfs:comment "A URL facet is a grouping of characteristics unique to a uniform resource locator (URL) acting as a resolvable address to a particular WWW (World Wide Web) accessible resource."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:host ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:userName ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:port ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:fullValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:fragment ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:password ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:path ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:query ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:scheme ; + ] + ; + sh:targetClass observable:URLFacet ; + . + +observable:URLHistory + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "URLHistory"@en ; + rdfs:comment "A URL history characterizes the stored URL history for a particular web browser"@en ; + sh:targetClass observable:URLHistory ; + . + +observable:URLHistoryEntry + a + owl:Class , + sh:NodeShape + ; + rdfs:label "URL History Entry"@en-US ; + rdfs:comment "A URL history entry is a grouping of characteristics unique to the properties of a single URL history entry for a particular browser."@en-US ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:url ; + ] , + [ + sh:class observable:ObservableObject ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:referrerUrl ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:expirationTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:firstVisit ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:lastVisit ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:visitCount ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:manuallyEnteredCount ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:browserUserProfile ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:hostname ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:pageTitle ; + ] , + [ + sh:datatype xsd:string ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:keywordSearchTerm ; + ] + ; + sh:targetClass observable:URLHistoryEntry ; + . + +observable:URLHistoryFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "URLHistoryFacet"@en-US ; + rdfs:comment "A URL history facet is a grouping of characteristics unique to the stored URL history for a particular web browser"@en-US ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:browserInformation ; + ] , + [ + sh:class observable:URLHistoryEntry ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:urlHistoryEntry ; + ] + ; + sh:targetClass observable:URLHistoryFacet ; + . + +observable:URLVisit + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "URLVisit"@en ; + rdfs:comment "A URL visit characterizes the properties of a visit of a URL within a particular browser."@en ; + sh:targetClass observable:URLVisit ; + . + +observable:URLVisitFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "URLVisitFacet"@en ; + rdfs:comment "A URL visit facet is a grouping of characteristics unique to the properties of a visit of a URL within a particular browser."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:browserInformation ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:fromURLVisit ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:url ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:visitTime ; + ] , + [ + sh:datatype xsd:duration ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:visitDuration ; + ] , + [ + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:urlTransitionType ; + ] + ; + sh:targetClass observable:URLVisitFacet ; + . + +observable:UserAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAccount ; + rdfs:label "UserAccount"@en ; + rdfs:comment "A user account is an account controlling a user's access to a network, system or platform."@en ; + sh:targetClass observable:UserAccount ; + . + +observable:UserAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "UserAccountFacet"@en ; + rdfs:comment "A user account facet is a grouping of characteristics unique to an account controlling a user's access to a network, system, or platform."@en ; + sh:property + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:canEscalatePrivs ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isPrivileged ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isServiceAccount ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:homeDirectory ; + ] + ; + sh:targetClass observable:UserAccountFacet ; + . + +observable:UserSession + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "UserSession"@en ; + rdfs:comment "A user session is a temporary and interactive information interchange between two or more communicating devices within the managed scope of a single user. [based on https://en.wikipedia.org/wiki/Session_(computer_science)]"@en ; + sh:targetClass observable:UserSession ; + . + +observable:UserSessionFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "UserSessionFacet"@en ; + rdfs:comment "A user session facet is a grouping of characteristics unique to a temporary and interactive information interchange between two or more communicating devices within the managed scope of a single user. [based on https://en.wikipedia.org/wiki/Session_(computer_science)]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:effectiveUser ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:loginTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:logoutTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:effectiveGroup ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:effectiveGroupID ; + ] + ; + sh:targetClass observable:UserSessionFacet ; + . + +observable:ValuesEnumeratedEffectFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf + core:Facet , + observable:DefinedEffectFacet + ; + rdfs:label "ValuesEnumeratedEffectFacet"@en ; + rdfs:comment "A values enumerated effect facet is a grouping of characteristics unique to the effects of actions upon observable objects where a value of the observable object is enumerated. An example of this would be the values of a registry key."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:values ; + ] ; + sh:targetClass observable:ValuesEnumeratedEffectFacet ; + . + +observable:Volume + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Volume"@en ; + rdfs:comment "A volume is a single accessible storage area (volume) with a single file system. [based on https://en.wikipedia.org/wiki/Volume_(computing)]"@en ; + sh:targetClass observable:Volume ; + . + +observable:VolumeFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "VolumeFacet"@en ; + rdfs:comment "A volume facet is a grouping of characteristics unique to a single accessible storage area (volume) with a single file system. [based on https://en.wikipedia.org/wiki/Volume_(computing)]"@en ; + sh:property + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sectorSize ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:volumeID ; + ] + ; + sh:targetClass observable:VolumeFacet ; + . + +observable:WebPage + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WebPage"@en ; + rdfs:comment "A web page is a specific collection of information provided by a website and displayed to a user in a web browser. A website typically consists of many web pages linked together in a coherent fashion. [based on https://en.wikipedia.org/wiki/Web_page]"@en ; + sh:targetClass observable:WebPage ; + . + +observable:WhoIs + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WhoIs"@en ; + rdfs:comment "WhoIs is a response record conformant to the WHOIS protocol standard (RFC 3912). [based on https://en.wikipedia.org/wiki/WHOIS]"@en ; + sh:targetClass observable:WhoIs ; + . + +observable:WhoIsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WhoIsFacet"@en ; + rdfs:comment "A whois facet is a grouping of characteristics unique to a response record conformant to the WHOIS protocol standard (RFC 3912). [based on https://en.wikipedia.org/wiki/WHOIS]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:domainName ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:ipAddress ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:registrantContactInfo ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:serverName ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:nameServer ; + ] , + [ + sh:class observable:WhoisRegistrarInfoType ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:registrarInfo ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:creationDate ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:expirationDate ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:lookupDate ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:updatedDate ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:domainID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:remarks ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sponsoringRegistrar ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:registrantIDs ; + ] , + [ + sh:datatype vocabulary1:RegionalRegistryTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:regionalInternetRegistry ; + ] , + [ + sh:datatype vocabulary1:WhoisDNSSECTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:dnssec ; + ] , + [ + sh:datatype vocabulary1:WhoisStatusTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:status ; + ] + ; + sh:targetClass observable:WhoIsFacet ; + . + +observable:WhoisContactFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ContactFacet ; + rdfs:label "WhoIsContactFacet"@en ; + rdfs:comment "A Whois contact type is a grouping of characteristics unique to contact-related information present in a response record conformant to the WHOIS protocol standard (RFC 3912). [based on https://en.wikipedia.org/wiki/WHOIS]"@en ; + sh:property [ + sh:datatype observable:WhoisContactTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:whoisContactType ; + ] ; + sh:targetClass observable:WhoisContactFacet ; + . + +observable:WhoisRegistrarInfoType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "WhoisRegistrarInfoType"@en ; + rdfs:comment "A Whois registrar info type is a grouping of characteristics unique to registrar-related information present in a response record conformant to the WHOIS protocol standard (RFC 3912). [based on https://en.wikipedia.org/wiki/WHOIS]"@en ; + sh:property + [ + sh:class location:Location ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:geolocationAddress ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:contactPhoneNumber ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:emailAddress ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:referralURL ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:whoisServer ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:registrarGUID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:registrarID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:registrarName ; + ] + ; + sh:targetClass observable:WhoisRegistrarInfoType ; + . + +observable:WifiAddress + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:MACAddress ; + rdfs:label "WifiAddress"@en ; + rdfs:comment "A Wi-Fi address is a media access control (MAC) standards-conformant identifier assigned to a device network interface to enable routing and management of IEEE 802.11 standards-conformant communications to and from that device."@en ; + sh:targetClass observable:WifiAddress ; + . + +observable:WifiAddressFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:MACAddressFacet ; + rdfs:label "WifiAddressFacet"@en ; + rdfs:comment "A Wi-Fi address facet is a grouping of characteristics unique to a media access control (MAC) standards conformant identifier assigned to a device network interface to enable routing and management of IEEE 802.11 standards-conformant communications to and from that device."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:addressValue ; + ] ; + sh:targetClass observable:WifiAddressFacet ; + . + +observable:Wiki + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "Wiki"@en ; + rdfs:comment "A wiki is an online hypertext publication collaboratively edited and managed by its own audience directly using a web browser. A typical wiki contains multiple pages/articles for the subjects or scope of the project and could be either open to the public or limited to use within an organization for maintaining its internal knowledge base. [based on https://en.wikipedia.org/wiki/Wiki]"@en ; + sh:targetClass observable:Wiki ; + . + +observable:WikiArticle + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WikiArticle"@en ; + rdfs:comment "A wiki article is one or more pages in a wiki focused on characterizing a particular topic."@en ; + sh:targetClass observable:WikiArticle ; + . + +observable:WindowsAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAccount ; + rdfs:label "WindowsAccount"@en ; + rdfs:comment "A Windows account is a user account on a Windows operating system."@en ; + sh:targetClass observable:WindowsAccount ; + . + +observable:WindowsAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsAccountFacet"@en ; + rdfs:comment "A Windows account facet is a grouping of characteristics unique to a user account on a Windows operating system."@en ; + sh:property [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:groups ; + ] ; + sh:targetClass observable:WindowsAccountFacet ; + . + +observable:WindowsActiveDirectoryAccount + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:DigitalAccount ; + rdfs:label "WindowsActiveDirectoryAccount"@en ; + rdfs:comment "A Windows Active Directory account is an account managed by directory-based identity-related services of a Windows operating system."@en ; + sh:targetClass observable:WindowsActiveDirectoryAccount ; + . + +observable:WindowsActiveDirectoryAccountFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsActiveDirectoryAccountFacet"@en ; + rdfs:comment "A Windows Active Directory account facet is a grouping of characteristics unique to an account managed by directory-based identity-related services of a Windows operating system."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:objectGUID ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:activeDirectoryGroups ; + ] + ; + sh:targetClass observable:WindowsActiveDirectoryAccountFacet ; + . + +observable:WindowsComputerSpecification + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsComputerSpecification"@en ; + rdfs:comment "A Windows computer specification is the hardware ans software of a programmable electronic device that can store, retrieve, and process data running a Microsoft Windows operating system. [based on merriam-webster.com/dictionary/computer]"@en ; + sh:targetClass observable:WindowsComputerSpecification ; + . + +observable:WindowsComputerSpecificationFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsComputerSpecificationFacet"@en ; + rdfs:comment "A Windows computer specification facet is a grouping of characteristics unique to the hardware and software of a programmable electronic device that can store, retrieve, and process data running a Microsoft Windows operating system. [based on merriam-webster.com/dictionary/computer]"@en ; + sh:property + [ + sh:class identity:Identity ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:registeredOrganization ; + ] , + [ + sh:class identity:Identity ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:registeredOwner ; + ] , + [ + sh:class observable:GlobalFlagType ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:globalFlagList ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:windowsDirectory ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:windowsSystemDirectory ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:windowsTempDirectory ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:msProductID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:msProductName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:netBIOSName ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:domain ; + ] + ; + sh:targetClass observable:WindowsComputerSpecificationFacet ; + . + +observable:WindowsCriticalSection + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsCriticalSection"@en ; + rdfs:comment "A Windows critical section is a Windows object that provides synchronization similar to that provided by a mutex object, except that a critical section can be used only by the threads of a single process. Critical section objects cannot be shared across processes. Event, mutex, and semaphore objects can also be used in a single-process application, but critical section objects provide a slightly faster, more efficient mechanism for mutual-exclusion synchronization (a processor-specific test and set instruction). Like a mutex object, a critical section object can be owned by only one thread at a time, which makes it useful for protecting a shared resource from simultaneous access. Unlike a mutex object, there is no way to tell whether a critical section has been abandoned. [based on https://docs.microsoft.com/en-us/windows/win32/sync/critical-section-objects]"@en ; + sh:targetClass observable:WindowsCriticalSection ; + . + +observable:WindowsEvent + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsEvent"@en ; + rdfs:comment "A Windows event is a notification record of an occurance of interest (system, security, application, etc.) on a Windows operating system."@en ; + sh:targetClass observable:WindowsEvent ; + . + +observable:WindowsFilemapping + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsFilemapping"@en ; + rdfs:comment "A Windows file mapping is the association of a file's contents with a portion of the virtual address space of a process within a Windows operating system. The system creates a file mapping object (also known as a section object) to maintain this association. A file view is the portion of virtual address space that a process uses to access the file's contents. File mapping allows the process to use both random input and output (I/O) and sequential I/O. It also allows the process to work efficiently with a large data file, such as a database, without having to map the whole file into memory. Multiple processes can also use memory-mapped files to share data. Processes read from and write to the file view using pointers, just as they would with dynamically allocated memory. The use of file mapping improves efficiency because the file resides on disk, but the file view resides in memory.[based on https://docs.microsoft.com/en-us/windows/win32/memory/file-mapping]"@en ; + sh:targetClass observable:WindowsFilemapping ; + . + +observable:WindowsHandle + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsHandle"@en ; + rdfs:comment "A Windows handle is an abstract reference to a resource within the Windows operating system, such as a window, memory, an open file or a pipe. It is the mechanism by which applications interact with such resources in the Windows operating system."@en ; + sh:targetClass observable:WindowsHandle ; + . + +observable:WindowsHook + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsHook"@en ; + rdfs:comment "A Windows hook is a mechanism by which an application can intercept events, such as messages, mouse actions, and keystrokes within the Windows operating system. A function that intercepts a particular type of event is known as a hook procedure. A hook procedure can act on each event it receives, and then modify or discard the event. [based on https://docs.microsoft.com/en-us/windows/win32/winmsg/about-hooks]"@en ; + sh:targetClass observable:WindowsHook ; + . + +observable:WindowsMailslot + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsMailslot"@en ; + rdfs:comment "A Windows mailslot is is a pseudofile that resides in memory, and may be accessed using standard file functions. The data in a mailslot message can be in any form, but cannot be larger than 424 bytes when sent between computers. Unlike disk files, mailslots are temporary. When all handles to a mailslot are closed, the mailslot and all the data it contains are deleted. [based on https://docs.microsoft.com/en-us/windows/win32/ipc/about-mailslots]"@en ; + sh:targetClass observable:WindowsMailslot ; + . + +observable:WindowsNetworkShare + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsNetworkShare"@en ; + rdfs:comment "A Windows network share is a Windows computer resource made available from one host to other hosts on a computer network. It is a device or piece of information on a computer that can be remotely accessed from another computer transparently as if it were a resource in the local machine. Network sharing is made possible by inter-process communication over the network. [based on https://en.wikipedia.org/wiki/Shared_resource]"@en ; + sh:targetClass observable:WindowsNetworkShare ; + . + +observable:WindowsPEBinaryFile + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:File ; + rdfs:label "WindowsPEBinaryFile"@en ; + rdfs:comment "A Windows PE binary file is a Windows portable executable (PE) file."@en ; + sh:targetClass observable:WindowsPEBinaryFile ; + . + +observable:WindowsPEBinaryFileFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsPEBinaryFileFacet"@en ; + rdfs:comment "A Windows PE binary file facet is a grouping of characteristics unique to a Windows portable executable (PE) file."@en ; + sh:property + [ + sh:class observable:WindowsPEOptionalHeader ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:optionalHeader ; + ] , + [ + sh:class observable:WindowsPESection ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:sections ; + ] , + [ + sh:class types:Hash ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:fileHeaderHashes ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:timeDateStamp ; + ] , + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:pointerToSymbolTable ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:numberOfSections ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:numberOfSymbols ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfOptionalHeader ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:impHash ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:peType ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:machine ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:characteristics ; + ] + ; + sh:targetClass observable:WindowsPEBinaryFileFacet ; + . + +observable:WindowsPEBinaryType + a rdfs:Datatype ; + owl:equivalentClass [ + a rdfs:Datatype ; + owl:oneOf [ + a rdf:List ; + rdf:first "dll" ; + rdf:rest [ + a rdf:List ; + rdf:first "exe" ; + rdf:rest [ + a rdf:List ; + rdf:first "sys" ; + rdf:rest rdf:nil ; + ] ; + ] ; + ] ; + ] ; + . + +observable:WindowsPEFileHeader + a + owl:Class , + sh:NodeShape + ; + rdfs:label "WindowsPEFileHeader"@en ; + rdfs:comment "A Windows PE file header is a grouping of characteristics unique to the 'header' of a Windows PE (Portable Executable) file, consisting of a collection of metadata about the overall nature and structure of the file."@en ; + sh:property [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:timeDateStamp ; + ] ; + sh:targetClass observable:WindowsPEFileHeader ; + . + +observable:WindowsPEOptionalHeader + a + owl:Class , + sh:NodeShape + ; + rdfs:label "WindowsPEOptionalHeader"@en ; + rdfs:comment "A Windows PE optional header is a grouping of characteristics unique to the 'optional header' of a Windows PE (Portable Executable) file, consisting of a collection of metadata about the executable code structure of the file."@en ; + sh:property + [ + sh:datatype xsd:byte ; + sh:nodeKind sh:Literal ; + sh:path observable:majorLinkerVersion ; + ] , + [ + sh:datatype xsd:byte ; + sh:nodeKind sh:Literal ; + sh:path observable:minorLinkerVersion ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:addressOfEntryPoint ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:baseOfCode ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:checksum ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:fileAlignment ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:imageBase ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:loaderFlags ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:numberOfRVAAndSizes ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sectionAlignment ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfCode ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfHeaders ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfHeapCommit ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfHeapReserve ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfImage ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfInitializedData ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfStackCommit ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfStackReserve ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:sizeOfUninitializedData ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:win32VersionValue ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:dllCharacteristics ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:magic ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:majorImageVersion ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:majorOSVersion ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:majorSubsystemVersion ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:minorImageVersion ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:minorOSVersion ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:minorSubsystemVersion ; + ] , + [ + sh:datatype xsd:unsignedShort ; + sh:nodeKind sh:Literal ; + sh:path observable:subsystem ; + ] + ; + sh:targetClass observable:WindowsPEOptionalHeader ; + . + +observable:WindowsPESection + a + owl:Class , + sh:NodeShape + ; + rdfs:label "WindowsPESection"@en ; + rdfs:comment "A Windows PE section is a grouping of characteristics unique to a specific default or custom-defined region of a Windows PE (Portable Executable) file, consisting of an individual portion of the actual executable content of the file delineated according to unique purpose and memory protection requirements."@en ; + sh:property + [ + sh:class types:Hash ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:hashes ; + ] , + [ + sh:datatype xsd:double ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:entropy ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:size ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:name ; + ] + ; + sh:targetClass observable:WindowsPESection ; + . + +observable:WindowsPrefetch + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsPrefetch"@en ; + rdfs:comment "The Windows prefetch contains entries in a Windows prefetch file (used to speed up application startup starting with Windows XP)."@en ; + sh:targetClass observable:WindowsPrefetch ; + . + +observable:WindowsPrefetchFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsPrefetchFacet"@en ; + rdfs:comment "A Windows prefetch facet is a grouping of characteristics unique to entries in the Windows prefetch file (used to speed up application startup starting with Windows XP)."@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:volume ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:accessedDirectory ; + ] , + [ + sh:class observable:ObservableObject ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:accessedFile ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:firstRun ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:lastRun ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:timesExecuted ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:applicationFileName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:prefetchHash ; + ] + ; + sh:targetClass observable:WindowsPrefetchFacet ; + . + +observable:WindowsProcess + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Process ; + rdfs:label "WindowsProcess"@en ; + rdfs:comment "A Windows process is a program running on a Windows operating system."@en ; + sh:targetClass observable:WindowsProcess ; + . + +observable:WindowsProcessFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsProcessFacet"@en ; + rdfs:comment "A Windows process facet is a grouping of characteristics unique to a program running on a Windows operating system."@en ; + sh:property + [ + sh:class types:Dictionary ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:startupInfo ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:aslrEnabled ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:depEnabled ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:ownerSID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:priority ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:windowTitle ; + ] + ; + sh:targetClass observable:WindowsProcessFacet ; + . + +observable:WindowsRegistryHive + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsRegistryHive"@en ; + rdfs:comment "The Windows registry hive is a particular logical group of keys, subkeys, and values in a Windows registry (a hierarchical database that stores low-level settings for the Microsoft Windows operating system and for applications that opt to use the registry). [based on https://en.wikipedia.org/wiki/Windows_Registry]"@en ; + sh:targetClass observable:WindowsRegistryHive ; + . + +observable:WindowsRegistryHiveFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsRegistryHiveFacet"@en ; + rdfs:comment "A Windows registry hive facet is a grouping of characteristics unique to a particular logical group of keys, subkeys, and values in a Windows registry (a hierarchical database that stores low-level settings for the Microsoft Windows operating system and for applications that opt to use the registry). [based on https://en.wikipedia.org/wiki/Windows_Registry]"@en ; + sh:property [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:hiveType ; + ] ; + sh:targetClass observable:WindowsRegistryHiveFacet ; + . + +observable:WindowsRegistryKey + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsRegistryKey"@en ; + rdfs:comment "A Windows registry key is a particular key within a Windows registry (a hierarchical database that stores low-level settings for the Microsoft Windows operating system and for applications that opt to use the registry). [based on https://en.wikipedia.org/wiki/Windows_Registry]"@en ; + sh:targetClass observable:WindowsRegistryKey ; + . + +observable:WindowsRegistryKeyFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsRegistryKeyFacet"@en ; + rdfs:comment "A Windows registry key facet is a grouping of characteristics unique to a particular key within a Windows registry (A hierarchical database that stores low-level settings for the Microsoft Windows operating system and for applications that opt to use the registry). [based on https://en.wikipedia.org/wiki/Windows_Registry]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:creator ; + ] , + [ + sh:class observable:WindowsRegistryValue ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:registryValues ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:modifiedTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:numberOfSubkeys ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:key ; + ] + ; + sh:targetClass observable:WindowsRegistryKeyFacet ; + . + +observable:WindowsRegistryValue + a + owl:Class , + sh:NodeShape + ; + rdfs:label "WindowsRegistryValue"@en ; + rdfs:comment "A Windows registry value is a grouping of characteristics unique to a particular value within a Windows registry (a hierarchical database that stores low-level settings for the Microsoft Windows operating system and for applications that opt to use the registry. [based on https://en.wikipedia.org/wiki/Windows_Registry]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path core:name ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:data ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:dataType ; + ] + ; + sh:targetClass observable:WindowsRegistryValue ; + . + +observable:WindowsService + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsService"@en ; + rdfs:comment "A Windows service is a specific Windows service (a computer program that operates in the background of a Windows operating system, similar to the way a UNIX daemon runs on UNIX). [based on https://en.wikipedia.org/wiki/Windows_service]"@en ; + sh:targetClass observable:WindowsService ; + . + +observable:WindowsServiceFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsServiceFacet"@en ; + rdfs:comment "A Windows service facet is a grouping of characteristics unique to a specific Windows service (a computer program that operates in the background of a Windows operating system, similar to the way a UNIX daemon runs on UNIX). [based on https://en.wikipedia.org/wiki/Windows_service]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:serviceName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:displayName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:groupName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:serviceStatus ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:serviceType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:startCommandLine ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:startType ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path observable:descriptions ; + ] + ; + sh:targetClass observable:WindowsServiceFacet ; + . + +observable:WindowsServiceStartType + a rdfs:Datatype ; + owl:equivalentClass [ + a rdfs:Datatype ; + owl:oneOf [ + a rdf:List ; + rdf:first "service_auto_start" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_boot_start" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_demand_start" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_disabled" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_system_alert" ; + rdf:rest rdf:nil ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + . + +observable:WindowsServiceStatus + a rdfs:Datatype ; + owl:equivalentClass [ + a rdfs:Datatype ; + owl:oneOf [ + a rdf:List ; + rdf:first "service_continue_pending" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_pause_pending" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_paused" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_running" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_start_pending" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_stop_pending" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_stopped" ; + rdf:rest rdf:nil ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + ] ; + . + +observable:WindowsServiceType + a rdfs:Datatype ; + owl:equivalentClass [ + a rdfs:Datatype ; + owl:oneOf [ + a rdf:List ; + rdf:first "service_file_system_driver" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_kernel_driver" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_win32_own_process" ; + rdf:rest [ + a rdf:List ; + rdf:first "service_win32_share_process" ; + rdf:rest rdf:nil ; + ] ; + ] ; + ] ; + ] ; + ] ; + . + +observable:WindowsSystemRestore + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsSystemRestore"@en ; + rdfs:comment "A Windows system restore is a capture of a Windows computer's state (including system files, installed applications, Windows Registry, and system settings) at a particular point in time such that the computer can be reverted to that state in the event of system malfunctions or other problems. [based on https://en.wikipedia.org/wiki/System_Restore]"@en ; + sh:targetClass observable:WindowsSystemRestore ; + . + +observable:WindowsTask + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsTask"@en ; + rdfs:comment "A Windows task is a process that is scheduled to execute on a Windows operating system by the Windows Task Scheduler. [based on http://msdn.microsoft.com/en-us/library/windows/desktop/aa381311(v=vs.85).aspx]"@en ; + sh:targetClass observable:WindowsTask ; + . + +observable:WindowsTaskFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsTaskFacet"@en ; + rdfs:comment "A Windows Task facet is a grouping of characteristics unique to a Windows Task (a process that is scheduled to execute on a Windows operating system by the Windows Task Scheduler). [based on http://msdn.microsoft.com/en-us/library/windows/desktop/aa381311(v=vs.85).aspx]"@en ; + sh:property + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:account ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:application ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:workItemData ; + ] , + [ + sh:class observable:ObservableObject ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:workingDirectory ; + ] , + [ + sh:class observable:TaskActionType ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:actionList ; + ] , + [ + sh:class observable:TriggerType ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:triggerList ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:mostRecentRunTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:nextRunTime ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:observableCreatedTime ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:exitCode ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:maxRunTime ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:accountLogonType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:accountRunLevel ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:imageName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:parameters ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:taskComment ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:taskCreator ; + ] , + [ + sh:datatype vocabulary1:TaskFlagVocab ; + sh:nodeKind sh:Literal ; + sh:path observable:flags ; + ] , + [ + sh:datatype vocabulary1:TaskPriorityVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:priority ; + ] , + [ + sh:datatype vocabulary1:TaskStatusVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:status ; + ] + ; + sh:targetClass observable:WindowsTaskFacet ; + . + +observable:WindowsThread + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:Thread ; + rdfs:label "WindowsThread"@en ; + rdfs:comment "A Windows thread is a single thread of execution within a Windows process."@en ; + sh:targetClass observable:WindowsThread ; + . + +observable:WindowsThreadFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsThreadFacet"@en ; + rdfs:comment "A Windows thread facet is a grouping os characteristics unique to a single thread of execution within a Windows process."@en ; + sh:property + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:creationTime ; + ] , + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:parameterAddress ; + ] , + [ + sh:datatype xsd:hexBinary ; + sh:nodeKind sh:Literal ; + sh:path observable:startAddress ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:priority ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:nodeKind sh:Literal ; + sh:path observable:stackSize ; + ] , + [ + sh:datatype xsd:nonNegativeInteger ; + sh:nodeKind sh:Literal ; + sh:path observable:threadID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:context ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:runningStatus ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:securityAttributes ; + ] , + [ + sh:datatype xsd:unsignedInt ; + sh:nodeKind sh:Literal ; + sh:path observable:creationFlags ; + ] + ; + sh:targetClass observable:WindowsThreadFacet ; + . + +observable:WindowsVolumeFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WindowsVolumeFacet"@en ; + rdfs:comment "A Windows volume facet is a grouping of characteristics unique to a single accessible storage area (volume) with a single Windows file system. [based on https://en.wikipedia.org/wiki/Volume_(computing)]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:driveLetter ; + ] , + [ + sh:datatype vocabulary1:WindowsDriveTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:driveType ; + ] , + [ + sh:datatype vocabulary1:WindowsVolumeAttributeVocab ; + sh:maxCount "4"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:windowsVolumeAttributes ; + ] + ; + sh:targetClass observable:WindowsVolumeFacet ; + . + +observable:WindowsWaitableTime + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "WindowsWaitableTime"@en ; + rdfs:comment "A Windows waitable timer is a synchronization object within the Windows operating system whose state is set to signaled when a specified due time arrives. There are two types of waitable timers that can be created: manual-reset and synchronization. A timer of either type can also be a periodic timer. [based on https://docs.microsoft.com/en-us/windows/win32/sync/waitable-timer-objects]"@en ; + sh:targetClass observable:WindowsWaitableTime ; + . + +observable:WirelessNetworkConnection + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:NetworkConnection ; + rdfs:label "WirelessNetworkConnection"@en ; + rdfs:comment "A wireless network connection is a connection (completed or attempted) across an IEEE 802.11 standards-confromant digital network (a group of two or more computer systems linked together). [based on https://www.webopedia.com/TERM/N/network.html]"@en ; + sh:targetClass observable:WirelessNetworkConnection ; + . + +observable:WirelessNetworkConnectionFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "WirelessNetworkConnectionFacet"@en ; + rdfs:comment "A wireless network connection facet is a grouping of characteristics unique to a connection (completed or attempted) across an IEEE 802.11 standards-conformant digital network (a group of two or more computer systems linked together). [based on https://www.webopedia.com/TERM/N/network.html]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:baseStation ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:ssid ; + ] + ; + sh:targetClass observable:WirelessNetworkConnectionFacet ; + . + +observable:X509Certificate + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "X509Certificate"@en ; + rdfs:comment "A X.509 certificate is a public key digital identity certificate conformant to the X.509 PKI (Public Key Infrastructure) standard."@en ; + sh:targetClass observable:X509Certificate ; + . + +observable:X509CertificateFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "X509CertificateFacet"@en ; + rdfs:comment "A X.509 certificate facet is a grouping of characteristics unique to a public key digital identity certificate conformant to the X.509 PKI (Public Key Infrastructure) standard. "@en ; + sh:property + [ + sh:class observable:X509V3ExtensionsFacet ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:x509v3extensions ; + ] , + [ + sh:class types:Hash ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:issuerHash ; + ] , + [ + sh:class types:Hash ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:subjectHash ; + ] , + [ + sh:class types:Hash ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path observable:thumbprintHash ; + ] , + [ + sh:datatype xsd:boolean ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:isSelfSigned ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:validityNotAfter ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:validityNotBefore ; + ] , + [ + sh:datatype xsd:integer ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subjectPublicKeyExponent ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:issuer ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:serialNumber ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:signature ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:signatureAlgorithm ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subject ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subjectPublicKeyAlgorithm ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subjectPublicKeyModulus ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:version ; + ] + ; + sh:targetClass observable:X509CertificateFacet ; + . + +observable:X509V3Certificate + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf observable:ObservableObject ; + rdfs:label "X509V3Certificate"@en ; + rdfs:comment "An X.509 v3 certificate is a public key digital identity certificate conformant to the X.509 v3 PKI (Public Key Infrastructure) standard. "@en ; + sh:targetClass observable:X509V3Certificate ; + . + +observable:X509V3ExtensionsFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "X509V3ExtensionsFacet"@en ; + rdfs:comment "An X.509 v3 certificate extensions facet is a grouping of characteristics unique to a public key digital identity certificate conformant to the X.509 v3 PKI (Public Key Infrastructure) standard."@en ; + sh:property + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:privateKeyUsagePeriodNotAfter ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:privateKeyUsagePeriodNotBefore ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:authorityKeyIdentifier ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:basicConstraints ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:certificatePolicies ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:crlDistributionPoints ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:extendedKeyUsage ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:inhibitAnyPolicy ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:issuerAlternativeName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:keyUsage ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:nameConstraints ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:policyConstraints ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:policyMappings ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subjectAlternativeName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subjectDirectoryAttributes ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path observable:subjectKeyIdentifier ; + ] + ; + sh:targetClass observable:X509V3ExtensionsFacet ; + . + +observable:abbreviation + a owl:DatatypeProperty ; + rdfs:label "abbreviation"@en ; + rdfs:comment "The abbreviation of a global flag. See also: http://msdn.microsoft.com/en-us/library/windows/hardware/ff549646(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:accessedDirectory + a owl:ObjectProperty ; + rdfs:label "accessedDirectory"@en ; + rdfs:comment "Directories accessed by the prefetch application during startup."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:accessedFile + a owl:ObjectProperty ; + rdfs:label "accessedFile"@en ; + rdfs:comment "Files (e.g., DLLs and other support files) used by the application during startup."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:accessedTime + a owl:DatatypeProperty ; + rdfs:label "accessedTime"@en ; + rdfs:comment "The date and time at which the Object was accessed."@en ; + rdfs:range xsd:dateTime ; + . + +observable:account + a owl:ObjectProperty ; + rdfs:label "account"@en ; + rdfs:comment "Specifies the account used to run the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381228(v=vs.85).aspx."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:accountIdentifier + a owl:DatatypeProperty ; + rdfs:label "accountIdentifier"@en ; + rdfs:comment "The unique identifier for the account."@en ; + rdfs:range xsd:string ; + . + +observable:accountIssuer + a owl:ObjectProperty ; + rdfs:label "accountIssuer"@en ; + rdfs:comment "The issuer of this account."@en ; + rdfs:range core:UcoObject ; + . + +observable:accountLogin + a owl:DatatypeProperty ; + rdfs:label "accountLogin"@en ; + rdfs:comment "The login identifier for the digital account."@en ; + rdfs:range xsd:string ; + . + +observable:accountLogonType + a owl:DatatypeProperty ; + rdfs:label "accountLogonType"@en ; + rdfs:comment "Specifies the security logon method required to run the tasks associated with the account. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383013(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:accountRunLevel + a owl:DatatypeProperty ; + rdfs:label "accountRunLevel"@en ; + rdfs:comment "Specifies the permission level of the account that the task will be run at."@en ; + rdfs:range xsd:string ; + . + +observable:accountType + a owl:DatatypeProperty ; + rdfs:label "accountType"@en ; + rdfs:comment "The type of account, for instance bank, phone, application, service, etc."@en ; + rdfs:range vocabulary1:AccountTypeVocab ; + . + +observable:actionID + a owl:DatatypeProperty ; + rdfs:label "actionID"@en ; + rdfs:comment "Specifies the user-defined identifier for the action. This identifier is used by the Task Scheduler for logging purposes. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380590(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:actionList + a owl:ObjectProperty ; + rdfs:label "actionList"@en ; + rdfs:comment "Specifies a list of actions to be performed by the scheduled task."@en ; + rdfs:range observable:TaskActionType ; + . + +observable:actionType + a owl:DatatypeProperty ; + rdfs:label "actionType"@en ; + rdfs:comment "Specifies the type of the action. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380596(v=vs.85).aspx."@en ; + rdfs:range vocabulary1:TaskActionTypeVocab ; + . + +observable:activeDirectoryGroups + a owl:DatatypeProperty ; + rdfs:label "activeDirectoryGroups"@en ; + rdfs:range xsd:string ; + . + +observable:adapterName + a owl:DatatypeProperty ; + rdfs:label "adapterName"@en ; + rdfs:comment "Specifies the name of the network adapter used by the network interface."@en ; + rdfs:range xsd:string ; + . + +observable:addressOfEntryPoint + a owl:DatatypeProperty ; + rdfs:label "addressOfEntryPoint"@en ; + rdfs:comment "Specifies the address of the entry point relative to the image base when the executable is loaded into memory."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:addressValue + a owl:DatatypeProperty ; + rdfs:label "addressValue"@en ; + rdfs:comment "The value of an address."@en ; + rdfs:range xsd:string ; + . + +observable:allocationStatus + a owl:DatatypeProperty ; + rdfs:label "allocationStatus"@en ; + rdfs:comment "The allocation status of a file."@en ; + rdfs:range xsd:string ; + . + +observable:alternateDataStreams + a owl:ObjectProperty ; + rdfs:label "alternateDataStreams"@en ; + rdfs:range observable:AlternateDataStream ; + . + +observable:application + a owl:ObjectProperty ; + rdfs:label "application"@en ; + rdfs:comment "The application associated with this object."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:applicationFileName + a owl:DatatypeProperty ; + rdfs:label "applicationFileName"@en ; + rdfs:comment "Name of the executable of the prefetch file."@en ; + rdfs:range xsd:string ; + . + +observable:applicationIdentifier + a owl:DatatypeProperty ; + rdfs:label "applicationIdentifier"@en ; + rdfs:range xsd:string ; + . + +observable:archiveType + a owl:DatatypeProperty ; + rdfs:label "archiveType"@en ; + rdfs:comment "The type of a file archive, e.g. ZIP, GZIP or RAR."@en ; + rdfs:range xsd:string ; + . + +observable:arguments + a owl:DatatypeProperty ; + rdfs:label "arguments"@en ; + rdfs:comment "A list of arguments utilized in initiating the process."@en ; + rdfs:range xsd:string ; + . + +observable:asHandle + a owl:DatatypeProperty ; + rdfs:label "asHandle"@en ; + rdfs:range xsd:string ; + . + +observable:aslrEnabled + a owl:DatatypeProperty ; + rdfs:label "aslrEnabled"@en ; + rdfs:range xsd:boolean ; + . + +observable:attendant + a owl:ObjectProperty ; + rdfs:label "attendant"@en ; + rdfs:comment "The attendants of the event."@en ; + rdfs:range identity:Identity ; + . + +observable:audioType + a owl:DatatypeProperty ; + rdfs:label "audioType"@en ; + rdfs:comment "The type of a audio. For example: music or speech."@en ; + rdfs:range xsd:string ; + . + +observable:authorityKeyIdentifier + a owl:DatatypeProperty ; + rdfs:label "authorityKeyIdentifier"@en ; + rdfs:range xsd:string ; + . + +observable:availableRam + a owl:DatatypeProperty ; + rdfs:label "availableRam"@en ; + rdfs:comment "Specifies the amount of physical memory available on the system, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:baseOfCode + a owl:DatatypeProperty ; + rdfs:label "baseOfCode"@en ; + rdfs:comment "Specifies the address that is relative to the image base of the beginning-of-code section when it is loaded into memory."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:baseStation + a owl:DatatypeProperty ; + rdfs:label "baseStation"@en ; + rdfs:comment "The base station."@en ; + rdfs:range xsd:string ; + . + +observable:basicConstraints + a owl:DatatypeProperty ; + rdfs:label "basicConstraints"@en ; + rdfs:range xsd:string ; + . + +observable:bcc + a owl:ObjectProperty ; + rdfs:label "bcc"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:binary + a owl:ObjectProperty ; + rdfs:label "binary"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:biosDate + a owl:DatatypeProperty ; + rdfs:label "biosDate"@en ; + rdfs:comment "Specifies the date of the BIOS (e.g. the datestamp of the BIOS revision)."@en ; + rdfs:range xsd:dateTime ; + . + +observable:biosManufacturer + a owl:DatatypeProperty ; + rdfs:label "biosManufacturer"@en ; + rdfs:comment "Specifies the manufacturer of the BIOS."@en ; + rdfs:range xsd:string ; + . + +observable:biosReleaseDate + a owl:DatatypeProperty ; + rdfs:label "biosReleaseDate"@en ; + rdfs:comment "Specifies the date the BIOS was released."@en ; + rdfs:range xsd:dateTime ; + . + +observable:biosSerialNumber + a owl:DatatypeProperty ; + rdfs:label "biosSerialNumber"@en ; + rdfs:comment "Specifies the serial number of the BIOS."@en ; + rdfs:range xsd:string ; + . + +observable:biosVersion + a owl:DatatypeProperty ; + rdfs:label "biosVersion"@en ; + rdfs:comment "Specifies the version of the BIOS."@en ; + rdfs:range xsd:string ; + . + +observable:bitRate + a owl:DatatypeProperty ; + rdfs:label "bitRate"@en ; + rdfs:comment "The bitrate of the audio in bits per second."@en ; + rdfs:range xsd:integer ; + . + +observable:bitness + a owl:DatatypeProperty ; + rdfs:label "bitness"@en ; + rdfs:comment "Specifies the bitness of the operating system (i.e. 32 or 64). Note that this is potentially different from the word size of the underlying hardware or CPU. A 32-bit operating system can be installed on a machine running a 64-bit processor."@en ; + rdfs:range xsd:string ; + . + +observable:bitsPerPixel + a owl:DatatypeProperty ; + rdfs:label "bitsPerPixel"@en ; + rdfs:range xsd:integer ; + . + +observable:blockType + a owl:DatatypeProperty ; + rdfs:label "blockType"@en ; + rdfs:comment "The blockType property specifies the block type of a particular memory object."@en ; + rdfs:range vocabulary1:MemoryBlockTypeVocab ; + . + +observable:bluetoothDeviceName + a owl:DatatypeProperty ; + rdfs:label "bluetoothDeviceName"@en ; + rdfs:comment "Name configured withing Bluetooth settings on a device."@en ; + rdfs:range xsd:string ; + . + +observable:body + a owl:DatatypeProperty ; + rdfs:label "body"@en ; + rdfs:range xsd:string ; + . + +observable:bodyMultipart + a owl:ObjectProperty ; + rdfs:label "bodyMultipart"@en ; + rdfs:comment "A list of the MIME parts that make up the email body. This field MAY only be used if isMultipart is true."@en ; + rdfs:range observable:MimePartType ; + . + +observable:bodyRaw + a owl:ObjectProperty ; + rdfs:label "bodyRaw"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:bookmarkPath + a owl:DatatypeProperty ; + rdfs:label "bookmarkPath"@en ; + rdfs:comment "The folder containing the bookmark."@en ; + rdfs:range xsd:string ; + . + +observable:browserInformation + a owl:ObjectProperty ; + rdfs:label "Browser Information"@en ; + rdfs:comment "Specifies information about the particular Web Browser."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:browserUserProfile + a owl:DatatypeProperty ; + rdfs:label "Browser User Profile"@en ; + rdfs:comment "Specifies the web browser user profile for which the URL history entry was created."@en ; + rdfs:range xsd:string ; + . + +observable:byteOrder + a owl:DatatypeProperty ; + rdfs:label "byteOrder"@en ; + rdfs:range vocabulary1:EndiannessTypeVocab ; + . + +observable:byteStringValue + a owl:DatatypeProperty ; + rdfs:label "byteStringValue"@en ; + rdfs:comment "Specifies the raw, byte-string representation of the extracted string."@en ; + . + +observable:callType + a owl:DatatypeProperty ; + rdfs:label "callType"@en ; + rdfs:comment "The type of a phone call,for example incoming, outgoing, missed."@en ; + rdfs:range xsd:string ; + . + +observable:camera + a owl:ObjectProperty ; + rdfs:label "camera"@en ; + rdfs:comment "The name/make of the camera that was used for taking the picture."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:canEscalatePrivs + a owl:DatatypeProperty ; + rdfs:label "canEscalatePrivs"@en ; + rdfs:range xsd:boolean ; + . + +observable:carrier + a owl:ObjectProperty ; + rdfs:label "carrier"@en ; + rdfs:comment "Telecommunications service provider that sold the SIM card."@en ; + rdfs:range identity:Identity ; + . + +observable:categories + a owl:DatatypeProperty ; + rdfs:label "categories"@en ; + rdfs:comment "Categories applied to the object."@en ; + rdfs:range xsd:string ; + . + +observable:cc + a owl:ObjectProperty ; + rdfs:label "cc"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:certificateIssuer + a owl:ObjectProperty ; + rdfs:label "certificateIssuer"@en ; + rdfs:range identity:Identity ; + . + +observable:certificatePolicies + a owl:DatatypeProperty ; + rdfs:label "certificatePolicies"@en ; + rdfs:range xsd:string ; + . + +observable:certificateSubject + a owl:ObjectProperty ; + rdfs:label "certificateSubject"@en ; + rdfs:range core:UcoObject ; + . + +observable:characteristics + a owl:DatatypeProperty ; + rdfs:label "characteristics"@en ; + rdfs:comment "Specifies the flags that indicate the file’s characteristics."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:checksum + a owl:DatatypeProperty ; + rdfs:label "checksum"@en ; + rdfs:comment "Specifies the checksum of the PE binary."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:clockSetting + a owl:DatatypeProperty ; + rdfs:label "clockSetting"@en ; + rdfs:comment "The generalizedTime value on the mobile device when it was processed."@en ; + rdfs:range xsd:dateTime ; + . + +observable:clusterSize + a owl:DatatypeProperty ; + rdfs:label "clusterSize"@en ; + rdfs:comment "The size of cluster allocation units in a file system."@en ; + rdfs:range xsd:integer ; + . + +observable:columnName + a owl:DatatypeProperty ; + rdfs:label "columnName"@en ; + rdfs:range xsd:string ; + . + +observable:comClassID + a owl:DatatypeProperty ; + rdfs:label "comClassID"@en ; + rdfs:comment "Specifies the ID of the COM action. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380613(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:comData + a owl:DatatypeProperty ; + rdfs:label "comData"@en ; + rdfs:comment "Specifies the data associated with the COM handler. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380613(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:comment + a owl:DatatypeProperty ; + rdfs:label "comment"@en ; + rdfs:range xsd:string ; + . + +observable:compressionMethod + a owl:DatatypeProperty ; + rdfs:label "compressionMethod"@en ; + rdfs:comment "The algorithm used to compress the data."@en ; + rdfs:range xsd:string ; + . + +observable:compressionRatio + a owl:DatatypeProperty ; + rdfs:label "compressionRatio"@en ; + rdfs:comment "The compression ratio of the compressed data."@en ; + rdfs:range xsd:double ; + . + +observable:computerName + a owl:DatatypeProperty ; + rdfs:label "computerName"@en ; + rdfs:comment "A name of the computer on which the log entry was created."@en ; + rdfs:range xsd:string ; + . + +observable:contact + a owl:ObjectProperty ; + rdfs:label "contact"@en ; + rdfs:comment "Contact specifies information characterizing contact details for a single entity."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:contactAddress + a owl:ObjectProperty ; + rdfs:label "contactAddress"@en ; + rdfs:comment "Contact address specifies information characterizing a geolocation address of a contact entity."@en ; + rdfs:range observable:ContactAddress ; + . + +observable:contactAddressScope + a owl:DatatypeProperty ; + rdfs:label "contactAddressScope"@en ; + rdfs:comment "Contact address scope specifies the relevant scope (home, work, school, etc) for a geolocation address of a contact entity."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:string + vocabulary1:ContactAddressScopeVocab + ) ; + ] ; + . + +observable:contactAffiliation + a owl:ObjectProperty ; + rdfs:label "contactAffiliation"@en ; + rdfs:comment "Contact affiliation specifies information characterizing details of an organizational affiliation for a single contact entity."@en ; + rdfs:range observable:ContactAffiliation ; + . + +observable:contactEmail + a owl:ObjectProperty ; + rdfs:label "contactEmail"@en ; + rdfs:comment "Contact email specifies information characterizing details for contacting a contact entity by email."@en ; + rdfs:range observable:ContactEmail ; + . + +observable:contactEmailScope + a owl:DatatypeProperty ; + rdfs:label "contactEmailScope"@en ; + rdfs:comment "Contact email scope specifies the relevant scope (home, work, school, etc) of details for contacting a contact entity by email."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:string + vocabulary1:ContactEmailScopeVocab + ) ; + ] ; + . + +observable:contactGroup + a owl:DatatypeProperty ; + rdfs:label "contactGroup"@en ; + rdfs:comment "Contact group specifies the name/tag of a particular named/tagged grouping of contacts."@en ; + rdfs:range xsd:string ; + . + +observable:contactID + a owl:DatatypeProperty ; + rdfs:label "contactID"@en ; + rdfs:comment "Specifies an ID for the contact."@en ; + rdfs:range xsd:string ; + . + +observable:contactMessaging + a owl:ObjectProperty ; + rdfs:label "contactMessaging"@en ; + rdfs:comment "Contact messaging specifies information characterizing details for contacting a contact entity by digital messaging."@en ; + rdfs:range observable:ContactMessaging ; + . + +observable:contactMessagingPlatform + a owl:ObjectProperty ; + rdfs:label "contactMessagingPlatform"@en ; + rdfs:comment "A contact messaging platform specifies a digital messaging platform associated with a contact."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:contactNote + a owl:DatatypeProperty ; + rdfs:label "contactNote"@en ; + rdfs:comment "Contact note specifies a comment/note associated with a given contact."@en ; + rdfs:range xsd:string ; + . + +observable:contactOrganization + a owl:ObjectProperty ; + rdfs:label "contactOrganization"@en ; + rdfs:comment "The name of the organization a contact works for or is assocciated with."@en ; + rdfs:range identity:Organization ; + . + +observable:contactPhone + a owl:ObjectProperty ; + rdfs:label "contactPhone"@en ; + rdfs:comment "Contact phone specifies information characterizing details for contacting a contact entity by telephone."@en ; + rdfs:range observable:ContactPhone ; + . + +observable:contactPhoneNumber + a owl:ObjectProperty ; + rdfs:label "contactPhoneNumber"@en ; + rdfs:comment "Contact phone number specifies a telephone service account number for contacting a contact entity by telephone."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:contactPhoneScope + a owl:DatatypeProperty ; + rdfs:label "contactPhoneScope"@en ; + rdfs:comment "Contact phone scope specifies the relevant scope (home, work, school, etc) of details for contacting a contact entity by telephone."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:string + vocabulary1:ContactPhoneScopeVocab + ) ; + ] ; + . + +observable:contactProfile + a owl:ObjectProperty ; + rdfs:label "contactProfile"@en ; + rdfs:comment "Contact profile specifies information characterizing details for contacting a contact entity by online service."@en ; + rdfs:range observable:ContactProfile ; + . + +observable:contactProfilePlatform + a owl:ObjectProperty ; + rdfs:label "contactProfilePlatform"@en ; + rdfs:comment "A contact profile platform specifies an online service platform associated with a contact."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:contactSIP + a owl:ObjectProperty ; + rdfs:label "contactSIP"@en ; + rdfs:comment "Contact SIP specifies information characterizing details for contacting a contact entity by Session Initiation Protocol (SIP)."@en ; + rdfs:range observable:ContactSIP ; + . + +observable:contactSIPScope + a owl:DatatypeProperty ; + rdfs:label "contactSIPScope"@en ; + rdfs:comment "Contact SIP scope specifies the relevant scope (home, work, school, etc) of details for contacting a contact entity by Session Initiation Protocol (SIP)."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:string + vocabulary1:ContactSIPScopeVocab + ) ; + ] ; + . + +observable:contactURL + a owl:ObjectProperty ; + rdfs:label "contactURL"@en ; + rdfs:comment "Contact URL specifies information characterizing details for contacting a contact entity by Uniform Resource Locator (URL)."@en ; + rdfs:range observable:ContactURL ; + . + +observable:contactURLScope + a owl:DatatypeProperty ; + rdfs:label "contactURLScope"@en ; + rdfs:comment "Contact url scope specifies the relevant scope (homepage, home, work, school, etc) of details for contacting a contact entity by Uniform Resource Locator (URL)."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:string + vocabulary1:ContactURLScopeVocab + ) ; + ] ; + . + +observable:contentDisposition + a owl:DatatypeProperty ; + rdfs:label "contentDisposition"@en ; + rdfs:range xsd:string ; + . + +observable:contentType + a owl:DatatypeProperty ; + rdfs:label "contentType"@en ; + rdfs:range xsd:string ; + . + +observable:context + a owl:DatatypeProperty ; + rdfs:label "context"@en ; + rdfs:range xsd:string ; + . + +observable:controlCode + a owl:DatatypeProperty ; + rdfs:label "controlCode"@en ; + rdfs:comment "Specifies the actual control code that was sent to the observable object."@en ; + rdfs:range xsd:string ; + . + +observable:cookieDomain + a owl:ObjectProperty ; + rdfs:label "cookieDomain"@en ; + rdfs:comment "The domain for which the cookie is stored, for example nfi.minjus.nl."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:cookieName + a owl:DatatypeProperty ; + rdfs:label "cookieName"@en ; + rdfs:comment "The name of the cookie."@en ; + rdfs:range xsd:string ; + . + +observable:cookiePath + a owl:DatatypeProperty ; + rdfs:label "cookiePath"@en ; + rdfs:comment "String representation of the path of the cookie."@en ; + rdfs:range xsd:string ; + . + +observable:cpeid + a owl:DatatypeProperty ; + rdfs:label "cpeid"@en ; + rdfs:comment "Specifies the Common Platform Enumeration identifier for the software."@en ; + rdfs:range xsd:string ; + . + +observable:cpu + a owl:DatatypeProperty ; + rdfs:label "cpu"@en ; + rdfs:comment "Specifies the name of the CPU used by the system."@en ; + rdfs:range xsd:string ; + . + +observable:cpuFamily + a owl:DatatypeProperty ; + rdfs:label "cpuFamily"@en ; + rdfs:comment "Specifies the name of the CPU family used by the system."@en ; + rdfs:range xsd:string ; + . + +observable:creationDate + a owl:DatatypeProperty ; + rdfs:label "creationDate"@en ; + rdfs:comment "Specifies the date in which the registered domain was created."@en ; + rdfs:range xsd:dateTime ; + . + +observable:creationFlags + a owl:DatatypeProperty ; + rdfs:label "creationFlags"@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:creationTime + a owl:DatatypeProperty ; + rdfs:label "creationTime"@en ; + rdfs:range xsd:dateTime ; + . + +observable:creator + a owl:ObjectProperty ; + rdfs:label "creator"@en ; + rdfs:comment "Specifies the name of the creator of the registry key."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:creatorUser + a owl:ObjectProperty ; + rdfs:label "creatorUser"@en ; + rdfs:comment "The user that created/owns the process."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:crlDistributionPoints + a owl:DatatypeProperty ; + rdfs:label "crlDistributionPoints"@en ; + rdfs:range xsd:string ; + . + +observable:currentSystemDate + a owl:DatatypeProperty ; + rdfs:label "currentSystemDate"@en ; + rdfs:comment "Specifies the current date on the system."@en ; + rdfs:range xsd:dateTime ; + . + +observable:currentWorkingDirectory + a owl:DatatypeProperty ; + rdfs:label "currentWorkingDirectory"@en ; + rdfs:range xsd:string ; + . + +observable:cyberAction + a owl:ObjectProperty ; + rdfs:label "cyberAction"@en ; + rdfs:comment "The action taken in response to the event."@en ; + rdfs:range observable:ObservableAction ; + . + +observable:data + a owl:DatatypeProperty ; + rdfs:label "data"@en ; + rdfs:range xsd:string ; + . + +observable:dataPayload + a owl:DatatypeProperty ; + rdfs:label "dataPayload"@en ; + rdfs:range xsd:string ; + . + +observable:dataPayloadReferenceURL + a owl:ObjectProperty ; + rdfs:label "dataPayloadReferenceURL"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:dataType + a owl:DatatypeProperty ; + rdfs:label "dataType"@en ; + rdfs:range xsd:string ; + . + +observable:depEnabled + a owl:DatatypeProperty ; + rdfs:label "depEnabled"@en ; + rdfs:range xsd:boolean ; + . + +observable:descriptions + a owl:DatatypeProperty ; + rdfs:label "descriptions"@en ; + rdfs:range xsd:string ; + . + +observable:destination + a owl:DatatypeProperty ; + rdfs:label "destination"@en ; + rdfs:comment "The destination of a global flag. See also: http://msdn.microsoft.com/en-us/library/windows/hardware/ff549646(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:destinationFlags + a owl:DatatypeProperty ; + rdfs:label "destinationFlags"@en ; + rdfs:comment """Specifies the destination TCP flags. + """@en ; + . + +observable:destinationPort + a owl:DatatypeProperty ; + rdfs:label "destinationPort"@en ; + rdfs:comment "Specifies the destination port used in the connection, as an integer in the range of 0 - 65535."@en ; + rdfs:range xsd:integer ; + . + +observable:deviceType + a owl:DatatypeProperty ; + rdfs:label "deviceType"@en ; + rdfs:range xsd:string ; + . + +observable:dhcpLeaseExpires + a owl:DatatypeProperty ; + rdfs:label "dhcpLeaseExpires"@en ; + rdfs:comment "Specifies the date/time that the DHCP lease obtained on the network interface expires."@en ; + rdfs:range xsd:dateTime ; + . + +observable:dhcpLeaseObtained + a owl:DatatypeProperty ; + rdfs:label "dhcpLeaseObtained"@en ; + rdfs:comment "Specifies the date/time that the DHCP lease was obtained on the network interface."@en ; + rdfs:range xsd:dateTime ; + . + +observable:dhcpServer + a owl:ObjectProperty ; + rdfs:label "dhcpServer"@en ; + rdfs:comment "Specifies the list of DHCP server IP Addresses used by the network interface."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:diskPartitionType + a owl:DatatypeProperty ; + rdfs:label "diskPartitionType"@en ; + rdfs:comment "Specifies the type of partition being characterized."@en ; + rdfs:range xsd:string ; + . + +observable:diskSize + a owl:DatatypeProperty ; + rdfs:label "diskSize"@en ; + rdfs:comment "The size of the disk, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:diskType + a owl:DatatypeProperty ; + rdfs:label "diskType"@en ; + rdfs:comment "The type of disk being characterized, e.g., removable."@en ; + rdfs:range xsd:string ; + . + +observable:displayName + a owl:DatatypeProperty ; + rdfs:label "displayName"@en ; + rdfs:comment "Display name specifies the name to display for some entity within a user interface."@en ; + rdfs:range xsd:string ; + . + +observable:dllCharacteristics + a owl:DatatypeProperty ; + rdfs:label "dllCharacteristics"@en ; + rdfs:comment "Specifies the flags that characterize the PE binary."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:dnssec + a owl:DatatypeProperty ; + rdfs:label "dnssec"@en ; + rdfs:comment "Specifies the DNSSEC property associated with a Whois entry. Acceptable values are: 'Signed' or 'Unsigned'."@en ; + rdfs:range vocabulary1:WhoisDNSSECTypeVocab ; + . + +observable:documentInformationDictionary + a owl:ObjectProperty ; + rdfs:label "documentInformationDictionary"@en ; + rdfs:range types:ControlledDictionary ; + . + +observable:domain + a owl:DatatypeProperty ; + rdfs:label "domain"@en ; + rdfs:comment "The domain(s) that the system belongs to."@en ; + rdfs:range xsd:string ; + . + +observable:domainID + a owl:DatatypeProperty ; + rdfs:label "domainID"@en ; + rdfs:comment "Specifies the domain id for the domain associated with a Whois entry."@en ; + rdfs:range xsd:string ; + . + +observable:domainName + a owl:ObjectProperty ; + rdfs:label "domainName"@en ; + rdfs:comment "Specifies the corresponding domain name for a whois entry."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:driveLetter + a owl:DatatypeProperty ; + rdfs:label "driveLetter"@en ; + rdfs:comment "Specifies the drive letter of a windows volume."@en ; + rdfs:range xsd:string ; + . + +observable:driveType + a owl:DatatypeProperty ; + rdfs:label "driveType"@en ; + rdfs:comment "Specifies the drive type of a windows volume."@en ; + rdfs:range vocabulary1:WindowsDriveTypeVocab ; + . + +observable:dst + a owl:ObjectProperty ; + rdfs:label "dst"@en ; + rdfs:comment "Specifies the destination(s) of the network connection."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:dstBytes + a owl:DatatypeProperty ; + rdfs:label "dstBytes"@en ; + rdfs:range xsd:integer ; + . + +observable:dstPackets + a owl:DatatypeProperty ; + rdfs:label "dstPackets"@en ; + rdfs:range xsd:integer ; + . + +observable:dstPayload + a owl:ObjectProperty ; + rdfs:label "dstPayload"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:duration + a owl:DatatypeProperty ; + rdfs:label "duration"@en ; + rdfs:comment "The duration of the phone call in seconds."@en ; + rdfs:range xsd:integer ; + . + +observable:effectiveGroup + a owl:DatatypeProperty ; + rdfs:label "effectiveGroup"@en ; + rdfs:comment "Specifies the name of the effective group used in the user session."@en ; + rdfs:range xsd:string ; + . + +observable:effectiveGroupID + a owl:DatatypeProperty ; + rdfs:label "effectiveGroupID"@en ; + rdfs:comment "Specifies the effective group ID of the group used in the user session."@en ; + rdfs:range xsd:string ; + . + +observable:effectiveUser + a owl:ObjectProperty ; + rdfs:label "effectiveUser"@en ; + rdfs:comment "Specifies the effective user details used in the user session."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:emailAddress + a owl:ObjectProperty ; + rdfs:label "emailAddress"@en ; + rdfs:comment "An email address."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:encoding + a owl:DatatypeProperty ; + rdfs:label "Encoding"@en ; + rdfs:comment "The encoding method used for the extracted string."@en ; + rdfs:range xsd:string ; + . + +observable:encodingMethod + a owl:DatatypeProperty ; + rdfs:label "encodingMethod"@en ; + rdfs:range xsd:string ; + . + +observable:encryptionIV + a owl:DatatypeProperty ; + rdfs:label "encryptionIV"@en ; + rdfs:range xsd:string ; + . + +observable:encryptionKey + a owl:DatatypeProperty ; + rdfs:label "encryptionKey"@en ; + rdfs:range xsd:string ; + . + +observable:encryptionMethod + a owl:DatatypeProperty ; + rdfs:label "encryptionMethod"@en ; + rdfs:range xsd:string ; + . + +observable:encryptionMode + a owl:DatatypeProperty ; + rdfs:label "encryptionMode"@en ; + rdfs:range xsd:string ; + . + +observable:endTime + a owl:DatatypeProperty ; + rdfs:label "endTime"@en ; + rdfs:range xsd:dateTime ; + . + +observable:englishTranslation + a owl:DatatypeProperty ; + rdfs:label "englishTranslation"@en ; + rdfs:comment "Specifies the English translation of the string, if it is not written in English."@en ; + rdfs:range xsd:string ; + . + +observable:entropy + a owl:DatatypeProperty ; + rdfs:label "entropy"@en ; + rdfs:comment "Shannon entropy (a measure of randomness) of the data."@en ; + rdfs:range xsd:double ; + . + +observable:entryID + a owl:DatatypeProperty ; + rdfs:label "entryID"@en ; + rdfs:comment "A unique identifier for the file within the filesystem."@en ; + rdfs:range xsd:integer ; + . + +observable:environmentVariables + a owl:ObjectProperty ; + rdfs:label "environmentVariables"@en ; + rdfs:comment "A list of environment variables associated with the process. "@en ; + rdfs:range types:Dictionary ; + . + +observable:eventID + a owl:DatatypeProperty ; + rdfs:label "eventID"@en ; + rdfs:comment "The identifier of the event."@en ; + rdfs:range xsd:string ; + . + +observable:eventStatus + a owl:DatatypeProperty ; + rdfs:label "eventStatus"@en ; + rdfs:comment "The status of the event, for instance accepted, pending or cancelled."@en ; + rdfs:range xsd:string ; + . + +observable:eventText + a owl:DatatypeProperty ; + rdfs:label "eventText"@en ; + rdfs:comment "The textual representation of the event."@en ; + rdfs:range xsd:string ; + . + +observable:eventType + a owl:DatatypeProperty ; + rdfs:label "eventType"@en ; + rdfs:comment "The type of the event, for example 'information', 'warning' or 'error'."@en ; + rdfs:range xsd:string ; + . + +observable:execArguments + a owl:DatatypeProperty ; + rdfs:label "execArguments"@en ; + rdfs:comment "Specifies the arguments associated with the command-line operation launched by the action. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380715(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:execProgramHashes + a owl:ObjectProperty ; + rdfs:label "execProgramHashes"@en ; + rdfs:comment "Specifies the hashes of the executable file launched by the action."@en ; + rdfs:range types:Hash ; + . + +observable:execProgramPath + a owl:DatatypeProperty ; + rdfs:label "execProgramPath"@en ; + rdfs:comment "Specifies the path to the executable file launched by the action. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380715(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:execWorkingDirectory + a owl:DatatypeProperty ; + rdfs:label "execWorkingDirectory"@en ; + rdfs:comment "Specifies the directory that contains either the executable file or the files that are used by the executable file launched by the action. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380715(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:exifData + a owl:ObjectProperty ; + rdfs:label "exifData"@en ; + rdfs:range types:ControlledDictionary ; + . + +observable:exitCode + a owl:DatatypeProperty ; + rdfs:label "exitCode"@en ; + rdfs:comment "Specifies the last exit code of the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381245(v=vs.85).aspx."@en ; + rdfs:range xsd:integer ; + . + +observable:exitStatus + a owl:DatatypeProperty ; + rdfs:label "exitStatus"@en ; + rdfs:comment "A small number passed from the process to the parent process when it has finished executing. In general, 0 indicates successful termination, any other number indicates a failure."@en ; + rdfs:range xsd:integer ; + . + +observable:exitTime + a owl:DatatypeProperty ; + rdfs:label "exitTime"@en ; + rdfs:comment "The time at which the process exited."@en ; + rdfs:range xsd:dateTime ; + . + +observable:expirationDate + a owl:DatatypeProperty ; + rdfs:label "expirationDate"@en ; + rdfs:comment "Specifies the date in which the registered domain will expire."@en ; + rdfs:range xsd:dateTime ; + . + +observable:expirationTime + a owl:DatatypeProperty ; + rdfs:label "expirationTime"@en ; + rdfs:comment "The date and time at which the validity of the object expires."@en ; + rdfs:range xsd:dateTime ; + . + +observable:extDeletionTime + a owl:DatatypeProperty ; + rdfs:label "extDeletionTime"@en ; + rdfs:comment "Specifies the time at which the file represented by an Inode was 'deleted'."@en ; + rdfs:range xsd:dateTime ; + . + +observable:extFileType + a owl:DatatypeProperty ; + rdfs:label "extFileType"@en ; + rdfs:comment "Specifies the EXT file type (FIFO, Directory, Regular file, Symbolic link, etc) for the Inode."@en ; + rdfs:range xsd:integer ; + . + +observable:extFlags + a owl:DatatypeProperty ; + rdfs:label "extFlags"@en ; + rdfs:comment "Specifies user flags to further protect (limit its use and modification) the file represented by an Inode."@en ; + rdfs:range xsd:integer ; + . + +observable:extHardLinkCount + a owl:DatatypeProperty ; + rdfs:label "extHardLinkCount"@en ; + rdfs:comment "Specifies a count of how many hard links point to an Inode."@en ; + rdfs:range xsd:integer ; + . + +observable:extInodeChangeTime + a owl:DatatypeProperty ; + rdfs:label "extInodeChangeTime"@en ; + rdfs:comment "The date and time at which the file Inode metadata was last modified."@en ; + rdfs:range xsd:dateTime ; + . + +observable:extInodeID + a owl:DatatypeProperty ; + rdfs:label "extInodeID"@en ; + rdfs:comment "Specifies a single Inode identifier."@en ; + rdfs:range xsd:integer ; + . + +observable:extPermissions + a owl:DatatypeProperty ; + rdfs:label "extPermissions"@en ; + rdfs:comment "Specifies the read/write/execute permissions for the file represented by an EXT Inode."@en ; + rdfs:range xsd:integer ; + . + +observable:extSGID + a owl:DatatypeProperty ; + rdfs:label "extSGID"@en ; + rdfs:comment "Specifies the group ID for the file represented by an Inode."@en ; + rdfs:range xsd:integer ; + . + +observable:extSUID + a owl:DatatypeProperty ; + rdfs:label "extSUID"@en ; + rdfs:comment "Specifies the user ID that 'owns' the file represented by an Inode."@en ; + rdfs:range xsd:integer ; + . + +observable:extendedKeyUsage + a owl:DatatypeProperty ; + rdfs:label "extendedKeyUsage"@en ; + rdfs:range xsd:string ; + . + +observable:extension + a owl:DatatypeProperty ; + rdfs:label "extension"@en ; + rdfs:comment "The file name extension: everything after the last dot. Not present if the file has no dot in its name."@en ; + rdfs:range xsd:string ; + . + +observable:favoritesCount + a owl:DatatypeProperty ; + rdfs:label "Favorites Count"@en-US ; + rdfs:comment "Specifies the number of times that this profile has favorited a tweet."@en-US ; + rdfs:range xsd:nonNegativeInteger ; + . + +observable:fileAlignment + a owl:DatatypeProperty ; + rdfs:label "fileAlignment"@en ; + rdfs:comment "Specifies the factor (in bytes) that is used to align the raw data of sections in the image file."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:fileHeaderHashes + a owl:ObjectProperty ; + rdfs:label "fileHeaderHashes"@en ; + rdfs:comment "Specifies any hashes that were computed for the file header."@en ; + rdfs:range types:Hash ; + . + +observable:fileName + a owl:DatatypeProperty ; + rdfs:label "fileName"@en ; + rdfs:comment "Specifies the name associated with a file in a file system."@en ; + rdfs:range xsd:string ; + . + +observable:filePath + a owl:DatatypeProperty ; + rdfs:label "filePath"@en ; + rdfs:comment "Specifies the file path for the location of a file within a filesystem."@en ; + rdfs:range xsd:string ; + . + +observable:fileSystemType + a owl:DatatypeProperty ; + rdfs:label "fileSystemType"@en ; + rdfs:comment "The specific type of a file system."@en ; + rdfs:range xsd:string ; + . + +observable:firstLoginTime + a owl:DatatypeProperty ; + rdfs:label "firstLoginTime"@en ; + rdfs:comment "The date and time of the first login of the account."@en ; + rdfs:range xsd:dateTime ; + . + +observable:firstName + a owl:DatatypeProperty ; + rdfs:label "firstName"@en ; + rdfs:comment "The first name of a person."@en ; + rdfs:range xsd:string ; + . + +observable:firstRun + a owl:DatatypeProperty ; + rdfs:label "firstRun"@en ; + rdfs:comment "Timestamp of when the prefetch application was first run."@en ; + rdfs:range xsd:dateTime ; + . + +observable:firstVisit + a owl:DatatypeProperty ; + rdfs:label "First Visit Time"@en ; + rdfs:comment "Specifies the date/time that the URL referred to by the URL field was first visited."@en-US ; + rdfs:range xsd:dateTime ; + . + +observable:flags + a owl:DatatypeProperty ; + rdfs:label "flags"@en ; + rdfs:comment "Specifies any flags that modify the behavior of the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381248(v=vs.85).aspx."@en ; + rdfs:range vocabulary1:TaskFlagVocab ; + . + +observable:followersCount + a owl:DatatypeProperty ; + rdfs:label "Followers Count"@en-US ; + rdfs:comment "Specifies the followers count associated with the twitter profile."@en-US ; + rdfs:range xsd:nonNegativeInteger ; + . + +observable:format + a owl:DatatypeProperty ; + rdfs:label "format"@en ; + rdfs:comment "The format of the audio. For example: mp3 or flac."@en ; + rdfs:range xsd:string ; + . + +observable:fragment + a owl:DatatypeProperty ; + rdfs:label "fragment"@en ; + rdfs:comment "Fragment pointing to a specific part in the resource."@en ; + rdfs:range xsd:string ; + . + +observable:fragmentIndex + a owl:DatatypeProperty ; + rdfs:label "fragmentIndex"@en ; + rdfs:range xsd:integer ; + . + +observable:freeSpace + a owl:DatatypeProperty ; + rdfs:label "freeSpace"@en ; + rdfs:comment "The amount of free space on the disk, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:friendsCount + a owl:DatatypeProperty ; + rdfs:label "Friends Count"@en-US ; + rdfs:comment "Specifies the friends count associated with the twitter profile."@en-US ; + rdfs:range xsd:nonNegativeInteger ; + . + +observable:from + a owl:ObjectProperty ; + rdfs:label "from"@en ; + rdfs:comment "The phone number of the initiating party."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:fromURLVisit + a owl:ObjectProperty ; + rdfs:label "From URL Visit"@en ; + rdfs:comment "Specifies the URL visit origination point (i.e., URL) of the URL captured in the URL history entry, if applicable."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:fullValue + a owl:DatatypeProperty ; + rdfs:label "fullValue"@en ; + rdfs:comment "The full string value of the URL."@en ; + rdfs:range xsd:string ; + . + +observable:geoLocationEntry + a owl:ObjectProperty ; + rdfs:label "geoLocationEntry"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:geolocationAddress + a owl:ObjectProperty ; + rdfs:label "geolocationAddress"@en ; + rdfs:comment "An administrative address for a particular geolocation."@en ; + rdfs:range location:Location ; + . + +observable:gid + a owl:DatatypeProperty ; + rdfs:label "gid"@en ; + rdfs:range xsd:integer ; + . + +observable:globalFlagList + a owl:ObjectProperty ; + rdfs:label "globalFlagList"@en ; + rdfs:comment "A list of global flags. See also: http://msdn.microsoft.com/en-us/library/windows/hardware/ff549557(v=vs.85).aspx."@en ; + rdfs:range observable:GlobalFlagType ; + . + +observable:gpu + a owl:DatatypeProperty ; + rdfs:label "gpu"@en ; + rdfs:comment "Specifies the name of the GPU used by the system."@en ; + rdfs:range xsd:string ; + . + +observable:gpuFamily + a owl:DatatypeProperty ; + rdfs:label "gpuFamily"@en ; + rdfs:comment "Specifies the name of the GPU family used by the system."@en ; + rdfs:range xsd:string ; + . + +observable:groupName + a owl:DatatypeProperty ; + rdfs:label "groupName"@en ; + rdfs:range xsd:string ; + . + +observable:groups + a owl:DatatypeProperty ; + rdfs:label "groups"@en ; + rdfs:range xsd:string ; + . + +observable:hasChanged + a owl:DatatypeProperty ; + rdfs:label "hasChanged"@en ; + rdfs:range xsd:boolean ; + . + +observable:hash + a owl:ObjectProperty ; + rdfs:label "hash"@en ; + rdfs:comment "Hash values of the data."@en ; + rdfs:range types:Hash ; + . + +observable:hashes + a owl:ObjectProperty ; + rdfs:label "hashes"@en ; + rdfs:comment "Specifies any hashes computed over the section."@en ; + rdfs:range types:Hash ; + . + +observable:headerRaw + a owl:ObjectProperty ; + rdfs:label "headerRaw"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:hexadecimalValue + a owl:DatatypeProperty ; + rdfs:label "hexadecimalValue"@en ; + rdfs:comment "The hexadecimal value of a global flag. See also: http://msdn.microsoft.com/en-us/library/windows/hardware/ff549646(v=vs.85).aspx."@en ; + rdfs:range xsd:hexBinary ; + . + +observable:hiveType + a owl:DatatypeProperty ; + rdfs:label "hiveType"@en ; + rdfs:comment "The type of a registry hive."@en ; + rdfs:range xsd:string ; + . + +observable:homeDirectory + a owl:DatatypeProperty ; + rdfs:label "homeDirectory"@en ; + rdfs:range xsd:string ; + . + +observable:host + a owl:ObjectProperty ; + rdfs:label "host"@en ; + rdfs:comment "Domain name or IP address where the resource is located."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:hostname + a owl:DatatypeProperty ; + rdfs:label "hostname"@en ; + rdfs:comment "Specifies the hostname of the system."@en ; + rdfs:range xsd:string ; + . + +observable:httpMesageBodyLength + a owl:DatatypeProperty ; + rdfs:label "httpMesageBodyLength"@en ; + rdfs:comment "Specifies the length of an HTTP message body in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:httpMessageBodyData + a owl:ObjectProperty ; + rdfs:label "httpMessageBodyData"@en ; + rdfs:comment "Specifies the data contained in an HTTP message body."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:httpRequestHeader + a owl:ObjectProperty ; + rdfs:label "httpRequestHeader"@en ; + rdfs:comment "Specifies all of the HTTP header fields that may be found in the HTTP client request"@en ; + rdfs:range types:Dictionary ; + . + +observable:iComHandlerAction + a owl:ObjectProperty ; + rdfs:label "iComHandlerAction"@en ; + rdfs:comment "Specifies the data associated with the task action-fired COM handler."@en ; + rdfs:range observable:IComHandlerActionType ; + . + +observable:iEmailAction + a owl:ObjectProperty ; + rdfs:label "iEmailAction"@en ; + rdfs:comment "Specifies an action that sends an e-mail, which in this context refers to actual email message sent. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380693(v=vs.85).aspx."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:iExecAction + a owl:ObjectProperty ; + rdfs:label "iExecAction"@en ; + rdfs:comment "Specifies an action that executes a command-line operation. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380715(v=vs.85).aspx."@en ; + rdfs:range observable:IExecActionType ; + . + +observable:iShowMessageAction + a owl:ObjectProperty ; + rdfs:label "iShowMessageAction"@en ; + rdfs:comment "Specifies an action that shows a message box when a task is activated. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381302(v=vs.85).aspx."@en ; + rdfs:range observable:IShowMessageActionType ; + . + +observable:icmpCode + a owl:DatatypeProperty ; + rdfs:label "icmpCode"@en ; + rdfs:comment "Specifies the ICMP code byte."@en ; + rdfs:range xsd:hexBinary ; + . + +observable:icmpType + a owl:DatatypeProperty ; + rdfs:label "icmpType"@en ; + rdfs:comment "Specifies the ICMP type byte."@en ; + rdfs:range xsd:hexBinary ; + . + +observable:imageBase + a owl:DatatypeProperty ; + rdfs:label "imageBase"@en ; + rdfs:comment "Specifies the address that is relative to the image base of the beginning-of-data section when it is loaded into memory."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:imageCompressionMethod + a owl:DatatypeProperty ; + rdfs:label "imageCompressionMethod"@en ; + rdfs:range xsd:string ; + . + +observable:imageName + a owl:DatatypeProperty ; + rdfs:label "imageName"@en ; + rdfs:comment "Specifies the image name for the task."@en ; + rdfs:range xsd:string ; + . + +observable:imageType + a owl:DatatypeProperty ; + rdfs:label "imageType"@en ; + rdfs:comment "The type of the image, e.g. EnCase, RAW or LocalFolder."@en ; + rdfs:range xsd:string ; + . + +observable:impHash + a owl:DatatypeProperty ; + rdfs:label "impHash"@en ; + rdfs:comment "Specifies the special import hash, or ‘imphash’, calculated for the PE Binary based on its imported libraries and functions. "@en ; + rdfs:range xsd:string ; + . + +observable:inReplyTo + a owl:ObjectProperty ; + rdfs:label "inReplyTo"@en ; + rdfs:comment "One of more unique identifiers for identifying the email(s) this email is a reply to."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:inetLocation + a owl:ObjectProperty ; + rdfs:label "Internet Location"@en-US ; + rdfs:comment "Specifies a location on the Internet."@en-US ; + rdfs:range observable:ObservableObject ; + . + +observable:inhibitAnyPolicy + a owl:DatatypeProperty ; + rdfs:label "inhibitAnyPolicy"@en ; + rdfs:range xsd:string ; + . + +observable:installDate + a owl:DatatypeProperty ; + rdfs:label "installDate"@en ; + rdfs:comment "Specifies the date the operating system was installed."@en ; + rdfs:range xsd:dateTime ; + . + +observable:ip + a owl:ObjectProperty ; + rdfs:label "ip"@en ; + rdfs:comment "Specifies the list of IP addresses used by the network interface."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:ipAddress + a owl:ObjectProperty ; + rdfs:label "ipAddress"@en ; + rdfs:comment "Specifies the corresponding ip address for a whois entry. Usually corresponds to a name server lookup."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:ipGateway + a owl:ObjectProperty ; + rdfs:label "ipGateway"@en ; + rdfs:comment "Specifies the list of IP Gateway IP Addresses used by the network interface."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:ipfix + a owl:ObjectProperty ; + rdfs:label "ipfix"@en ; + rdfs:comment "Specifies any IP Flow Information Export (IPFIX) data for the network traffic flow."@en ; + rdfs:range types:Dictionary ; + . + +observable:isActive + a owl:DatatypeProperty ; + rdfs:label "isActive"@en ; + rdfs:comment "Indicates whether the network connection is still active."@en ; + rdfs:range xsd:boolean ; + . + +observable:isDirectory + a owl:DatatypeProperty ; + rdfs:label "isDirectory"@en ; + rdfs:comment "Specifies whether a file entry represents a directory."@en ; + rdfs:range xsd:boolean ; + . + +observable:isDisabled + a owl:DatatypeProperty ; + rdfs:label "isDisabled"@en ; + rdfs:comment "Is the digital account disabled?"@en ; + rdfs:range xsd:boolean ; + . + +observable:isEnabled + a owl:DatatypeProperty ; + rdfs:label "isEnabled"@en ; + rdfs:comment "Specifies whether the trigger is enabled."@en ; + rdfs:range xsd:boolean ; + . + +observable:isEncrypted + a owl:DatatypeProperty ; + rdfs:label "isEncrypted"@en ; + rdfs:range xsd:boolean ; + . + +observable:isHidden + a owl:DatatypeProperty ; + rdfs:label "isHidden"@en ; + rdfs:comment """The isHidden property specifies whether the process is hidden or not. + """@en ; + rdfs:range xsd:boolean ; + . + +observable:isInjected + a owl:DatatypeProperty ; + rdfs:label "isInjected"@en ; + rdfs:comment "The isInjected property specifies whether or not the particular memory object has had data/code injected into it by another process."@en ; + rdfs:range xsd:boolean ; + . + +observable:isMapped + a owl:DatatypeProperty ; + rdfs:label "isMapped"@en ; + rdfs:comment "The isMapped property specifies whether or not the particular memory object has been assigned a byte-for-byte correlation with some portion of a file or file-like resource."@en ; + rdfs:range xsd:boolean ; + . + +observable:isMimeEncoded + a owl:DatatypeProperty ; + rdfs:label "isMimeEncoded"@en ; + rdfs:range xsd:boolean ; + . + +observable:isMultipart + a owl:DatatypeProperty ; + rdfs:label "isMultipart"@en ; + rdfs:range xsd:boolean ; + . + +observable:isNamed + a owl:DatatypeProperty ; + rdfs:label "isNamed"@en ; + rdfs:range xsd:boolean ; + . + +observable:isOptimized + a owl:DatatypeProperty ; + rdfs:label "isOptimized"@en ; + rdfs:range xsd:boolean ; + . + +observable:isPrivate + a owl:DatatypeProperty ; + rdfs:label "isPrivate"@en ; + rdfs:comment "Is the event marked as private?"@en ; + rdfs:range xsd:boolean ; + . + +observable:isPrivileged + a owl:DatatypeProperty ; + rdfs:label "isPrivileged"@en ; + rdfs:range xsd:boolean ; + . + +observable:isProtected + a owl:DatatypeProperty ; + rdfs:label "isProtected"@en ; + rdfs:comment "The isProtected property specifies whether or not the particular memory object is protected (read/write only from the process that allocated it)."@en ; + rdfs:range xsd:boolean ; + . + +observable:isRead + a owl:DatatypeProperty ; + rdfs:label "isRead"@en ; + rdfs:range xsd:boolean ; + . + +observable:isSecure + a owl:DatatypeProperty ; + rdfs:label "isSecure"@en ; + rdfs:comment "Is the cookie secure? If the cookie is secure it cannot be delivered over an unencrypted session such as http."@en ; + rdfs:range xsd:boolean ; + . + +observable:isSelfSigned + a owl:DatatypeProperty ; + rdfs:label "isSelfSigned"@en ; + rdfs:range xsd:boolean ; + . + +observable:isServiceAccount + a owl:DatatypeProperty ; + rdfs:label "isServiceAccount"@en ; + rdfs:range xsd:boolean ; + . + +observable:isTLD + a owl:DatatypeProperty ; + rdfs:label "isTLD"@en ; + rdfs:range xsd:boolean ; + . + +observable:isVolatile + a owl:DatatypeProperty ; + rdfs:label "isVolatile"@en ; + rdfs:comment "The isVolatile property specifies whether or not the particular memory object is volatile."@en ; + rdfs:range xsd:boolean ; + . + +observable:issuer + a owl:DatatypeProperty ; + rdfs:label "issuer"@en ; + rdfs:range xsd:string ; + . + +observable:issuerAlternativeName + a owl:DatatypeProperty ; + rdfs:label "issuerAlternativeName"@en ; + rdfs:range xsd:string ; + . + +observable:issuerHash + a owl:ObjectProperty ; + rdfs:label "issuerHash"@en ; + rdfs:comment "A hash calculated on the certificate issuer name."@en ; + rdfs:range types:Hash ; + . + +observable:key + a owl:DatatypeProperty ; + rdfs:label "key"@en ; + rdfs:range xsd:string ; + . + +observable:keyUsage + a owl:DatatypeProperty ; + rdfs:label "keyUsage"@en ; + rdfs:range xsd:string ; + . + +observable:keypadUnlockCode + a owl:DatatypeProperty ; + rdfs:label "keypadUnlockCode"@en ; + rdfs:comment "A code or password set on a device for security that must be entered to gain access to the device."@en ; + rdfs:range xsd:string ; + . + +observable:keywordSearchTerm + a owl:DatatypeProperty ; + rdfs:label "Keyword Search Term"@en ; + rdfs:comment "Specifies a string representing a keyword search term contained within the URL field."@en ; + rdfs:range xsd:string ; + . + +observable:labels + a owl:DatatypeProperty ; + rdfs:label "labels"@en ; + rdfs:comment "Named and colored label."@en ; + rdfs:range xsd:string ; + . + +observable:language + a owl:DatatypeProperty ; + rdfs:label "language"@en ; + rdfs:comment """Specifies the language the string is written in, e.g. English. + For consistency, it is strongly recommended to use the ISO 639-2 language code, if available. Please see http://www.loc.gov/standards/iso639-2/php/code_list.php for a list of ISO 639-2 codes."""@en ; + rdfs:range xsd:string ; + . + +observable:lastLoginTime + a owl:DatatypeProperty ; + rdfs:label "lastLoginTime"@en ; + rdfs:comment "The date and time of the last login of the account."@en ; + rdfs:range xsd:dateTime ; + . + +observable:lastName + a owl:DatatypeProperty ; + rdfs:label "lastName"@en ; + rdfs:comment "The last name of a person."@en ; + rdfs:range xsd:string ; + . + +observable:lastRun + a owl:DatatypeProperty ; + rdfs:label "lastRun"@en ; + rdfs:comment "Timestamp of when the prefetch application was last run."@en ; + rdfs:range xsd:dateTime ; + . + +observable:lastTimeContacted + a owl:DatatypeProperty ; + rdfs:label "lastTimeContacted"@en ; + rdfs:comment "Last time contacted specifies the date and time that a particular contact was last contacted."@en ; + . + +observable:lastVisit + a owl:DatatypeProperty ; + rdfs:label "Last Visit Time"@en ; + rdfs:comment "Specifies the date/time that the URL referred to by the URL field was last visited."@en ; + rdfs:range xsd:dateTime ; + . + +observable:length + a owl:DatatypeProperty ; + rdfs:label "length"@en ; + rdfs:comment "Specifies the length, in characters, of the extracted string."@en ; + rdfs:range xsd:integer ; + . + +observable:libraryType + a owl:DatatypeProperty ; + rdfs:label "libraryType"@en ; + rdfs:comment "Specifies the type of library being characterized."@en ; + rdfs:range xsd:string ; + . + +observable:listedCount + a owl:DatatypeProperty ; + rdfs:label "listedCount"@en ; + rdfs:comment "Specifies the number of public lists that this profile is associated with."@en ; + rdfs:range xsd:integer ; + . + +observable:loaderFlags + a owl:DatatypeProperty ; + rdfs:label "loaderFlags"@en ; + rdfs:comment "Specifies the reserved loader flags"@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:localTime + a owl:DatatypeProperty ; + rdfs:label "localTime"@en ; + rdfs:comment "Specifies the local time on the system."@en ; + rdfs:range xsd:dateTime ; + . + +observable:location + a owl:ObjectProperty ; + rdfs:label "location"@en ; + rdfs:comment "An associated location."@en ; + rdfs:range location:Location ; + . + +observable:loginTime + a owl:DatatypeProperty ; + rdfs:label "loginTime"@en ; + rdfs:comment "Specifies the date/time of the login for the user session."@en ; + rdfs:range xsd:dateTime ; + . + +observable:logoutTime + a owl:DatatypeProperty ; + rdfs:label "logoutTime"@en ; + rdfs:comment "Specifies the date/time of the logout for the user session."@en ; + rdfs:range xsd:dateTime ; + . + +observable:lookupDate + a owl:DatatypeProperty ; + rdfs:label "lookupDate"@en ; + rdfs:comment "Specifies the date and time that the Whois record was queried."@en ; + rdfs:range xsd:dateTime ; + . + +observable:macAddress + a owl:ObjectProperty ; + rdfs:label "macAddress"@en ; + rdfs:comment "Specifies the MAC or hardware address of the physical network card. "@en ; + rdfs:range observable:ObservableObject ; + . + +observable:machine + a owl:DatatypeProperty ; + rdfs:label "machine"@en ; + rdfs:comment "Specifies the type of target machine."@en ; + rdfs:range xsd:string ; + . + +observable:magic + a owl:DatatypeProperty ; + rdfs:label "magic"@en ; + rdfs:comment "Specifies the value that indicates the type of the PE binary."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:magicNumber + a owl:DatatypeProperty ; + rdfs:label "magicNumber"@en ; + rdfs:range xsd:string ; + . + +observable:majorImageVersion + a owl:DatatypeProperty ; + rdfs:label "majorImageVersion"@en ; + rdfs:comment "Specifies the major version number of the image."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:majorLinkerVersion + a owl:DatatypeProperty ; + rdfs:label "majorLinkerVersion"@en ; + rdfs:comment "Specifies the linker major version number."@en ; + rdfs:range xsd:byte ; + . + +observable:majorOSVersion + a owl:DatatypeProperty ; + rdfs:label "majorOSVersion"@en ; + rdfs:comment "Specifies the major version number of the required operating system."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:majorSubsystemVersion + a owl:DatatypeProperty ; + rdfs:label "majorSubsystemVersion"@en ; + rdfs:comment "Specifies the major version number of the subsystem."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:manuallyEnteredCount + a owl:DatatypeProperty ; + rdfs:label "Manually-Entered Count"@en ; + rdfs:comment "Specifies the number of times the URL referred to by the URL field was manually entered into the browser's address field by the user. This field is only applicable for URL history entries generated by Google's Chrome browser."@en ; + rdfs:range xsd:nonNegativeInteger ; + . + +observable:manufacturer + a owl:DatatypeProperty ; + rdfs:label "manufacturer"@en ; + rdfs:range xsd:string ; + . + +observable:maxRunTime + a owl:DatatypeProperty ; + rdfs:label "maxRunTime"@en ; + rdfs:comment "Specifies the maximum run time of the scheduled task before terminating, in milliseconds. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381874(v=vs.85).aspx."@en ; + rdfs:range xsd:integer ; + . + +observable:message + a owl:ObjectProperty ; + rdfs:label "message"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:messageID + a owl:DatatypeProperty ; + rdfs:label "messageID"@en ; + rdfs:comment "An unique identifier for the message."@en ; + rdfs:range xsd:string ; + . + +observable:messageText + a owl:DatatypeProperty ; + rdfs:label "messageText"@en ; + rdfs:comment "The contents of the message."@en ; + rdfs:range xsd:string ; + . + +observable:messageType + a owl:DatatypeProperty ; + rdfs:label "messageType"@en ; + rdfs:comment "Message type specifies what sort of message (email, chat, SMS, etc) a Message is."@en ; + rdfs:range xsd:string ; + . + +observable:messagingAddress + a owl:ObjectProperty ; + rdfs:label "messagingAddress"@en ; + rdfs:comment "A messaging address specifies details of an identifier for digital messsaging communication."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:metadataChangeTime + a owl:DatatypeProperty ; + rdfs:label "metadataChangeTime"@en ; + rdfs:comment "The date and time at which the file metadata was last modified."@en ; + rdfs:range xsd:dateTime ; + . + +observable:mftFileID + a owl:DatatypeProperty ; + rdfs:label "mftFileID"@en ; + rdfs:comment "Specifies the record number for the file within an NTFS Master File Table."@en ; + rdfs:range xsd:integer ; + . + +observable:mftFileNameAccessedTime + a owl:DatatypeProperty ; + rdfs:label "mftFileNameAccessedTime"@en ; + rdfs:comment "The access date and time recorded in an MFT entry $File_Name attribute."@en ; + rdfs:range xsd:dateTime ; + . + +observable:mftFileNameCreatedTime + a owl:DatatypeProperty ; + rdfs:label "mftFileNameCreatedTime"@en ; + rdfs:comment "The creation date and time recorded in an MFT entry $File_Name attribute."@en ; + rdfs:range xsd:dateTime ; + . + +observable:mftFileNameLength + a owl:DatatypeProperty ; + rdfs:label "mftFileNameLength"@en ; + rdfs:comment " Specifies the length of an NTFS file name, in unicode characters."@en ; + rdfs:range xsd:integer ; + . + +observable:mftFileNameModifiedTime + a owl:DatatypeProperty ; + rdfs:label "mftFileNameModifiedTime"@en ; + rdfs:comment "The modification date and time recorded in an MFT entry $File_Name attribute."@en ; + rdfs:range xsd:dateTime ; + . + +observable:mftFileNameRecordChangeTime + a owl:DatatypeProperty ; + rdfs:label "mftFileNameRecordChangeTime"@en ; + rdfs:comment "The metadata modification date and time recorded in an MFT entry $File_Name attribute."@en ; + rdfs:range xsd:dateTime ; + . + +observable:mftFlags + a owl:DatatypeProperty ; + rdfs:label "mftFlags"@en ; + rdfs:comment "Specifies basic permissions for the file (Read-Only, Hidden, Archive, Compressed, etc.)."@en ; + rdfs:range xsd:integer ; + . + +observable:mftParentID + a owl:DatatypeProperty ; + rdfs:label "mftParentID"@en ; + rdfs:comment "Specifies the record number within an NTFS Master File Table for parent directory of the file."@en ; + rdfs:range xsd:integer ; + . + +observable:mftRecordChangeTime + a owl:DatatypeProperty ; + rdfs:label "mftRecordChangeTime"@en ; + rdfs:comment "The date and time at which an NTFS file metadata was last modified."@en ; + rdfs:range xsd:dateTime ; + . + +observable:middleName + a owl:DatatypeProperty ; + rdfs:label "middleName"@en ; + rdfs:comment "The middle name of a person."@en ; + rdfs:range xsd:string ; + . + +observable:mimeClass + a owl:DatatypeProperty ; + rdfs:label "mimeClass"@en ; + rdfs:range xsd:string ; + . + +observable:mimeType + a owl:DatatypeProperty ; + rdfs:label "mimeType"@en ; + rdfs:comment "MIME type of the data. For example 'text/html' or 'audio/mp3'."@en ; + rdfs:range xsd:string ; + . + +observable:minorImageVersion + a owl:DatatypeProperty ; + rdfs:label "minorImageVersion"@en ; + rdfs:comment "Specifies the minor version number of the image."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:minorLinkerVersion + a owl:DatatypeProperty ; + rdfs:label "minorLinkerVersion"@en ; + rdfs:comment "Specifies the linker minor version number."@en ; + rdfs:range xsd:byte ; + . + +observable:minorOSVersion + a owl:DatatypeProperty ; + rdfs:label "minorOSVersion"@en ; + rdfs:comment "Specifies the minor version number of the required operating system."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:minorSubsystemVersion + a owl:DatatypeProperty ; + rdfs:label "minorSubsystemVersion"@en ; + rdfs:comment """Specifies the minor version number of the subsystem. + """@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:mockLocationsAllowed + a owl:DatatypeProperty ; + rdfs:label "mockLocationsAllowed"@en ; + rdfs:comment "???."@en ; + rdfs:range xsd:boolean ; + . + +observable:model + a owl:DatatypeProperty ; + rdfs:label "model"@en ; + rdfs:range xsd:string ; + . + +observable:modifiedTime + a owl:DatatypeProperty ; + rdfs:label "modifiedTime"@en ; + rdfs:comment "The date and time at which the Object was last modified."@en ; + rdfs:range xsd:dateTime ; + . + +observable:mostRecentRunTime + a owl:DatatypeProperty ; + rdfs:label "mostRecentRunTime"@en ; + rdfs:comment "Specifies the most recent run date/time of this scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381254(v=vs.85).aspx."@en ; + rdfs:range xsd:dateTime ; + . + +observable:mountPoint + a owl:DatatypeProperty ; + rdfs:label "mountPoint"@en ; + rdfs:comment "Specifies the mount point of the partition."@en ; + rdfs:range xsd:string ; + . + +observable:msProductID + a owl:DatatypeProperty ; + rdfs:label "msProductID"@en ; + rdfs:comment "The Microsoft Product ID. See also: http://support.microsoft.com/gp/pidwin."@en ; + rdfs:range xsd:string ; + . + +observable:msProductName + a owl:DatatypeProperty ; + rdfs:label "msProductName"@en ; + rdfs:comment "The Microsoft ProductName of the current installation of Windows. This is typically found in HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion!ProductName."@en ; + rdfs:range xsd:string ; + . + +observable:nameConstraints + a owl:DatatypeProperty ; + rdfs:label "nameConstraints"@en ; + rdfs:range xsd:string ; + . + +observable:namePhonetic + a owl:DatatypeProperty ; + rdfs:label "namePhonetic"@en ; + rdfs:comment "Name phonetic specifies the phonetic pronunciation of the name of a person."@en ; + rdfs:range xsd:string ; + . + +observable:namePrefix + a owl:DatatypeProperty ; + rdfs:label "namePrefix"@en ; + rdfs:comment "Name prefix specifies an honorific prefix (coming ordinally before first/given name) for the name of a person."@en ; + rdfs:range xsd:string ; + . + +observable:nameServer + a owl:ObjectProperty ; + rdfs:label "nameServer"@en ; + rdfs:comment "Specifies a list of name server entries for a Whois entry."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:nameSuffix + a owl:DatatypeProperty ; + rdfs:label "nameSuffix"@en ; + rdfs:comment "Name suffix specifies an suffix (coming ordinally after last/family name) for the name of a person."@en ; + rdfs:range xsd:string ; + . + +observable:netBIOSName + a owl:DatatypeProperty ; + rdfs:label "netBIOSName"@en ; + rdfs:comment "Specifies the NetBIOS (Network Basic Input/Output System) name of the Windows system. This is not the same as the host name."@en ; + rdfs:range xsd:string ; + . + +observable:network + a owl:DatatypeProperty ; + rdfs:label "network"@en ; + rdfs:comment "???."@en ; + rdfs:range xsd:string ; + . + +observable:networkInterface + a owl:ObjectProperty ; + rdfs:label "networkInterface"@en ; + rdfs:comment "Specifies the list of network interfaces present on the system."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:newObject + a owl:ObjectProperty ; + rdfs:label "newObject"@en ; + rdfs:comment "Specifies the observable object and its properties as they are after the state change effect occurred."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:nextRunTime + a owl:DatatypeProperty ; + rdfs:label "nextRunTime"@en ; + rdfs:comment "Specifies the next run date/time of the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381257(v=vs.85).aspx."@en ; + rdfs:range xsd:dateTime ; + . + +observable:nickname + a owl:DatatypeProperty ; + rdfs:label "nickname"@en ; + rdfs:comment "Nickname specifies an alternate, unofficial and typically informal name for a person independent of their official name."@en ; + rdfs:range xsd:string ; + . + +observable:ntfsHardLinkCount + a owl:DatatypeProperty ; + rdfs:label "ntfsHardLinkCount"@en ; + rdfs:comment "Specifies the number of directory entries that reference an NTFS file record."@en ; + rdfs:range xsd:integer ; + . + +observable:ntfsOwnerID + a owl:DatatypeProperty ; + rdfs:label "ntfsOwnerID"@en ; + rdfs:comment "Specifies the identifier of the file owner, from the security index."@en ; + rdfs:range xsd:string ; + . + +observable:ntfsOwnerSID + a owl:DatatypeProperty ; + rdfs:label "ntfsOwnerSID"@en ; + rdfs:comment "Specifies the security ID (key in the $SII Index and $SDS DataStream in the file $Secure) for an NTFS file."@en ; + rdfs:range xsd:string ; + . + +observable:number + a owl:DatatypeProperty ; + rdfs:label "number"@en ; + rdfs:range xsd:integer ; + . + +observable:numberOfLaunches + a owl:DatatypeProperty ; + rdfs:label "numberOfLaunches"@en ; + rdfs:range xsd:integer ; + . + +observable:numberOfRVAAndSizes + a owl:DatatypeProperty ; + rdfs:label "numberOfRVAAndSizes"@en ; + rdfs:comment "Specifies the number of data-directory entries in the remainder of the optional header."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:numberOfSections + a owl:DatatypeProperty ; + rdfs:label "numberOfSections"@en ; + rdfs:comment "Specifies the number of sections in the PE binary, as a non-negative integer."@en ; + rdfs:range xsd:integer ; + . + +observable:numberOfSubkeys + a owl:DatatypeProperty ; + rdfs:label "numberOfSubkeys"@en ; + rdfs:range xsd:integer ; + . + +observable:numberOfSymbols + a owl:DatatypeProperty ; + rdfs:label "numberOfSymbols"@en ; + rdfs:comment "Specifies the number of entries in the symbol table of the PE binary, as a non-negative integer."@en ; + rdfs:range xsd:integer ; + . + +observable:numberTimesContacted + a owl:DatatypeProperty ; + rdfs:label "numberTimesContacted"@en ; + rdfs:comment "Number times contacted specifies the number of times a particular contact has been contacted."@en ; + rdfs:range xsd:integer ; + . + +observable:objectGUID + a owl:DatatypeProperty ; + rdfs:label "objectGUID"@en ; + rdfs:range xsd:string ; + . + +observable:observableCreatedTime + a owl:DatatypeProperty ; + rdfs:label "observableCreatedTime"@en ; + rdfs:comment "The date and time at which the observable object being characterized was created. This time pertains to an intrinsic characteristic of the observable object, and would be consistent across independent characterizations or observations of the observable object."@en ; + rdfs:range xsd:dateTime ; + . + +observable:oldObject + a owl:ObjectProperty ; + rdfs:label "oldObject"@en ; + rdfs:comment "Specifies the observable object and its properties as they were before the state change effect occurred."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:openFileDescriptor + a owl:DatatypeProperty ; + rdfs:label "openFileDescriptor"@en ; + rdfs:comment "Specifies a listing of the current file descriptors used by the Unix process."@en ; + rdfs:range xsd:integer ; + . + +observable:operatingSystem + a owl:ObjectProperty ; + rdfs:label "operatingSystem"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:optionalHeader + a owl:ObjectProperty ; + rdfs:label "optionalHeader"@en ; + rdfs:comment "Specifies the PE optional header of the PE binary."@en ; + rdfs:range observable:WindowsPEOptionalHeader ; + . + +observable:options + a owl:DatatypeProperty ; + rdfs:label "options"@en ; + rdfs:comment "Specifies any options used when mounting the volume."@en ; + rdfs:range xsd:string ; + . + +observable:organizationDepartment + a owl:DatatypeProperty ; + rdfs:label "organizationDepartment"@en ; + rdfs:comment "Specifies a particular suborganization (division, branch, office, etc.) that exists within a larger organization."@en ; + rdfs:range xsd:string ; + . + +observable:organizationLocation + a owl:ObjectProperty ; + rdfs:label "organizationLocation"@en ; + rdfs:comment "Specifies a geolocation address of an organization."@en ; + rdfs:range observable:ContactAddress ; + . + +observable:organizationPosition + a owl:DatatypeProperty ; + rdfs:label "organizationPosition"@en ; + rdfs:comment "Specifies the title or role that a person plays within an organization."@en ; + rdfs:range xsd:string ; + . + +observable:otherHeaders + a owl:ObjectProperty ; + rdfs:label "otherHeaders"@en ; + rdfs:range types:Dictionary ; + . + +observable:owner + a owl:ObjectProperty ; + rdfs:label "owner"@en ; + rdfs:comment "Specifies the owner of an Observable Object."@en ; + rdfs:range core:UcoObject ; + . + +observable:ownerSID + a owl:DatatypeProperty ; + rdfs:label "ownerSID"@en ; + rdfs:range xsd:string ; + . + +observable:pageTitle + a owl:DatatypeProperty ; + rdfs:label "Page Title"@en ; + rdfs:comment "Specifies the title of a web page."@en ; + rdfs:range xsd:string ; + . + +observable:parameterAddress + a owl:DatatypeProperty ; + rdfs:label "parameterAddress"@en ; + rdfs:range xsd:hexBinary ; + . + +observable:parameters + a owl:DatatypeProperty ; + rdfs:label "parameters"@en ; + rdfs:comment "Specifies the command line parameters used to launch the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381875(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:parent + a owl:ObjectProperty ; + rdfs:label "parent"@en ; + rdfs:comment "The process that created this process."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:participant + a owl:ObjectProperty ; + rdfs:label "participant"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:partition + a owl:ObjectProperty ; + rdfs:label "partition"@en ; + rdfs:comment "The partitions that reside on the disk."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:partitionID + a owl:DatatypeProperty ; + rdfs:label "partitionID"@en ; + rdfs:comment "Specifies the identifier of the partition, as provided by the containing partition table. This identifier is the index value within the partition table, and is expected to be an incrementing alphanumeric value (numeric in most partition systems), not a GUID or UUID. Sorting partitions by this index should first attempt to sort a numeric cast of the value."@en ; + rdfs:range xsd:string ; + . + +observable:partitionLength + a owl:DatatypeProperty ; + rdfs:label "partitionLength"@en ; + rdfs:comment "Specifies the length of the partition, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:partitionOffset + a owl:DatatypeProperty ; + rdfs:label "partitionOffset"@en ; + rdfs:comment "Specifies the starting offset of the partition, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:password + a owl:DatatypeProperty ; + rdfs:label "password"@en ; + rdfs:comment "Specifies an authentication password."@en ; + rdfs:range xsd:string ; + . + +observable:passwordLastChanged + a owl:DatatypeProperty ; + rdfs:label "passwordLastChanged"@en ; + rdfs:comment "The date and time that the password was last changed."@en ; + rdfs:range xsd:dateTime ; + . + +observable:passwordType + a owl:DatatypeProperty ; + rdfs:label "passwordType"@en ; + rdfs:comment "The type of password, for instance plain-text or encrypted."@en ; + rdfs:range xsd:string ; + . + +observable:path + a owl:DatatypeProperty ; + rdfs:label "path"@en ; + rdfs:comment "Specifies the location of one object within another containing object."@en ; + rdfs:range xsd:string ; + . + +observable:pdfId0 + a owl:DatatypeProperty ; + rdfs:label "pdfId0"@en ; + rdfs:range xsd:string ; + . + +observable:pdfId1 + a owl:DatatypeProperty ; + rdfs:label "pdfId1"@en ; + rdfs:range xsd:string ; + . + +observable:peType + a owl:DatatypeProperty ; + rdfs:label "peType"@en ; + rdfs:comment "Specifies the type of the PE binary."@en ; + rdfs:range xsd:string ; + . + +observable:phoneActivationTime + a owl:DatatypeProperty ; + rdfs:label "phoneActivationTime"@en ; + rdfs:comment "The date and time that a device was activated."@en ; + rdfs:range xsd:dateTime ; + . + +observable:phoneNumber + a owl:DatatypeProperty ; + rdfs:label "phoneNumber"@en ; + rdfs:comment "A phone number(account)."@en ; + rdfs:range xsd:string ; + . + +observable:pictureHeight + a owl:DatatypeProperty ; + rdfs:label "pictureHeight"@en ; + rdfs:range xsd:integer ; + . + +observable:pictureType + a owl:DatatypeProperty ; + rdfs:label "pictureType"@en ; + rdfs:comment "The type of a picture, for example a thumbnail."@en ; + rdfs:range xsd:string ; + . + +observable:pictureWidth + a owl:DatatypeProperty ; + rdfs:label "pictureWidth"@en ; + rdfs:comment "The width of the picture in pixels."@en ; + rdfs:range xsd:integer ; + . + +observable:pid + a owl:DatatypeProperty ; + rdfs:label "pid"@en ; + rdfs:comment "The Process ID, or PID, of the process."@en ; + rdfs:range xsd:integer ; + . + +observable:pointerToSymbolTable + a owl:DatatypeProperty ; + rdfs:label "pointerToSymbolTable"@en ; + rdfs:comment "Specifies the file offset of the COFF symbol table."@en ; + rdfs:range xsd:hexBinary ; + . + +observable:policyConstraints + a owl:DatatypeProperty ; + rdfs:label "policyConstraints"@en ; + rdfs:range xsd:string ; + . + +observable:policyMappings + a owl:DatatypeProperty ; + rdfs:label "policyMappings"@en ; + rdfs:range xsd:string ; + . + +observable:port + a owl:DatatypeProperty ; + rdfs:label "port"@en ; + rdfs:comment "Port on which communication takes place."@en ; + rdfs:range xsd:integer ; + . + +observable:prefetchHash + a owl:DatatypeProperty ; + rdfs:label "prefetchHash"@en ; + rdfs:comment "An eight character hash of the location from which the application was run."@en ; + rdfs:range xsd:string ; + . + +observable:priority + a owl:DatatypeProperty ; + rdfs:label "priority"@en ; + rdfs:comment "The priority of the email."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:integer + xsd:string + vocabulary1:TaskPriorityVocab + ) ; + ] ; + . + +observable:privateKeyUsagePeriodNotAfter + a owl:DatatypeProperty ; + rdfs:label "privateKeyUsagePeriodNotAfter"@en ; + rdfs:range xsd:dateTime ; + . + +observable:privateKeyUsagePeriodNotBefore + a owl:DatatypeProperty ; + rdfs:label "privateKeyUsagePeriodNotBefore"@en ; + rdfs:range xsd:dateTime ; + . + +observable:processorArchitecture + a owl:DatatypeProperty ; + rdfs:label "processorArchitecture"@en ; + rdfs:comment "Specifies the specific architecture (e.g. x86) used by the CPU of the system."@en ; + rdfs:range xsd:string ; + . + +observable:profile + a owl:ObjectProperty ; + rdfs:label "profile"@en ; + rdfs:comment "A profile specifies a particular online service profile."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:profileAccount + a owl:ObjectProperty ; + rdfs:label "Profile Account"@en-US ; + rdfs:comment "Specifies the online service account associated with the profile."@en-US ; + rdfs:range observable:ObservableObject ; + . + +observable:profileBackgroundHash + a owl:ObjectProperty ; + rdfs:label "Profile Background Hash"@en-US ; + rdfs:comment "Specifies hashes of the background associated with the profile."@en-US ; + rdfs:range types:Hash ; + . + +observable:profileBackgroundLocation + a owl:ObjectProperty ; + rdfs:label "Profile Background Location"@en-US ; + rdfs:comment "Specifies the network location of the background associated with the profile."@en-US ; + rdfs:range observable:ObservableObject ; + . + +observable:profileBannerHash + a owl:ObjectProperty ; + rdfs:label "Profile Banner Hash"@en-US ; + rdfs:comment "Specifies hashes of the banner associated with the profile."@en-US ; + rdfs:range types:Hash ; + . + +observable:profileBannerLocation + a owl:ObjectProperty ; + rdfs:label "Profile Banner Location"@en-US ; + rdfs:comment "Specifies the network location of the banner associated with the profile."@en-US ; + rdfs:range observable:ObservableObject ; + . + +observable:profileCreated + a owl:DatatypeProperty ; + rdfs:label "Profile Created"@en-US ; + rdfs:comment "Specifies the date and time the profile was created."@en-US ; + rdfs:range xsd:dateTime ; + . + +observable:profileIdentity + a owl:ObjectProperty ; + rdfs:label "Profile Identity"@en-US ; + rdfs:comment "Specifies the identity associated with the profile."@en-US ; + rdfs:range identity:Identity ; + . + +observable:profileImageHash + a owl:ObjectProperty ; + rdfs:label "Profile Image Hash"@en-US ; + rdfs:comment "Specifies hashes of the profile image associated with the profile."@en-US ; + rdfs:range types:Hash ; + . + +observable:profileImageLocation + a owl:ObjectProperty ; + rdfs:label "Profile Image Location"@en-US ; + rdfs:comment "Specifies the network location of the profile image associated with the profile."@en-US ; + rdfs:range observable:ObservableObject ; + . + +observable:profileIsProtected + a owl:DatatypeProperty ; + rdfs:label "Is_Protected"@en-US ; + rdfs:comment "Specifies whether the twitter profile is protected."@en-US ; + rdfs:range xsd:boolean ; + . + +observable:profileIsVerified + a owl:DatatypeProperty ; + rdfs:label "Is_Verified"@en-US ; + rdfs:comment "Specifies whether the twitter profile is verified."@en-US ; + rdfs:range xsd:boolean ; + . + +observable:profileLanguage + a owl:DatatypeProperty ; + rdfs:label "Profile Language"@en-US ; + rdfs:comment "Specifies the language associated with the profile. When present, it MUST be a language code conformant to RFC 5646/BCP47."@en-US ; + rdfs:range xsd:string ; + . + +observable:profileService + a owl:ObjectProperty ; + rdfs:label "Profile Service"@en-US ; + rdfs:comment "Specifies the online service associated with the profile."@en-US ; + rdfs:range observable:ObservableObject ; + . + +observable:profileWebsite + a owl:ObjectProperty ; + rdfs:label "Profile Website"@en-US ; + rdfs:comment "Specifies the website URL associated with the profile."@en-US ; + rdfs:range observable:ObservableObject ; + . + +observable:properties + a owl:DatatypeProperty ; + rdfs:label "properties"@en ; + rdfs:comment "Specifies the properties that were enumerated as a result of the action on the observable object."@en ; + rdfs:range xsd:string ; + . + +observable:propertyName + a owl:DatatypeProperty ; + rdfs:label "propertyName"@en ; + rdfs:comment "Specifies the Name of the property being read."@en ; + rdfs:range xsd:string ; + . + +observable:protocols + a owl:ObjectProperty ; + rdfs:label "protocols"@en ; + rdfs:comment "Specifies the protocols involved in the network connection, along with their corresponding state. "@en ; + rdfs:range types:ControlledDictionary ; + . + +observable:query + a owl:DatatypeProperty ; + rdfs:label "query"@en ; + rdfs:comment "Query passed to the resource."@en ; + rdfs:range xsd:string ; + . + +observable:rangeOffset + a owl:DatatypeProperty ; + rdfs:label "rangeOffset"@en ; + rdfs:comment "The offset at which the start of data can be found, relative to the rangeOffsetType defined."@en ; + rdfs:range xsd:integer ; + . + +observable:rangeOffsetType + a owl:DatatypeProperty ; + rdfs:label "rangeOffsetType"@en ; + rdfs:comment "The type of offset defined for the range (e.g., image, file, address)."@en ; + rdfs:range xsd:string ; + . + +observable:rangeSize + a owl:DatatypeProperty ; + rdfs:label "rangeSize"@en ; + rdfs:comment "The size of the data in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:receivedLines + a owl:DatatypeProperty ; + rdfs:label "receivedLines"@en ; + rdfs:range xsd:string ; + . + +observable:receivedTime + a owl:DatatypeProperty ; + rdfs:label "receivedTime"@en ; + rdfs:comment "The date and time at which the message received. "@en ; + rdfs:range xsd:dateTime ; + . + +observable:recurrence + a owl:DatatypeProperty ; + rdfs:label "recurrence"@en ; + rdfs:comment "Recurrence of the event."@en ; + rdfs:range xsd:string ; + . + +observable:references + a owl:ObjectProperty ; + rdfs:label "references"@en ; + rdfs:comment "A list of email message identifiers this email relates to."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:referralURL + a owl:ObjectProperty ; + rdfs:label "referralURL"@en ; + rdfs:comment "Specifies the corresponding referral URL for a registrar."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:referrerUrl + a owl:ObjectProperty ; + rdfs:label "referrerURL"@en ; + rdfs:comment "Specifies the origination point (i.e., URL) of a URL request."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:regionEndAddress + a owl:DatatypeProperty ; + rdfs:label "regionEndAddress"@en ; + rdfs:comment "The regionEndAddress property specifies the ending address of the particular memory region."@en ; + rdfs:range xsd:hexBinary ; + . + +observable:regionSize + a owl:DatatypeProperty ; + rdfs:label "regionSize"@en ; + rdfs:comment "The regionSize property specifies the size of the particular memory region, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:regionStartAddress + a owl:DatatypeProperty ; + rdfs:label "regionStartAddress"@en ; + rdfs:comment """The regionStartAddress property specifies the starting address of the particular memory region. + """@en ; + rdfs:range xsd:hexBinary ; + . + +observable:regionalInternetRegistry + a owl:DatatypeProperty ; + rdfs:label "regionalInternetRegistry"@en ; + rdfs:comment "specifies the name of the Regional Internet Registry (RIR) which allocated the IP address contained in a WHOIS entry."@en ; + rdfs:range vocabulary1:RegionalRegistryTypeVocab ; + . + +observable:registeredOrganization + a owl:ObjectProperty ; + rdfs:label "registeredOrganization"@en ; + rdfs:comment "The organization that this copy of Windows is registered to."@en ; + rdfs:range identity:Identity ; + . + +observable:registeredOwner + a owl:ObjectProperty ; + rdfs:label "registeredOwner"@en ; + rdfs:comment "The person or organization that is the registered owner of this copy of Windows."@en ; + rdfs:range identity:Identity ; + . + +observable:registrantContactInfo + a owl:ObjectProperty ; + rdfs:label "registrantContactInfo"@en ; + rdfs:comment "Specifies contact info for the registrant of a domain within a WHOIS entity."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:registrantIDs + a owl:DatatypeProperty ; + rdfs:label "registrantIDs"@en ; + rdfs:comment "Specifies the registrant IDs associated with a domain lookup."@en ; + rdfs:range xsd:string ; + . + +observable:registrarGUID + a owl:DatatypeProperty ; + rdfs:label "registrarGUID"@en ; + rdfs:comment "Specifies the Registrar GUID field of a Whois entry."@en ; + rdfs:range xsd:string ; + . + +observable:registrarID + a owl:DatatypeProperty ; + rdfs:label "registrarID"@en ; + rdfs:comment "Specifies the Registrar ID field of a Whois entry."@en ; + rdfs:range xsd:string ; + . + +observable:registrarInfo + a owl:ObjectProperty ; + rdfs:label "registrarInfo"@en ; + rdfs:comment "Specifies registrar info that would be returned from a registrar lookup."@en ; + rdfs:range observable:WhoisRegistrarInfoType ; + . + +observable:registrarName + a owl:DatatypeProperty ; + rdfs:label "registrarName"@en ; + rdfs:comment "The name of the registrar organization."@en ; + rdfs:range xsd:string ; + . + +observable:registryValues + a owl:ObjectProperty ; + rdfs:label "registryValues"@en ; + rdfs:comment "The values that were enumerated as a result of the action on the object."@en ; + rdfs:range observable:WindowsRegistryValue ; + . + +observable:remarks + a owl:DatatypeProperty ; + rdfs:label "remarks"@en ; + rdfs:comment "Specifies any remarks associated with this Whois entry."@en ; + rdfs:range xsd:string ; + . + +observable:remindTime + a owl:DatatypeProperty ; + rdfs:label "remindTime"@en ; + rdfs:range xsd:dateTime ; + . + +observable:requestMethod + a owl:DatatypeProperty ; + rdfs:label "requestMethod"@en ; + rdfs:comment """Specifies the HTTP method portion of the HTTP request line, as a lowercase string. + """@en ; + rdfs:range xsd:string ; + . + +observable:requestValue + a owl:DatatypeProperty ; + rdfs:label "requestValue"@en ; + rdfs:comment "Specifies the value (typically a resource path) portion of the HTTP request line."@en ; + rdfs:range xsd:string ; + . + +observable:requestVersion + a owl:DatatypeProperty ; + rdfs:label "requestVersion"@en ; + rdfs:comment "Specifies the HTTP version portion of the HTTP request line, as a lowercase string."@en ; + rdfs:range xsd:string ; + . + +observable:rowCondition + a owl:DatatypeProperty ; + rdfs:label "rowCondition"@en ; + rdfs:range xsd:string ; + . + +observable:rowIndex + a owl:DatatypeProperty ; + rdfs:label "rowIndex"@en ; + rdfs:range xsd:positiveInteger ; + . + +observable:ruid + a owl:DatatypeProperty ; + rdfs:label "ruid"@en ; + rdfs:comment "Specifies the real user ID, which represents the Unix user who created the process."@en ; + rdfs:range xsd:nonNegativeInteger ; + . + +observable:runningStatus + a owl:DatatypeProperty ; + rdfs:label "runningStatus"@en ; + rdfs:range xsd:string ; + . + +observable:scheme + a owl:DatatypeProperty ; + rdfs:label "scheme"@en ; + rdfs:comment "Identifies the type of URL."@en ; + rdfs:range xsd:string ; + . + +observable:sectionAlignment + a owl:DatatypeProperty ; + rdfs:label "sectionAlignment"@en ; + rdfs:comment "Specifies the alignment (in bytes) of PE sections when they are loaded into memory."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sections + a owl:ObjectProperty ; + rdfs:label "sections"@en ; + rdfs:comment "Specifies metadata about the sections in the PE file."@en ; + rdfs:range observable:WindowsPESection ; + . + +observable:sectorSize + a owl:DatatypeProperty ; + rdfs:label "sectorSize"@en ; + rdfs:comment "The sector size of the volume in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:securityAttributes + a owl:DatatypeProperty ; + rdfs:label "securityAttributes"@en ; + rdfs:range xsd:string ; + . + +observable:sender + a owl:ObjectProperty ; + rdfs:label "sender"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:sentTime + a owl:DatatypeProperty ; + rdfs:label "sentTime"@en ; + rdfs:comment "The date and time at which the message sent."@en ; + rdfs:range xsd:dateTime ; + . + +observable:serialNumber + a owl:DatatypeProperty ; + rdfs:label "serialNumber"@en ; + rdfs:range xsd:string ; + . + +observable:serverName + a owl:ObjectProperty ; + rdfs:label "serverName"@en ; + rdfs:comment "Specifies the corresponding server name for a whois entry. This usually corresponds to a name server lookup."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:serviceName + a owl:DatatypeProperty ; + rdfs:label "serviceName"@en ; + rdfs:range xsd:string ; + . + +observable:serviceStatus + a owl:DatatypeProperty ; + rdfs:label "serviceStatus"@en ; + rdfs:range xsd:string ; + . + +observable:serviceType + a owl:DatatypeProperty ; + rdfs:label "serviceType"@en ; + rdfs:range xsd:string ; + . + +observable:sessionID + a owl:DatatypeProperty ; + rdfs:label "sessionID"@en ; + rdfs:comment "An identifier for the session from which the message originates."@en ; + rdfs:range xsd:string ; + . + +observable:shell + a owl:DatatypeProperty ; + rdfs:label "shell"@en ; + rdfs:range xsd:string ; + . + +observable:showMessageBody + a owl:DatatypeProperty ; + rdfs:label "showMessageBody"@en ; + rdfs:comment "Specifies the message text that is displayed in the body of the message box by the action. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381302(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:showMessageTitle + a owl:DatatypeProperty ; + rdfs:label "showMessageTitle"@en ; + rdfs:comment "Specifies the title of the message box shown by the action. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381302(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:sid + a owl:DatatypeProperty ; + rdfs:label "sid"@en ; + rdfs:range xsd:string ; + . + +observable:signature + a owl:DatatypeProperty ; + rdfs:label "signature"@en ; + rdfs:comment "A"@en ; + rdfs:range xsd:string ; + . + +observable:signatureAlgorithm + a owl:DatatypeProperty ; + rdfs:label "signatureAlgorithm"@en ; + rdfs:range xsd:string ; + . + +observable:signatureDescription + a owl:DatatypeProperty ; + rdfs:label "signatureDescription"@en ; + rdfs:range xsd:string ; + . + +observable:signatureExists + a owl:DatatypeProperty ; + rdfs:label "signatureExists"@en ; + rdfs:range xsd:boolean ; + . + +observable:signatureVerified + a owl:DatatypeProperty ; + rdfs:label "signatureVerified"@en ; + rdfs:range xsd:boolean ; + . + +observable:sipAddress + a owl:ObjectProperty ; + rdfs:label "sipAddress"@en ; + rdfs:comment "A SIP address specifies Session Initiation Protocol (SIP) identifier."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:size + a owl:DatatypeProperty ; + rdfs:label "size"@en ; + rdfs:comment "Specifies the size of the section, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:sizeInBytes + a owl:DatatypeProperty ; + rdfs:label "sizeInBytes"@en ; + rdfs:comment "The size of the data in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:sizeOfCode + a owl:DatatypeProperty ; + rdfs:label "sizeOfCode"@en ; + rdfs:comment "Specifies the size of the code (text) section. If there are multiple such sections, this refers to the sum of the sizes of each section."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sizeOfHeaders + a owl:DatatypeProperty ; + rdfs:label "sizeOfHeaders"@en ; + rdfs:comment "Specifies the combined size of the MS-DOS, PE header, and section headers, rounded up a multiple of the value specified in the file_alignment header."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sizeOfHeapCommit + a owl:DatatypeProperty ; + rdfs:label "sizeOfHeapCommit"@en ; + rdfs:comment "Specifies the size of the local heap space to commit."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sizeOfHeapReserve + a owl:DatatypeProperty ; + rdfs:label "sizeOfHeapReserve"@en ; + rdfs:comment "Specifies the size of the local heap space to reserve."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sizeOfImage + a owl:DatatypeProperty ; + rdfs:label "sizeOfImage"@en ; + rdfs:comment "Specifies the size, in bytes, of the image, including all headers, as the image is loaded in memory."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sizeOfInitializedData + a owl:DatatypeProperty ; + rdfs:label "sizeOfInitializedData"@en ; + rdfs:comment "Specifies the size of the initialized data section. If there are multiple such sections, this refers to the sum of the sizes of each section."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sizeOfOptionalHeader + a owl:DatatypeProperty ; + rdfs:label "sizeOfOptionalHeader"@en ; + rdfs:comment "Specifies the size of the optional header of the PE binary. "@en ; + rdfs:range xsd:integer ; + . + +observable:sizeOfStackCommit + a owl:DatatypeProperty ; + rdfs:label "sizeOfStackCommit"@en ; + rdfs:comment "Specifies the size of the stack to commit."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sizeOfStackReserve + a owl:DatatypeProperty ; + rdfs:label "sizeOfStackReserve"@en ; + rdfs:comment "Specifies the size of the stack to reserve."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sizeOfUninitializedData + a owl:DatatypeProperty ; + rdfs:label "sizeOfUninitializedData"@en ; + rdfs:comment "Specifies the size of the uninitialized data section. If there are multiple such sections, this refers to the sum of the sizes of each section."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:sourceApplication + a owl:ObjectProperty ; + rdfs:label "sourceApplication"@en ; + rdfs:comment "Source application specifies the software application that a particular contact or contact list is associated with."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:sourceFlags + a owl:DatatypeProperty ; + rdfs:label "sourceFlags"@en ; + rdfs:comment "Specifies the source TCP flags."@en ; + rdfs:range xsd:hexBinary ; + . + +observable:sourcePort + a owl:DatatypeProperty ; + rdfs:label "sourcePort"@en ; + rdfs:comment """Specifies the source port used in the connection, as an integer in the range of 0 - 65535. + """@en ; + rdfs:range xsd:integer ; + . + +observable:spaceLeft + a owl:DatatypeProperty ; + rdfs:label "spaceLeft"@en ; + rdfs:comment "Specifies the amount of space left on the partition, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:spaceUsed + a owl:DatatypeProperty ; + rdfs:label "spaceUsed"@en ; + rdfs:comment "Specifies the amount of space used on the partition, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:sponsoringRegistrar + a owl:DatatypeProperty ; + rdfs:label "sponsoringRegistrar"@en ; + rdfs:comment "Specifies the name of the sponsoring registrar for a domain."@en ; + rdfs:range xsd:string ; + . + +observable:src + a owl:ObjectProperty ; + rdfs:label "src"@en ; + rdfs:comment "Specifies the source(s) of the network connection."@en ; + rdfs:range core:UcoObject ; + . + +observable:srcBytes + a owl:DatatypeProperty ; + rdfs:label "srcBytes"@en ; + rdfs:range xsd:integer ; + . + +observable:srcPackets + a owl:DatatypeProperty ; + rdfs:label "srcPackets"@en ; + rdfs:range xsd:integer ; + . + +observable:srcPayload + a owl:ObjectProperty ; + rdfs:label "srcPayload"@en ; + rdfs:range observable:ObservableObject ; + . + +observable:ssid + a owl:DatatypeProperty ; + rdfs:label "ssid"@en ; + rdfs:comment "Network identifier."@en ; + rdfs:range xsd:string ; + . + +observable:stackSize + a owl:DatatypeProperty ; + rdfs:label "stackSize"@en ; + rdfs:range xsd:nonNegativeInteger ; + . + +observable:startAddress + a owl:DatatypeProperty ; + rdfs:label "startAddress"@en ; + rdfs:range xsd:hexBinary ; + . + +observable:startCommandLine + a owl:DatatypeProperty ; + rdfs:label "startCommandLine"@en ; + rdfs:range xsd:string ; + . + +observable:startTime + a owl:DatatypeProperty ; + rdfs:label "startTime"@en ; + rdfs:range xsd:dateTime ; + . + +observable:startType + a owl:DatatypeProperty ; + rdfs:label "startType"@en ; + rdfs:range xsd:string ; + . + +observable:startupInfo + a owl:ObjectProperty ; + rdfs:label "startupInfo"@en ; + rdfs:range types:Dictionary ; + . + +observable:state + a owl:DatatypeProperty ; + rdfs:label "State"@en ; + rdfs:range xsd:string ; + . + +observable:status + a owl:DatatypeProperty ; + rdfs:label "status"@en ; + rdfs:comment "Specifies a list of statuses for a given Whois entry."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:string + vocabulary1:TaskStatusVocab + vocabulary1:WhoisStatusTypeVocab + ) ; + ] ; + . + +observable:statusesCount + a owl:DatatypeProperty ; + rdfs:label "Statuses Count"@en-US ; + rdfs:comment "Specifies the number of tweets that this profile has issued."@en-US ; + rdfs:range xsd:nonNegativeInteger ; + . + +observable:storageCapacityInBytes + a owl:DatatypeProperty ; + rdfs:label "storageCapacityInBytes"@en ; + rdfs:comment "The number of bytes that can be stored on a SIM card."@en ; + rdfs:range xsd:integer ; + . + +observable:stringValue + a owl:DatatypeProperty ; + rdfs:label "stringValue"@en ; + rdfs:comment "Specifies the actual value of the extracted string."@en ; + rdfs:range xsd:string ; + . + +observable:strings + a owl:ObjectProperty ; + rdfs:label "strings"@en ; + rdfs:range observable:ExtractedString ; + . + +observable:subject + a owl:DatatypeProperty ; + rdfs:label "subject"@en ; + rdfs:comment "The subject of the email."@en ; + rdfs:range xsd:string ; + . + +observable:subjectAlternativeName + a owl:DatatypeProperty ; + rdfs:label "subjectAlternativeName"@en ; + rdfs:range xsd:string ; + . + +observable:subjectDirectoryAttributes + a owl:DatatypeProperty ; + rdfs:label "subjectDirectoryAttributes"@en ; + rdfs:range xsd:string ; + . + +observable:subjectHash + a owl:ObjectProperty ; + rdfs:label "subjectHash"@en ; + rdfs:comment "A hash calculated on the certificate subject name."@en ; + rdfs:range types:Hash ; + . + +observable:subjectKeyIdentifier + a owl:DatatypeProperty ; + rdfs:label "subjectKeyIdentifier"@en ; + rdfs:range xsd:string ; + . + +observable:subjectPublicKeyAlgorithm + a owl:DatatypeProperty ; + rdfs:label "subjectPublicKeyAlgorithm"@en ; + rdfs:range xsd:string ; + . + +observable:subjectPublicKeyExponent + a owl:DatatypeProperty ; + rdfs:label "subjectPublicKeyExponent"@en ; + rdfs:range xsd:integer ; + . + +observable:subjectPublicKeyModulus + a owl:DatatypeProperty ; + rdfs:label "subjectPublicKeyModulus"@en ; + rdfs:range xsd:string ; + . + +observable:subsystem + a owl:DatatypeProperty ; + rdfs:label "subsystem"@en ; + rdfs:comment "Specifies the subsystem (e.g., GUI, device driver, etc.) that is required to run this image."@en ; + rdfs:range xsd:unsignedShort ; + . + +observable:swid + a owl:DatatypeProperty ; + rdfs:label "swid"@en ; + rdfs:comment "Specifies the SWID tag for the software."@en ; + rdfs:range xsd:string ; + . + +observable:symbolicName + a owl:DatatypeProperty ; + rdfs:label "symbolicName"@en ; + rdfs:comment "The symbolic name of a global flag. See also: http://msdn.microsoft.com/en-us/library/windows/hardware/ff549646(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:systemTime + a owl:DatatypeProperty ; + rdfs:label "systemTime"@en ; + rdfs:range xsd:dateTime ; + . + +observable:tableName + a owl:DatatypeProperty ; + rdfs:label "tableName"@en ; + rdfs:range xsd:string ; + . + +observable:targetFile + a owl:ObjectProperty ; + rdfs:label "targetFile"@en ; + rdfs:comment "Specifies the file targeted by a symbolic link."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:taskComment + a owl:DatatypeProperty ; + rdfs:label "taskComment"@en ; + rdfs:comment "Specifies a comment for the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381232(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:taskCreator + a owl:DatatypeProperty ; + rdfs:label "taskCreator"@en ; + rdfs:comment "Specifies the name of the creator of the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381235(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:text + a owl:DatatypeProperty ; + rdfs:label "text"@en ; + rdfs:range xsd:string ; + . + +observable:threadID + a owl:DatatypeProperty ; + rdfs:label "threadID"@en ; + rdfs:range xsd:nonNegativeInteger ; + . + +observable:thumbprintHash + a owl:ObjectProperty ; + rdfs:label "thumbprintHash"@en ; + rdfs:comment "A hash calculated on the entire certificate including signature."@en ; + rdfs:range types:Hash ; + . + +observable:timeDateStamp + a owl:DatatypeProperty ; + rdfs:label "timeDateStamp"@en ; + rdfs:comment "Specifies the time when the PE binary was created."@en ; + rdfs:range xsd:dateTime ; + . + +observable:timesExecuted + a owl:DatatypeProperty ; + rdfs:label "timesExecuted"@en ; + rdfs:comment "The number of times the prefetch application has executed."@en ; + rdfs:range xsd:integer ; + . + +observable:timezoneDST + a owl:DatatypeProperty ; + rdfs:label "timezoneDST"@en ; + rdfs:comment "Specifies the time zone used by the system, taking daylight savings time (DST) into account."@en ; + rdfs:range xsd:string ; + . + +observable:timezoneStandard + a owl:DatatypeProperty ; + rdfs:label "timezoneStandard"@en ; + rdfs:comment "Specifies the time zone used by the system, without taking daylight savings time (DST) into account."@en ; + rdfs:range xsd:string ; + . + +observable:to + a owl:ObjectProperty ; + rdfs:label "to"@en ; + rdfs:comment "The receiver's phone number."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:totalFragments + a owl:DatatypeProperty ; + rdfs:label "totalFragments"@en ; + rdfs:range xsd:integer ; + . + +observable:totalRam + a owl:DatatypeProperty ; + rdfs:label "totalRam"@en ; + rdfs:comment "Specifies the total amount of physical memory present on the system, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:totalSpace + a owl:DatatypeProperty ; + rdfs:label "totalSpace"@en ; + rdfs:comment "Specifies the total amount of space available on the partition, in bytes."@en ; + rdfs:range xsd:integer ; + . + +observable:triggerBeginTime + a owl:DatatypeProperty ; + rdfs:label "triggerBeginTime"@en ; + rdfs:comment "Specifies the date/time that the trigger is activated."@en ; + rdfs:range xsd:dateTime ; + . + +observable:triggerDelay + a owl:DatatypeProperty ; + rdfs:label "triggerDelay"@en ; + rdfs:comment "Specifies the delay that takes place between when the task is registered and when the task is started."@en ; + rdfs:range xsd:string ; + . + +observable:triggerEndTime + a owl:DatatypeProperty ; + rdfs:label "triggerEndTime"@en ; + rdfs:comment "Specifies the date/time that the trigger is deactivated."@en ; + rdfs:range xsd:dateTime ; + . + +observable:triggerFrequency + a owl:DatatypeProperty ; + rdfs:label "triggerFrequency"@en ; + rdfs:comment "Specifies the frequency at which the trigger repeats."@en ; + rdfs:range vocabulary1:TriggerFrequencyVocab ; + . + +observable:triggerList + a owl:ObjectProperty ; + rdfs:label "triggerList"@en ; + rdfs:comment "Specifies a set of triggers used by the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383264(v=vs.85).aspx."@en ; + rdfs:range observable:TriggerType ; + . + +observable:triggerMaxRunTime + a owl:DatatypeProperty ; + rdfs:label "triggerMaxRunTime"@en ; + rdfs:comment "The maximum amount of time that the task launched by the trigger is allowed to run. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383868(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:triggerSessionChangeType + a owl:DatatypeProperty ; + rdfs:label "triggerSessionChangeType"@en ; + rdfs:comment "Specifies the type of Terminal Server session change that would trigger a task launch. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381298(v=vs.85).aspx."@en ; + rdfs:range xsd:string ; + . + +observable:triggerType + a owl:DatatypeProperty ; + rdfs:label "triggerType"@en ; + rdfs:comment "Specifies the type of the task trigger."@en ; + rdfs:range vocabulary1:TriggerTypeVocab ; + . + +observable:twitterHandle + a owl:DatatypeProperty ; + rdfs:label "Twitter Handle"@en-US ; + rdfs:comment "Specifies the twitter handle associated with the profile."@en-US ; + rdfs:range xsd:string ; + . + +observable:twitterId + a owl:DatatypeProperty ; + rdfs:label "Twitter ID"@en-US ; + rdfs:comment "Specifies the twitter id associated with the profile."@en-US ; + rdfs:range xsd:string ; + . + +observable:updatedDate + a owl:DatatypeProperty ; + rdfs:label "updatedDate"@en ; + rdfs:comment "Specifies the date in which the registered domain information was last updated."@en ; + rdfs:range xsd:dateTime ; + . + +observable:uptime + a owl:DatatypeProperty ; + rdfs:label "uptime"@en ; + rdfs:comment "Specifies the duration that represents the current amount of time that the system has been up."@en ; + rdfs:range xsd:string ; + . + +observable:url + a owl:ObjectProperty ; + rdfs:label "url"@en ; + rdfs:comment "Specifies a URL associated with a particular observable object or facet."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:urlHistoryEntry + a owl:ObjectProperty ; + rdfs:label "URL History Entries"@en ; + rdfs:comment "Specifies a URL history record stored in the browser's history."@en ; + rdfs:range observable:URLHistoryEntry ; + . + +observable:urlTargeted + a owl:DatatypeProperty ; + rdfs:label "urlTargeted"@en ; + rdfs:comment "The target of the bookmark."@en ; + rdfs:range xsd:anyURI ; + . + +observable:urlTransitionType + a owl:DatatypeProperty ; + rdfs:label "Transition Type"@en ; + rdfs:comment "Specifies how a browser navigated to a particular URL on a particular visit."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:string + vocabulary1:URLTransitionTypeVocab + ) ; + ] ; + . + +observable:userLocationString + a owl:DatatypeProperty ; + rdfs:label "User Location String"@en-US ; + rdfs:comment "Specifies the user-provided location string associated with the profile."@en-US ; + rdfs:range xsd:string ; + . + +observable:userName + a owl:ObjectProperty ; + rdfs:label "userName"@en ; + rdfs:comment "Username used to authenticate to this resource."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:validityNotAfter + a owl:DatatypeProperty ; + rdfs:label "validityNotAfter"@en ; + rdfs:range xsd:dateTime ; + . + +observable:validityNotBefore + a owl:DatatypeProperty ; + rdfs:label "validityNotBefore"@en ; + rdfs:range xsd:dateTime ; + . + +observable:value + a owl:DatatypeProperty ; + rdfs:label "value"@en ; + rdfs:range xsd:string ; + . + +observable:values + a owl:DatatypeProperty ; + rdfs:label "values"@en ; + rdfs:comment "The values that were enumerated as a result of the action on the object."@en ; + rdfs:range xsd:string ; + . + +observable:version + a owl:DatatypeProperty ; + rdfs:label "version"@en ; + rdfs:range xsd:string ; + . + +observable:visibility + a owl:DatatypeProperty ; + rdfs:label "visibility"@en ; + rdfs:range xsd:boolean ; + . + +observable:visitCount + a owl:DatatypeProperty ; + rdfs:label "visitCount"@en ; + rdfs:comment "Specifies the number of times a URL has been visited by a particular web browser."@en ; + rdfs:range xsd:integer ; + . + +observable:visitDuration + a owl:DatatypeProperty ; + rdfs:label "Visit Duration"@en ; + rdfs:comment "Specifies the duration of a specific visit of a URL within a particular browser."@en ; + rdfs:range xsd:duration ; + . + +observable:visitTime + a owl:DatatypeProperty ; + rdfs:label "Visit Time"@en ; + rdfs:comment "Specifies the date/time of a specific visit of a URL within a particular browser."@en ; + rdfs:range xsd:dateTime ; + . + +observable:volume + a owl:ObjectProperty ; + rdfs:label "volume"@en ; + rdfs:comment "The volume from which the prefetch application was run. If the applicatin was run from multiple volumes, there will be a separate prefetch file for each."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:volumeID + a owl:DatatypeProperty ; + rdfs:label "volumeID"@en ; + rdfs:comment "The unique identifier of the volume."@en ; + rdfs:range xsd:string ; + . + +observable:whoisContactType + a owl:DatatypeProperty ; + rdfs:label "whoisContactType"@en ; + rdfs:comment "Specifies what type of WHOIS contact this is."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + xsd:string + vocabulary1:WhoisContactTypeVocab + ) ; + ] ; + . + +observable:whoisServer + a owl:ObjectProperty ; + rdfs:label "whoisServer"@en ; + rdfs:comment "Specifies the corresponding whois server for a registrar."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:win32VersionValue + a owl:DatatypeProperty ; + rdfs:label "win32VersionValue"@en ; + rdfs:comment "Specifies the reserved win32 version value."@en ; + rdfs:range xsd:unsignedInt ; + . + +observable:windowTitle + a owl:DatatypeProperty ; + rdfs:label "windowTitle"@en ; + rdfs:range xsd:string ; + . + +observable:windowsDirectory + a owl:ObjectProperty ; + rdfs:label "windowsDirectory"@en ; + rdfs:comment "The Windows_Directory field specifies the fully-qualified path to the Windows install directory."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:windowsSystemDirectory + a owl:ObjectProperty ; + rdfs:label "windowsSystemDirectory"@en ; + rdfs:comment "The Windows_System_Directory field specifies the fully-qualified path to the Windows system directory."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:windowsTempDirectory + a owl:ObjectProperty ; + rdfs:label "windowsTempDirectory"@en ; + rdfs:comment "The Windows_Temp_Directory field specifies the fully-qualified path to the Windows temporary files directory."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:windowsVolumeAttributes + a owl:DatatypeProperty ; + rdfs:label "windowsVolumeAttributes"@en ; + rdfs:comment "Specifies the attributes of a windows volume."@en ; + rdfs:range vocabulary1:WindowsVolumeAttributeVocab ; + . + +observable:workItemData + a owl:ObjectProperty ; + rdfs:label "workItemData"@en ; + rdfs:comment "Specifies application defined data associated with the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381271(v=vs.85).aspx."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:workingDirectory + a owl:ObjectProperty ; + rdfs:label "workingDirectory"@en ; + rdfs:comment "Specifies the working directory for the scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381878(v=vs.85).aspx."@en ; + rdfs:range observable:ObservableObject ; + . + +observable:x509v3extensions + a owl:ObjectProperty ; + rdfs:label "x509V3Extensions"@en ; + rdfs:range observable:X509V3ExtensionsFacet ; + . + +observable:xMailer + a owl:DatatypeProperty ; + rdfs:label "xMailer"@en ; + rdfs:range xsd:string ; + . + +observable:xOriginatingIP + a owl:ObjectProperty ; + rdfs:label "xOriginatingIP"@en ; + rdfs:range observable:ObservableObject ; + . + +pattern:LogicalPattern + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf pattern:Pattern ; + rdfs:label "LogicalPattern"@en ; + rdfs:comment "A logical pattern is a grouping of characteristics unique to an informational pattern expressed via a structured pattern expression following the rules of logic."@en ; + sh:property [ + sh:datatype pattern:PatternExpression ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path pattern:patternExpression ; + ] ; + sh:targetClass pattern:LogicalPattern ; + . + +pattern:Pattern + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Pattern"@en ; + rdfs:comment "A pattern is a combination of properties, acts, tendencies, etc., forming a consistent or characteristic arrangement."@en ; + sh:targetClass pattern:Pattern ; + . + +pattern:PatternExpression + a + owl:Class , + sh:NodeShape + ; + rdfs:label "PatternExpression"@en ; + rdfs:comment "A pattern expression is a grouping of characteristics unique to an explicit logical expression defining a pattern (e.g., regular expression, SQL Select expression, etc.)."@en ; + sh:targetClass pattern:PatternExpression ; + . + +pattern:patternExpression + a owl:DatatypeProperty ; + rdfs:label "patternExpression"@en ; + rdfs:comment "An explicit logical pattern expression."@en ; + rdfs:range pattern:PatternExpression ; + . + +role:BenevolentRole + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf role:Role ; + rdfs:label "BenevolentRole"@en ; + rdfs:comment "A benevolent role is a role with positive and/or beneficial intent."@en ; + sh:targetClass role:BenevolentRole ; + . + +role:MaliciousRole + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf role:Role ; + rdfs:label "MaliciousRole"@en ; + rdfs:comment "A malicious role is a role with malevolent intent."@en ; + sh:targetClass role:MaliciousRole ; + . + +role:NeutralRole + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf role:Role ; + rdfs:label "NeutralRole"@en ; + rdfs:comment "A neutral role is a role with impartial intent."@en ; + sh:targetClass role:NeutralRole ; + . + +role:Role + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Role"@en ; + rdfs:comment "A role is a usual or customary function based on contextual perspective."@en ; + sh:targetClass role:Role ; + . + +time:Time + a rdfs:Datatype ; + . + +time:TimeRange + a rdfs:Datatype ; + . + +time:Timestamp + a rdfs:Datatype ; + . + +tool:AnalyticTool + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf tool:Tool ; + rdfs:label "AnalyticTool"@en ; + rdfs:comment "An analytic tool is an artifact of hardware and/or software utilized to accomplish a task or purpose of explanation, interpretation or logical reasoning."@en ; + sh:targetClass tool:AnalyticTool ; + . + +tool:BuildConfigurationType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "BuildConfigurationType"@en ; + rdfs:comment "A build configuration type is a characterization of how a particular version of software can or should be built."@en ; + sh:property + [ + sh:class tool:ConfigurationSettingType ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path tool:configurationSettings ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:configurationSettingDescription ; + ] + ; + sh:targetClass tool:BuildConfigurationType ; + . + +tool:BuildFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "BuildFacet"@en ; + rdfs:comment "A build facet is a grouping of characteristics unique to a particular version of a software."@en ; + sh:property [ + sh:class tool:BuildInformationType ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path tool:buildInformation ; + ] ; + sh:targetClass tool:BuildFacet ; + . + +tool:BuildInformationType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "BuildInformationType"@en ; + rdfs:comment "A build information type is a grouping of characteristics that describe how a particular version of software was converted from source code to executable code."@en ; + sh:property + [ + sh:class tool:BuildConfigurationType ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path tool:buildConfiguration ; + ] , + [ + sh:class tool:BuildUtilityType ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path tool:buildUtility ; + ] , + [ + sh:class tool:CompilerType ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path tool:compilers ; + ] , + [ + sh:class tool:LibraryType ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path tool:libraries ; + ] , + [ + sh:datatype xsd:dateTime ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:compilationDate ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:buildID ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:buildLabel ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:buildOutputLog ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:buildProject ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:buildScript ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:buildVersion ; + ] + ; + sh:targetClass tool:BuildInformationType ; + . + +tool:BuildUtilityType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "BuildUtilityType"@en ; + rdfs:comment "A build utility type characterizes the tool used to convert from source code to executable code for a particular version of software."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:buildUtilityName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:cpeid ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:swid ; + ] + ; + sh:targetClass tool:BuildUtilityType ; + . + +tool:CompilerType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "CompilerType"@en ; + rdfs:comment "A compiler type is a grouping of characteristics unique to a specific program that translates computer code written in one programming language (the source language) into another language (the target language). Typically a program that translates source code from a high-level programming language to a lower-level language (e.g., assembly language, object code, or machine code) to create an executable program. [based on https://en.wikipedia.org/wiki/Compiler]"@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:compilerInformalDescription ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:cpeid ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:swid ; + ] + ; + sh:targetClass tool:CompilerType ; + . + +tool:ConfigurationSettingType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ConfigurationSettingType"@en ; + rdfs:comment "A configuration setting type is a grouping of characteristics unique to a particular parameter or initial setting for the use of a tool, application, or other cyber object."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:itemName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:itemValue ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:itemDescription ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:itemType ; + ] + ; + sh:targetClass tool:ConfigurationSettingType ; + . + +tool:DefensiveTool + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf tool:Tool ; + rdfs:label "DefensiveTool"@en ; + rdfs:comment "A defensive tool is an artifact of hardware and/or software utilized to accomplish a task or purpose of guarding."@en ; + sh:targetClass tool:DefensiveTool ; + . + +tool:DependencyType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "DependencyType"@en ; + rdfs:comment "A dependency type is a grouping of characteristics unique to something that a tool or other software relies on to function as intended."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:dependencyDescription ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:dependencyType ; + ] + ; + sh:targetClass tool:DependencyType ; + . + +tool:LibraryType + a + owl:Class , + sh:NodeShape + ; + rdfs:label "LibraryType"@en ; + rdfs:comment "A library type is a grouping of characteristics unique to a collection of resources incorporated into the build of a software."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:libraryName ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:libraryVersion ; + ] + ; + sh:targetClass tool:LibraryType ; + . + +tool:MaliciousTool + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf tool:Tool ; + rdfs:label "MaliciousTool"@en ; + rdfs:comment "A malicious tool is an artifact of hardware and/or software utilized to accomplish a malevolent task or purpose."@en ; + sh:targetClass tool:MaliciousTool ; + . + +tool:Tool + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:UcoObject ; + rdfs:label "Tool"@en ; + rdfs:comment "A tool is an element of hardware and/or software utilized to carry out a particular function."@en ; + sh:property + [ + sh:datatype xsd:anyURI ; + sh:nodeKind sh:Literal ; + sh:path tool:references ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:creator ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:servicePack ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:toolType ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path tool:version ; + ] + ; + sh:targetClass tool:Tool ; + . + +tool:ToolConfigurationTypeFacet + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf core:Facet ; + rdfs:label "ToolConfigurationTypeFacet"@en ; + rdfs:comment "A tool configuration type facet is a grouping of characteristics unique to the instantial settings and setup of a tool."@en ; + sh:property + [ + sh:class tool:DependencyType ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path tool:dependencies ; + ] , + [ + sh:datatype xsd:string ; + sh:nodeKind sh:Literal ; + sh:path tool:usageContextAssumptions ; + ] + ; + sh:targetClass tool:ToolConfigurationTypeFacet ; + . + +tool:buildConfiguration + a owl:ObjectProperty ; + rdfs:label "buildConfiguration"@en ; + rdfs:comment "How the build utility was configured for a particular build of a particular software."@en ; + rdfs:range tool:BuildConfigurationType ; + . + +tool:buildID + a owl:DatatypeProperty ; + rdfs:label "buildID"@en ; + rdfs:comment "An externally defined unique identifier for a particular build of a software."@en ; + rdfs:range xsd:string ; + . + +tool:buildInformation + a owl:ObjectProperty ; + rdfs:label "buildInformation"@en ; + rdfs:comment "Describes how a particular tool was built."@en ; + rdfs:range tool:BuildInformationType ; + . + +tool:buildLabel + a owl:DatatypeProperty ; + rdfs:label "buildLabel"@en ; + rdfs:comment "Relevant label for a particular build of a particular software."@en ; + rdfs:range xsd:string ; + . + +tool:buildOutputLog + a owl:DatatypeProperty ; + rdfs:label "buildOutputLog"@en ; + rdfs:comment "The output log of the build process for a software."@en ; + rdfs:range xsd:string ; + . + +tool:buildProject + a owl:DatatypeProperty ; + rdfs:label "buildProject"@en ; + rdfs:comment "The project name of a build of a software."@en ; + rdfs:range xsd:string ; + . + +tool:buildScript + a owl:DatatypeProperty ; + rdfs:label "buildScript"@en ; + rdfs:comment "The actual build script for a particular build of a particular software."@en ; + rdfs:range xsd:string ; + . + +tool:buildUtility + a owl:ObjectProperty ; + rdfs:label "buildUtility"@en ; + rdfs:comment "Identifies the utility used to build a software."@en ; + rdfs:range tool:BuildUtilityType ; + . + +tool:buildUtilityName + a owl:DatatypeProperty ; + rdfs:label "buildUtilityName"@en ; + rdfs:comment "The informally defined name of the utility used to build a particular software."@en ; + rdfs:range xsd:string ; + . + +tool:buildVersion + a owl:DatatypeProperty ; + rdfs:label "buildVersion"@en ; + rdfs:comment "The appropriate version descriptor of a particular build of a particular software."@en ; + rdfs:range xsd:string ; + . + +tool:compilationDate + a owl:DatatypeProperty ; + rdfs:label "compilationDate"@en ; + rdfs:comment "The compilation date for the build of a software."@en ; + rdfs:range xsd:dateTime ; + . + +tool:compilerInformalDescription + a owl:DatatypeProperty ; + rdfs:label "compilerInformalDescription"@en ; + rdfs:comment "An informal description of a compiler."@en ; + rdfs:range xsd:string ; + . + +tool:compilers + a owl:ObjectProperty ; + rdfs:label "compilers"@en ; + rdfs:comment "The compilers utilized during a particular build of a particular software."@en ; + rdfs:range tool:CompilerType ; + . + +tool:configurationSettingDescription + a owl:DatatypeProperty ; + rdfs:label "configurationSettingDescription"@en ; + rdfs:comment "Description of the configuration settings for a particular build of a particular software."@en ; + rdfs:range xsd:string ; + . + +tool:configurationSettings + a owl:ObjectProperty ; + rdfs:label "configurationSettings"@en ; + rdfs:comment "The configuration settings for a particular build of a particular software."@en ; + rdfs:range tool:ConfigurationSettingType ; + . + +tool:cpeid + a owl:DatatypeProperty ; + rdfs:label "cpeid"@en ; + rdfs:comment "Specifies the Common Platform Enumeration identifier for the software."@en ; + rdfs:range xsd:string ; + . + +tool:creator + a owl:DatatypeProperty ; + rdfs:label "creator"@en ; + rdfs:comment "The creator organization for a particular tool."@en ; + rdfs:range xsd:string ; + . + +tool:dependencies + a owl:ObjectProperty ; + rdfs:label "dependencies"@en ; + rdfs:comment "The relevant dependencies for a tool."@en ; + rdfs:range tool:DependencyType ; + . + +tool:dependencyDescription + a owl:DatatypeProperty ; + rdfs:label "dependencyDescription"@en ; + rdfs:comment "A description of a tool dependency."@en ; + rdfs:range xsd:string ; + . + +tool:dependencyType + a owl:DatatypeProperty ; + rdfs:label "dependencyType"@en ; + rdfs:comment "The type of a tool dependency."@en ; + rdfs:range xsd:string ; + . + +tool:itemDescription + a owl:DatatypeProperty ; + rdfs:label "itemDescription"@en ; + rdfs:comment "A description of a configuration item."@en ; + rdfs:range xsd:string ; + . + +tool:itemName + a owl:DatatypeProperty ; + rdfs:label "itemName"@en ; + rdfs:comment "The name of a configuration item."@en ; + rdfs:range xsd:string ; + . + +tool:itemType + a owl:DatatypeProperty ; + rdfs:label "itemType"@en ; + rdfs:comment "The type of a configuration item."@en ; + rdfs:range xsd:string ; + . + +tool:itemValue + a owl:DatatypeProperty ; + rdfs:label "itemValue"@en ; + rdfs:comment "The value of a configuration setting instance."@en ; + rdfs:range xsd:string ; + . + +tool:libraries + a owl:ObjectProperty ; + rdfs:label "libraries"@en ; + rdfs:comment "The libraries incorporated into a particular build of a software."@en ; + rdfs:range tool:LibraryType ; + . + +tool:libraryName + a owl:DatatypeProperty ; + rdfs:label "libraryName"@en ; + rdfs:comment "The name of the library."@en ; + rdfs:range xsd:string ; + . + +tool:libraryVersion + a owl:DatatypeProperty ; + rdfs:label "libraryVersion"@en ; + rdfs:comment "The version of the library."@en ; + rdfs:range xsd:string ; + . + +tool:references + a owl:DatatypeProperty ; + rdfs:label "references"@en ; + rdfs:comment "References to information describing a particular tool."@en ; + rdfs:range xsd:anyURI ; + . + +tool:servicePack + a owl:DatatypeProperty ; + rdfs:label "servicePack"@en ; + rdfs:comment "An appropriate service pack descriptor for a particular tool."@en ; + rdfs:range xsd:string ; + . + +tool:swid + a owl:DatatypeProperty ; + rdfs:label "swid"@en ; + rdfs:comment "Specifies the SWID tag for the software."@en ; + rdfs:range xsd:string ; + . + +tool:toolType + a owl:DatatypeProperty ; + rdfs:label "toolType"@en ; + rdfs:comment "The type of tool."@en ; + rdfs:range xsd:string ; + . + +tool:usageContextAssumptions + a owl:DatatypeProperty ; + rdfs:label "usageContextAssumptions"@en ; + rdfs:comment "dDescriptions of the various relevant usage context assumptions for this tool ."@en ; + rdfs:range xsd:string ; + . + +tool:version + a owl:DatatypeProperty ; + rdfs:label "version"@en ; + rdfs:comment "An appropriate version descriptor of a particular tool."@en ; + rdfs:range xsd:string ; + . + +types:ControlledDictionary + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ControlledDictionary"@en ; + rdfs:comment "A controlled dictionary is a list of (term/key, value) pairs where each term/key exists no more than once and is constrained to an explicitly defined set of values."@en ; + sh:property [ + sh:class types:ControlledDictionaryEntry ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path types:entry ; + ] ; + sh:targetClass types:ControlledDictionary ; + . + +types:ControlledDictionaryEntry + a + owl:Class , + sh:NodeShape + ; + rdfs:label "ControlledDictionaryEntry"@en ; + rdfs:comment "A controlled dictionary entry is a single (term/key, value) pair where the term/key is constrained to an explicitly defined set of values."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path types:key ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path types:value ; + ] + ; + sh:targetClass types:ControlledDictionaryEntry ; + . + +types:Dictionary + a + owl:Class , + sh:NodeShape + ; + rdfs:label "Dictionary"@en ; + rdfs:comment "A dictionary is list of (term/key, value) pairs with each term/key existing no more than once."@en ; + sh:property [ + sh:class types:DictionaryEntry ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path types:entry ; + ] ; + sh:targetClass types:Dictionary ; + . + +types:DictionaryEntry + a + owl:Class , + sh:NodeShape + ; + rdfs:label "DictionaryEntry"@en ; + rdfs:comment "A dictionary entry is a single (term/key, value) pair."@en ; + sh:property + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path types:key ; + ] , + [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path types:value ; + ] + ; + sh:targetClass types:DictionaryEntry ; + . + +types:Hash + a + owl:Class , + sh:NodeShape + ; + rdfs:label "Hash"@en ; + rdfs:comment "A hash is a grouping of characteristics unique to the result of applying a mathematical algorithm that maps data of arbitrary size to a bit string (the 'hash') and is a one-way function, that is, a function which is practically infeasible to invert. This is commonly used for integrity checking of data. [based on https://en.wikipedia.org/wiki/Cryptographic_hash_function]"@en ; + sh:property + [ + sh:datatype xsd:hexBinary ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path types:hashValue ; + ] , + [ + sh:datatype vocabulary1:HashNameVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path types:hashMethod ; + ] + ; + sh:targetClass types:Hash ; + . + +types:Identifier + a rdfs:Datatype ; + rdfs:comment "An identifier is a string conformant to the specified UUID-based format for UCO object identifiers."@en ; + . + +types:NativeFormatString + a rdfs:Datatype ; + rdfs:comment "Specifies data in its native format of some external language. The data may be encoded in Base64 per [RFC4648]. Data encoded in Base64 must be denoted as such using the encoded property."@en ; + . + +types:StructuredText + a rdfs:Datatype ; + rdfs:comment "Expresses string-based data in some information structuring format (e.g., HTML5)."@en ; + . + +types:entry + a owl:ObjectProperty ; + rdfs:label "entry"@en ; + rdfs:comment "A dictionary entry."@en ; + rdfs:range [ + a rdfs:Datatype ; + owl:unionOf ( + types:ControlledDictionaryEntry + types:DictionaryEntry + ) ; + ] ; + . + +types:hashMethod + a owl:DatatypeProperty ; + rdfs:label "hashMethod"@en ; + rdfs:comment "A particular cryptographic hashing method (e.g., MD5)."@en ; + rdfs:range vocabulary1:HashNameVocab ; + . + +types:hashValue + a owl:DatatypeProperty ; + rdfs:label "hashValue"@en ; + rdfs:comment "A cryptographic hash value."@en ; + rdfs:range xsd:hexBinary ; + . + +types:key + a owl:DatatypeProperty ; + rdfs:label "key"@en ; + rdfs:comment "A key property of a single dictionary entry."@en ; + rdfs:range xsd:string ; + . + +types:value + a owl:DatatypeProperty ; + rdfs:label "value"@en ; + rdfs:comment "A specific property value."@en ; + rdfs:range xsd:string ; + . + +victim:Victim + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf role:NeutralRole ; + rdfs:label "Victim"@en ; + rdfs:comment "A victim is a role played by a person or organization that is/was the target of some malicious action."@en ; + sh:targetClass victim:Victim ; + . + +victim:VictimTargeting + a + owl:Class , + sh:NodeShape + ; + rdfs:subClassOf victim:Victim ; + rdfs:label "VictimTargeting"@en ; + rdfs:comment "A victim targeting is a grouping of characteristics unique to people or organizations that are the target of some malicious activity."@en ; + sh:targetClass victim:VictimTargeting ; + . + +vocabulary1:AccountTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Account Type Vocabulary"@en-US ; + owl:oneOf ( + "ldap"^^vocabulary1:AccountTypeVocab + "nis"^^vocabulary1:AccountTypeVocab + "openid"^^vocabulary1:AccountTypeVocab + "radius"^^vocabulary1:AccountTypeVocab + "tacacs"^^vocabulary1:AccountTypeVocab + "unix"^^vocabulary1:AccountTypeVocab + "windows_domain"^^vocabulary1:AccountTypeVocab + "windows_local"^^vocabulary1:AccountTypeVocab + ) ; + . + +vocabulary1:ActionArgumentNameVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Action Argument Name Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary for common arguments of cyber actions."@en ; + owl:oneOf ( + "APC Address"^^vocabulary1:ActionArgumentNameVocab + "APC Mode"^^vocabulary1:ActionArgumentNameVocab + "API"^^vocabulary1:ActionArgumentNameVocab + "Access Mode"^^vocabulary1:ActionArgumentNameVocab + "Application Name"^^vocabulary1:ActionArgumentNameVocab + "Base Address"^^vocabulary1:ActionArgumentNameVocab + "Callback Address"^^vocabulary1:ActionArgumentNameVocab + "Code Address"^^vocabulary1:ActionArgumentNameVocab + "Command"^^vocabulary1:ActionArgumentNameVocab + "Control Code"^^vocabulary1:ActionArgumentNameVocab + "Control Parameter"^^vocabulary1:ActionArgumentNameVocab + "Creation Flags"^^vocabulary1:ActionArgumentNameVocab + "Database Name"^^vocabulary1:ActionArgumentNameVocab + "Delay Time (ms)"^^vocabulary1:ActionArgumentNameVocab + "Destination Address"^^vocabulary1:ActionArgumentNameVocab + "Error Control"^^vocabulary1:ActionArgumentNameVocab + "File Information Class"^^vocabulary1:ActionArgumentNameVocab + "Flags"^^vocabulary1:ActionArgumentNameVocab + "Function Address"^^vocabulary1:ActionArgumentNameVocab + "Function Name"^^vocabulary1:ActionArgumentNameVocab + "Function Ordinal"^^vocabulary1:ActionArgumentNameVocab + "Hook Type"^^vocabulary1:ActionArgumentNameVocab + "Host Name"^^vocabulary1:ActionArgumentNameVocab + "Hostname"^^vocabulary1:ActionArgumentNameVocab + "Initial Owner"^^vocabulary1:ActionArgumentNameVocab + "Mapping Offset"^^vocabulary1:ActionArgumentNameVocab + "Number of Bytes Per Send"^^vocabulary1:ActionArgumentNameVocab + "Options"^^vocabulary1:ActionArgumentNameVocab + "Parameter Address"^^vocabulary1:ActionArgumentNameVocab + "Password"^^vocabulary1:ActionArgumentNameVocab + "Privilege Name"^^vocabulary1:ActionArgumentNameVocab + "Protection"^^vocabulary1:ActionArgumentNameVocab + "Proxy Bypass"^^vocabulary1:ActionArgumentNameVocab + "Proxy Name"^^vocabulary1:ActionArgumentNameVocab + "Reason"^^vocabulary1:ActionArgumentNameVocab + "Request Size"^^vocabulary1:ActionArgumentNameVocab + "Requested Version"^^vocabulary1:ActionArgumentNameVocab + "Server"^^vocabulary1:ActionArgumentNameVocab + "Service Name"^^vocabulary1:ActionArgumentNameVocab + "Service State"^^vocabulary1:ActionArgumentNameVocab + "Service Type"^^vocabulary1:ActionArgumentNameVocab + "Share Mode"^^vocabulary1:ActionArgumentNameVocab + "Shutdown Flag"^^vocabulary1:ActionArgumentNameVocab + "Size (bytes)"^^vocabulary1:ActionArgumentNameVocab + "Sleep Time (ms)"^^vocabulary1:ActionArgumentNameVocab + "Source Address"^^vocabulary1:ActionArgumentNameVocab + "Starting Address"^^vocabulary1:ActionArgumentNameVocab + "System Metric Index"^^vocabulary1:ActionArgumentNameVocab + "Target PID"^^vocabulary1:ActionArgumentNameVocab + "Transfer Flags"^^vocabulary1:ActionArgumentNameVocab + "Username"^^vocabulary1:ActionArgumentNameVocab + ) ; + . + +vocabulary1:ActionNameVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Action Name Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of common specific cyber action names."@en ; + owl:oneOf ( + "Accept Socket Connection"^^vocabulary1:ActionNameVocab + "Add Connection to Network Share"^^vocabulary1:ActionNameVocab + "Add Network Share"^^vocabulary1:ActionNameVocab + "Add Scheduled Task"^^vocabulary1:ActionNameVocab + "Add System Call Hook"^^vocabulary1:ActionNameVocab + "Add User"^^vocabulary1:ActionNameVocab + "Add Windows Hook"^^vocabulary1:ActionNameVocab + "Allocate Virtual Memory in Process"^^vocabulary1:ActionNameVocab + "Bind Address to Socket"^^vocabulary1:ActionNameVocab + "Change Service Configuration"^^vocabulary1:ActionNameVocab + "Check for Remote Debugger"^^vocabulary1:ActionNameVocab + "Close Port"^^vocabulary1:ActionNameVocab + "Close Registry Key"^^vocabulary1:ActionNameVocab + "Close Socket"^^vocabulary1:ActionNameVocab + "Configure Service"^^vocabulary1:ActionNameVocab + "Connect to IP"^^vocabulary1:ActionNameVocab + "Connect to Named Pipe"^^vocabulary1:ActionNameVocab + "Connect to Network Share"^^vocabulary1:ActionNameVocab + "Connect to Socket"^^vocabulary1:ActionNameVocab + "Connect to URL"^^vocabulary1:ActionNameVocab + "Control Driver"^^vocabulary1:ActionNameVocab + "Control Service"^^vocabulary1:ActionNameVocab + "Copy File"^^vocabulary1:ActionNameVocab + "Create Dialog Box"^^vocabulary1:ActionNameVocab + "Create Directory"^^vocabulary1:ActionNameVocab + "Create Event"^^vocabulary1:ActionNameVocab + "Create File"^^vocabulary1:ActionNameVocab + "Create File Alternate Data Stream"^^vocabulary1:ActionNameVocab + "Create File Mapping"^^vocabulary1:ActionNameVocab + "Create File Symbolic Link"^^vocabulary1:ActionNameVocab + "Create Hidden File"^^vocabulary1:ActionNameVocab + "Create Mailslot"^^vocabulary1:ActionNameVocab + "Create Module"^^vocabulary1:ActionNameVocab + "Create Mutex"^^vocabulary1:ActionNameVocab + "Create Named Pipe"^^vocabulary1:ActionNameVocab + "Create Process"^^vocabulary1:ActionNameVocab + "Create Process as User"^^vocabulary1:ActionNameVocab + "Create Registry Key"^^vocabulary1:ActionNameVocab + "Create Registry Key Value"^^vocabulary1:ActionNameVocab + "Create Remote Thread in Process"^^vocabulary1:ActionNameVocab + "Create Service"^^vocabulary1:ActionNameVocab + "Create Socket"^^vocabulary1:ActionNameVocab + "Create Symbolic Link"^^vocabulary1:ActionNameVocab + "Create Thread"^^vocabulary1:ActionNameVocab + "Create Window"^^vocabulary1:ActionNameVocab + "Delete Directory"^^vocabulary1:ActionNameVocab + "Delete File"^^vocabulary1:ActionNameVocab + "Delete Named Pipe"^^vocabulary1:ActionNameVocab + "Delete Network Share"^^vocabulary1:ActionNameVocab + "Delete Registry Key"^^vocabulary1:ActionNameVocab + "Delete Registry Key Value"^^vocabulary1:ActionNameVocab + "Delete Service"^^vocabulary1:ActionNameVocab + "Delete User"^^vocabulary1:ActionNameVocab + "Disconnect from Named Pipe"^^vocabulary1:ActionNameVocab + "Disconnect from Network Share"^^vocabulary1:ActionNameVocab + "Disconnect from Socket"^^vocabulary1:ActionNameVocab + "Download File"^^vocabulary1:ActionNameVocab + "Enumerate DLLs"^^vocabulary1:ActionNameVocab + "Enumerate Network Shares"^^vocabulary1:ActionNameVocab + "Enumerate Processes"^^vocabulary1:ActionNameVocab + "Enumerate Protocols"^^vocabulary1:ActionNameVocab + "Enumerate Registry Key Subkeys"^^vocabulary1:ActionNameVocab + "Enumerate Registry Key Values"^^vocabulary1:ActionNameVocab + "Enumerate Services"^^vocabulary1:ActionNameVocab + "Enumerate System Handles"^^vocabulary1:ActionNameVocab + "Enumerate Threads"^^vocabulary1:ActionNameVocab + "Enumerate Threads in Process"^^vocabulary1:ActionNameVocab + "Enumerate Users"^^vocabulary1:ActionNameVocab + "Enumerate Windows"^^vocabulary1:ActionNameVocab + "Find File"^^vocabulary1:ActionNameVocab + "Find Window"^^vocabulary1:ActionNameVocab + "Flush Process Instruction Cache"^^vocabulary1:ActionNameVocab + "Free Library"^^vocabulary1:ActionNameVocab + "Free Process Virtual Memory"^^vocabulary1:ActionNameVocab + "Get Disk Free Space"^^vocabulary1:ActionNameVocab + "Get Disk Type"^^vocabulary1:ActionNameVocab + "Get Elapsed System Up Time"^^vocabulary1:ActionNameVocab + "Get File Attributes"^^vocabulary1:ActionNameVocab + "Get Function Address"^^vocabulary1:ActionNameVocab + "Get Host By Address"^^vocabulary1:ActionNameVocab + "Get Host By Name"^^vocabulary1:ActionNameVocab + "Get Host Name"^^vocabulary1:ActionNameVocab + "Get Library File Name"^^vocabulary1:ActionNameVocab + "Get Library Handle"^^vocabulary1:ActionNameVocab + "Get NetBIOS Name"^^vocabulary1:ActionNameVocab + "Get Process Current Directory"^^vocabulary1:ActionNameVocab + "Get Process Environment Variable"^^vocabulary1:ActionNameVocab + "Get Process Startup Information"^^vocabulary1:ActionNameVocab + "Get Processes Snapshot"^^vocabulary1:ActionNameVocab + "Get Registry Key Attributes"^^vocabulary1:ActionNameVocab + "Get Service Status"^^vocabulary1:ActionNameVocab + "Get System Global Flags"^^vocabulary1:ActionNameVocab + "Get System Host Name"^^vocabulary1:ActionNameVocab + "Get System Local Time"^^vocabulary1:ActionNameVocab + "Get System NetBIOS Name"^^vocabulary1:ActionNameVocab + "Get System Network Parameters"^^vocabulary1:ActionNameVocab + "Get System Time"^^vocabulary1:ActionNameVocab + "Get Thread Context"^^vocabulary1:ActionNameVocab + "Get Thread Username"^^vocabulary1:ActionNameVocab + "Get User Attributes"^^vocabulary1:ActionNameVocab + "Get Username"^^vocabulary1:ActionNameVocab + "Get Windows Directory"^^vocabulary1:ActionNameVocab + "Get Windows System Directory"^^vocabulary1:ActionNameVocab + "Get Windows Temporary Files Directory"^^vocabulary1:ActionNameVocab + "Hide Window"^^vocabulary1:ActionNameVocab + "Impersonate Process"^^vocabulary1:ActionNameVocab + "Impersonate Thread"^^vocabulary1:ActionNameVocab + "Inject Memory Page"^^vocabulary1:ActionNameVocab + "Kill Process"^^vocabulary1:ActionNameVocab + "Kill Thread"^^vocabulary1:ActionNameVocab + "Kill Window"^^vocabulary1:ActionNameVocab + "Listen on Port"^^vocabulary1:ActionNameVocab + "Listen on Socket"^^vocabulary1:ActionNameVocab + "Load Driver"^^vocabulary1:ActionNameVocab + "Load Library"^^vocabulary1:ActionNameVocab + "Load Module"^^vocabulary1:ActionNameVocab + "Load and Call Driver"^^vocabulary1:ActionNameVocab + "Lock File"^^vocabulary1:ActionNameVocab + "Logon as User"^^vocabulary1:ActionNameVocab + "Map File"^^vocabulary1:ActionNameVocab + "Map Library"^^vocabulary1:ActionNameVocab + "Map View of File"^^vocabulary1:ActionNameVocab + "Modify File"^^vocabulary1:ActionNameVocab + "Modify Named Pipe"^^vocabulary1:ActionNameVocab + "Modify Process"^^vocabulary1:ActionNameVocab + "Modify Registry Key"^^vocabulary1:ActionNameVocab + "Modify Registry Key Value"^^vocabulary1:ActionNameVocab + "Modify Service"^^vocabulary1:ActionNameVocab + "Monitor Registry Key"^^vocabulary1:ActionNameVocab + "Move File"^^vocabulary1:ActionNameVocab + "Open File"^^vocabulary1:ActionNameVocab + "Open File Mapping"^^vocabulary1:ActionNameVocab + "Open Mutex"^^vocabulary1:ActionNameVocab + "Open Port"^^vocabulary1:ActionNameVocab + "Open Process"^^vocabulary1:ActionNameVocab + "Open Registry Key"^^vocabulary1:ActionNameVocab + "Open Service"^^vocabulary1:ActionNameVocab + "Open Service Control Manager"^^vocabulary1:ActionNameVocab + "Protect Virtual Memory"^^vocabulary1:ActionNameVocab + "Query DNS"^^vocabulary1:ActionNameVocab + "Query Disk Attributes"^^vocabulary1:ActionNameVocab + "Query Process Virtual Memory"^^vocabulary1:ActionNameVocab + "Queue APC in Thread"^^vocabulary1:ActionNameVocab + "Read File"^^vocabulary1:ActionNameVocab + "Read From Named Pipe"^^vocabulary1:ActionNameVocab + "Read From Process Memory"^^vocabulary1:ActionNameVocab + "Read Registry Key Value"^^vocabulary1:ActionNameVocab + "Receive Data on Socket"^^vocabulary1:ActionNameVocab + "Receive Email Message"^^vocabulary1:ActionNameVocab + "Release Mutex"^^vocabulary1:ActionNameVocab + "Rename File"^^vocabulary1:ActionNameVocab + "Revert Thread to Self"^^vocabulary1:ActionNameVocab + "Send Control Code to File"^^vocabulary1:ActionNameVocab + "Send Control Code to Pipe"^^vocabulary1:ActionNameVocab + "Send Control Code to Service"^^vocabulary1:ActionNameVocab + "Send DNS Query"^^vocabulary1:ActionNameVocab + "Send Data on Socket"^^vocabulary1:ActionNameVocab + "Send Data to Address on Socket"^^vocabulary1:ActionNameVocab + "Send Email Message"^^vocabulary1:ActionNameVocab + "Send ICMP Request"^^vocabulary1:ActionNameVocab + "Send Reverse DNS Query"^^vocabulary1:ActionNameVocab + "Set File Attributes"^^vocabulary1:ActionNameVocab + "Set NetBIOS Name"^^vocabulary1:ActionNameVocab + "Set Process Current Directory"^^vocabulary1:ActionNameVocab + "Set Process Environment Variable"^^vocabulary1:ActionNameVocab + "Set System Global Flags"^^vocabulary1:ActionNameVocab + "Set System Host Name"^^vocabulary1:ActionNameVocab + "Set System Time"^^vocabulary1:ActionNameVocab + "Set Thread Context"^^vocabulary1:ActionNameVocab + "Show Window"^^vocabulary1:ActionNameVocab + "Shutdown System"^^vocabulary1:ActionNameVocab + "Sleep Process"^^vocabulary1:ActionNameVocab + "Sleep System"^^vocabulary1:ActionNameVocab + "Start Service"^^vocabulary1:ActionNameVocab + "Unload Driver"^^vocabulary1:ActionNameVocab + "Unload Module"^^vocabulary1:ActionNameVocab + "Unlock File"^^vocabulary1:ActionNameVocab + "Unmap File"^^vocabulary1:ActionNameVocab + "Upload File"^^vocabulary1:ActionNameVocab + "Write to File"^^vocabulary1:ActionNameVocab + "Write to Process Virtual Memory"^^vocabulary1:ActionNameVocab + ) ; + . + +vocabulary1:ActionRelationshipTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Action Relationship Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary for capturing types of relationships between actions."@en-US ; + owl:oneOf ( + "Dependent_On"^^vocabulary1:ActionRelationshipTypeVocab + "Equivalent_To"^^vocabulary1:ActionRelationshipTypeVocab + "Followed_By"^^vocabulary1:ActionRelationshipTypeVocab + "Initiated"^^vocabulary1:ActionRelationshipTypeVocab + "Initiated_By"^^vocabulary1:ActionRelationshipTypeVocab + "Preceded_By"^^vocabulary1:ActionRelationshipTypeVocab + "Related_To"^^vocabulary1:ActionRelationshipTypeVocab + ) ; + . + +vocabulary1:ActionStatusTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Action Status Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of action status types."@en-US ; + owl:oneOf ( + "Complete/Finish"^^vocabulary1:ActionStatusTypeVocab + "Error"^^vocabulary1:ActionStatusTypeVocab + "Fail"^^vocabulary1:ActionStatusTypeVocab + "Ongoing"^^vocabulary1:ActionStatusTypeVocab + "Pending"^^vocabulary1:ActionStatusTypeVocab + "Success"^^vocabulary1:ActionStatusTypeVocab + "Unknown"^^vocabulary1:ActionStatusTypeVocab + ) ; + . + +vocabulary1:ActionTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Action Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of common general action types."@en ; + owl:oneOf ( + "Accept"^^vocabulary1:ActionTypeVocab + "Access"^^vocabulary1:ActionTypeVocab + "Add"^^vocabulary1:ActionTypeVocab + "Alert"^^vocabulary1:ActionTypeVocab + "Allocate"^^vocabulary1:ActionTypeVocab + "Archive"^^vocabulary1:ActionTypeVocab + "Assign"^^vocabulary1:ActionTypeVocab + "Audit"^^vocabulary1:ActionTypeVocab + "Backup"^^vocabulary1:ActionTypeVocab + "Bind"^^vocabulary1:ActionTypeVocab + "Block"^^vocabulary1:ActionTypeVocab + "Call"^^vocabulary1:ActionTypeVocab + "Change"^^vocabulary1:ActionTypeVocab + "Check"^^vocabulary1:ActionTypeVocab + "Clean"^^vocabulary1:ActionTypeVocab + "Click"^^vocabulary1:ActionTypeVocab + "Close"^^vocabulary1:ActionTypeVocab + "Compare"^^vocabulary1:ActionTypeVocab + "Compress"^^vocabulary1:ActionTypeVocab + "Configure"^^vocabulary1:ActionTypeVocab + "Connect"^^vocabulary1:ActionTypeVocab + "Control"^^vocabulary1:ActionTypeVocab + "Copy/Duplicate"^^vocabulary1:ActionTypeVocab + "Create"^^vocabulary1:ActionTypeVocab + "Decode"^^vocabulary1:ActionTypeVocab + "Decompress"^^vocabulary1:ActionTypeVocab + "Decrypt"^^vocabulary1:ActionTypeVocab + "Deny"^^vocabulary1:ActionTypeVocab + "Depress"^^vocabulary1:ActionTypeVocab + "Detect"^^vocabulary1:ActionTypeVocab + "Disconnect"^^vocabulary1:ActionTypeVocab + "Download"^^vocabulary1:ActionTypeVocab + "Draw"^^vocabulary1:ActionTypeVocab + "Drop"^^vocabulary1:ActionTypeVocab + "Encode"^^vocabulary1:ActionTypeVocab + "Encrypt"^^vocabulary1:ActionTypeVocab + "Enumerate"^^vocabulary1:ActionTypeVocab + "Execute"^^vocabulary1:ActionTypeVocab + "Extract"^^vocabulary1:ActionTypeVocab + "Filter"^^vocabulary1:ActionTypeVocab + "Find"^^vocabulary1:ActionTypeVocab + "Flush"^^vocabulary1:ActionTypeVocab + "Fork"^^vocabulary1:ActionTypeVocab + "Free"^^vocabulary1:ActionTypeVocab + "Get"^^vocabulary1:ActionTypeVocab + "Hide"^^vocabulary1:ActionTypeVocab + "Hook"^^vocabulary1:ActionTypeVocab + "Impersonate"^^vocabulary1:ActionTypeVocab + "Initialize"^^vocabulary1:ActionTypeVocab + "Inject"^^vocabulary1:ActionTypeVocab + "Install"^^vocabulary1:ActionTypeVocab + "Interleave"^^vocabulary1:ActionTypeVocab + "Join"^^vocabulary1:ActionTypeVocab + "Kill"^^vocabulary1:ActionTypeVocab + "Listen"^^vocabulary1:ActionTypeVocab + "Load"^^vocabulary1:ActionTypeVocab + "Lock"^^vocabulary1:ActionTypeVocab + "Login/Logon"^^vocabulary1:ActionTypeVocab + "Logout/Logoff"^^vocabulary1:ActionTypeVocab + "Map"^^vocabulary1:ActionTypeVocab + "Merge"^^vocabulary1:ActionTypeVocab + "Modify"^^vocabulary1:ActionTypeVocab + "Monitor"^^vocabulary1:ActionTypeVocab + "Move"^^vocabulary1:ActionTypeVocab + "Open"^^vocabulary1:ActionTypeVocab + "Pack"^^vocabulary1:ActionTypeVocab + "Pause"^^vocabulary1:ActionTypeVocab + "Press"^^vocabulary1:ActionTypeVocab + "Protect"^^vocabulary1:ActionTypeVocab + "Quarantine"^^vocabulary1:ActionTypeVocab + "Query"^^vocabulary1:ActionTypeVocab + "Queue"^^vocabulary1:ActionTypeVocab + "Raise"^^vocabulary1:ActionTypeVocab + "Read"^^vocabulary1:ActionTypeVocab + "Receive"^^vocabulary1:ActionTypeVocab + "Release"^^vocabulary1:ActionTypeVocab + "Remove/Delete"^^vocabulary1:ActionTypeVocab + "Rename"^^vocabulary1:ActionTypeVocab + "Replicate"^^vocabulary1:ActionTypeVocab + "Restore"^^vocabulary1:ActionTypeVocab + "Resume"^^vocabulary1:ActionTypeVocab + "Revert"^^vocabulary1:ActionTypeVocab + "Run"^^vocabulary1:ActionTypeVocab + "Save"^^vocabulary1:ActionTypeVocab + "Scan"^^vocabulary1:ActionTypeVocab + "Schedule"^^vocabulary1:ActionTypeVocab + "Search"^^vocabulary1:ActionTypeVocab + "Send"^^vocabulary1:ActionTypeVocab + "Set"^^vocabulary1:ActionTypeVocab + "Shutdown"^^vocabulary1:ActionTypeVocab + "Sleep"^^vocabulary1:ActionTypeVocab + "Snapshot"^^vocabulary1:ActionTypeVocab + "Start"^^vocabulary1:ActionTypeVocab + "Stop"^^vocabulary1:ActionTypeVocab + "Suspend"^^vocabulary1:ActionTypeVocab + "Synchronize"^^vocabulary1:ActionTypeVocab + "Throw"^^vocabulary1:ActionTypeVocab + "Transmit"^^vocabulary1:ActionTypeVocab + "Unblock"^^vocabulary1:ActionTypeVocab + "Unhide"^^vocabulary1:ActionTypeVocab + "Unhook"^^vocabulary1:ActionTypeVocab + "Uninstall"^^vocabulary1:ActionTypeVocab + "Unload"^^vocabulary1:ActionTypeVocab + "Unlock"^^vocabulary1:ActionTypeVocab + "Unmap"^^vocabulary1:ActionTypeVocab + "Unpack"^^vocabulary1:ActionTypeVocab + "Update"^^vocabulary1:ActionTypeVocab + "Upgrade"^^vocabulary1:ActionTypeVocab + "Upload"^^vocabulary1:ActionTypeVocab + "Wipe/Destroy/Purge"^^vocabulary1:ActionTypeVocab + "Write"^^vocabulary1:ActionTypeVocab + ) ; + . + +vocabulary1:BitnessVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Bitness Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of word sizes that define classes of operating systems."@en ; + owl:oneOf ( + "32"^^vocabulary1:BitnessVocab + "64"^^vocabulary1:BitnessVocab + ) ; + . + +vocabulary1:CharacterEncodingVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Character Encoding Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of character encodings."@en ; + owl:oneOf ( + "ASCII"^^vocabulary1:CharacterEncodingVocab + "UTF-16"^^vocabulary1:CharacterEncodingVocab + "UTF-32"^^vocabulary1:CharacterEncodingVocab + "UTF-8"^^vocabulary1:CharacterEncodingVocab + "Windows-1250"^^vocabulary1:CharacterEncodingVocab + "Windows-1251"^^vocabulary1:CharacterEncodingVocab + "Windows-1252"^^vocabulary1:CharacterEncodingVocab + "Windows-1253"^^vocabulary1:CharacterEncodingVocab + "Windows-1254"^^vocabulary1:CharacterEncodingVocab + "Windows-1255"^^vocabulary1:CharacterEncodingVocab + "Windows-1256"^^vocabulary1:CharacterEncodingVocab + "Windows-1257"^^vocabulary1:CharacterEncodingVocab + "Windows-1258"^^vocabulary1:CharacterEncodingVocab + ) ; + . + +vocabulary1:ContactAddressScopeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Contact Address Scope Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of scopes for address entries of digital contacts."@en ; + owl:oneOf ( + "home"^^vocabulary1:ContactAddressScopeVocab + "work"^^vocabulary1:ContactAddressScopeVocab + "school"^^vocabulary1:ContactAddressScopeVocab + ) ; + . + +vocabulary1:ContactEmailScopeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Contact Email Scope Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of scopes for email entries of digital contacts."@en ; + owl:oneOf ( + "home"^^vocabulary1:ContactAddressScopeVocab + "work"^^vocabulary1:ContactAddressScopeVocab + "school"^^vocabulary1:ContactAddressScopeVocab + "cloud"^^vocabulary1:ContactAddressScopeVocab + ) ; + . + +vocabulary1:ContactPhoneScopeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Contact Phone Scope Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of scopes for phone entries of digital contacts."@en ; + owl:oneOf ( + "home"^^vocabulary1:ContactAddressScopeVocab + "work"^^vocabulary1:ContactAddressScopeVocab + "school"^^vocabulary1:ContactAddressScopeVocab + "mobile"^^vocabulary1:ContactAddressScopeVocab + "main"^^vocabulary1:ContactAddressScopeVocab + "home fax"^^vocabulary1:ContactAddressScopeVocab + "work fax"^^vocabulary1:ContactAddressScopeVocab + "pager"^^vocabulary1:ContactAddressScopeVocab + ) ; + . + +vocabulary1:ContactSIPScopeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Contact SIP Scope Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of scopes for Session Initiation Protocol (SIP) entries of digital contacts."@en ; + owl:oneOf ( + "home"^^vocabulary1:ContactAddressScopeVocab + "work"^^vocabulary1:ContactAddressScopeVocab + "school"^^vocabulary1:ContactAddressScopeVocab + ) ; + . + +vocabulary1:ContactURLScopeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Contact URL Scope Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of scopes for URL entries of digital contacts."@en ; + owl:oneOf ( + "home"^^vocabulary1:ContactAddressScopeVocab + "work"^^vocabulary1:ContactAddressScopeVocab + "school"^^vocabulary1:ContactAddressScopeVocab + "homepage"^^vocabulary1:ContactAddressScopeVocab + ) ; + . + +vocabulary1:DiskTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Disk Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of disk types."@en ; + owl:oneOf ( + "CDRom"^^vocabulary1:DiskTypeVocab + "Fixed"^^vocabulary1:DiskTypeVocab + "RAMDisk"^^vocabulary1:DiskTypeVocab + "Remote"^^vocabulary1:DiskTypeVocab + "Removable"^^vocabulary1:DiskTypeVocab + ) ; + . + +vocabulary1:EndiannessTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Endianness Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of byte ordering methods."@en ; + owl:oneOf ( + "Big-endian"^^vocabulary1:EndiannessTypeVocab + "Little-endian"^^vocabulary1:EndiannessTypeVocab + "Middle-endian"^^vocabulary1:EndiannessTypeVocab + ) ; + . + +vocabulary1:HashNameVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Hash Name Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of hashing algorithm names."@en-US ; + owl:oneOf ( + "MD5"^^vocabulary1:HashNameVocab + "MD6"^^vocabulary1:HashNameVocab + "SHA1"^^vocabulary1:HashNameVocab + "SHA224"^^vocabulary1:HashNameVocab + "SHA256"^^vocabulary1:HashNameVocab + "SHA384"^^vocabulary1:HashNameVocab + "SHA512"^^vocabulary1:HashNameVocab + "SSDEEP"^^vocabulary1:HashNameVocab + ) ; + . + +vocabulary1:LibraryTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Library Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of library types."@en ; + owl:oneOf ( + "Dynamic"^^vocabulary1:LibraryTypeVocab + "Other"^^vocabulary1:LibraryTypeVocab + "Remote"^^vocabulary1:LibraryTypeVocab + "Shared"^^vocabulary1:LibraryTypeVocab + "Static"^^vocabulary1:LibraryTypeVocab + ) ; + . + +vocabulary1:MemoryBlockTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Memory Block Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of types of memory blocks."@en ; + owl:oneOf ( + "Bit-mapped"^^vocabulary1:MemoryBlockTypeVocab + "Byte-mapped"^^vocabulary1:MemoryBlockTypeVocab + "Initialized"^^vocabulary1:MemoryBlockTypeVocab + "Overlay"^^vocabulary1:MemoryBlockTypeVocab + "Uninitialized"^^vocabulary1:MemoryBlockTypeVocab + ) ; + . + +vocabulary1:ObservableObjectRelationshipVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Cyber Item Relationship Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of inter-observable object relationships."@en ; + owl:oneOf ( + "Allocated"^^vocabulary1:ObservableObjectRelationshipVocab + "Allocated_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Bound"^^vocabulary1:ObservableObjectRelationshipVocab + "Bound_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Characterized_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Characterizes"^^vocabulary1:ObservableObjectRelationshipVocab + "Child_Of"^^vocabulary1:ObservableObjectRelationshipVocab + "Closed"^^vocabulary1:ObservableObjectRelationshipVocab + "Closed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Compressed"^^vocabulary1:ObservableObjectRelationshipVocab + "Compressed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Compressed_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Compressed_Into"^^vocabulary1:ObservableObjectRelationshipVocab + "Connected_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Connected_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Contained_Within"^^vocabulary1:ObservableObjectRelationshipVocab + "Contains"^^vocabulary1:ObservableObjectRelationshipVocab + "Copied"^^vocabulary1:ObservableObjectRelationshipVocab + "Copied_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Copied_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Copied_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Created"^^vocabulary1:ObservableObjectRelationshipVocab + "Created_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Decoded"^^vocabulary1:ObservableObjectRelationshipVocab + "Decoded_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Decompressed"^^vocabulary1:ObservableObjectRelationshipVocab + "Decompressed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Decrypted"^^vocabulary1:ObservableObjectRelationshipVocab + "Decrypted_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Deleted"^^vocabulary1:ObservableObjectRelationshipVocab + "Deleted_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Deleted_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Downloaded"^^vocabulary1:ObservableObjectRelationshipVocab + "Downloaded_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Downloaded_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Downloaded_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Dropped"^^vocabulary1:ObservableObjectRelationshipVocab + "Dropped_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Encoded"^^vocabulary1:ObservableObjectRelationshipVocab + "Encoded_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Encrypted"^^vocabulary1:ObservableObjectRelationshipVocab + "Encrypted_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Encrypted_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Encrypted_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Extracted_From"^^vocabulary1:ObservableObjectRelationshipVocab + "FQDN_Of"^^vocabulary1:ObservableObjectRelationshipVocab + "Freed"^^vocabulary1:ObservableObjectRelationshipVocab + "Freed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Hooked"^^vocabulary1:ObservableObjectRelationshipVocab + "Hooked_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Initialized_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Initialized_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Injected"^^vocabulary1:ObservableObjectRelationshipVocab + "Injected_As"^^vocabulary1:ObservableObjectRelationshipVocab + "Injected_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Injected_Into"^^vocabulary1:ObservableObjectRelationshipVocab + "Installed"^^vocabulary1:ObservableObjectRelationshipVocab + "Installed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Joined"^^vocabulary1:ObservableObjectRelationshipVocab + "Joined_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Killed"^^vocabulary1:ObservableObjectRelationshipVocab + "Killed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Listened_On"^^vocabulary1:ObservableObjectRelationshipVocab + "Listened_On_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Loaded_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Loaded_Into"^^vocabulary1:ObservableObjectRelationshipVocab + "Locked"^^vocabulary1:ObservableObjectRelationshipVocab + "Locked_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Mapped_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Mapped_Into"^^vocabulary1:ObservableObjectRelationshipVocab + "Merged"^^vocabulary1:ObservableObjectRelationshipVocab + "Merged_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Modified_Properties_Of"^^vocabulary1:ObservableObjectRelationshipVocab + "Monitored"^^vocabulary1:ObservableObjectRelationshipVocab + "Monitored_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Moved"^^vocabulary1:ObservableObjectRelationshipVocab + "Moved_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Moved_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Moved_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Opened"^^vocabulary1:ObservableObjectRelationshipVocab + "Opened_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Packed"^^vocabulary1:ObservableObjectRelationshipVocab + "Packed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Packed_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Packed_Into"^^vocabulary1:ObservableObjectRelationshipVocab + "Parent_Of"^^vocabulary1:ObservableObjectRelationshipVocab + "Paused"^^vocabulary1:ObservableObjectRelationshipVocab + "Paused_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Previously_Contained"^^vocabulary1:ObservableObjectRelationshipVocab + "Properties_Modified_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Properties_Queried"^^vocabulary1:ObservableObjectRelationshipVocab + "Properties_Queried_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Read_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Read_From_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Received"^^vocabulary1:ObservableObjectRelationshipVocab + "Received_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Received_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Received_Via_Upload"^^vocabulary1:ObservableObjectRelationshipVocab + "Redirects_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Related_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Renamed"^^vocabulary1:ObservableObjectRelationshipVocab + "Renamed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Renamed_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Renamed_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Resolved_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Resumed"^^vocabulary1:ObservableObjectRelationshipVocab + "Resumed_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Root_Domain_Of"^^vocabulary1:ObservableObjectRelationshipVocab + "Searched_For"^^vocabulary1:ObservableObjectRelationshipVocab + "Searched_For_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Sent"^^vocabulary1:ObservableObjectRelationshipVocab + "Sent_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Sent_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Sent_Via_Upload"^^vocabulary1:ObservableObjectRelationshipVocab + "Set_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Set_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Sub-domain_Of"^^vocabulary1:ObservableObjectRelationshipVocab + "Supra-domain_Of"^^vocabulary1:ObservableObjectRelationshipVocab + "Suspended"^^vocabulary1:ObservableObjectRelationshipVocab + "Suspended_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Unhooked"^^vocabulary1:ObservableObjectRelationshipVocab + "Unhooked_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Unlocked"^^vocabulary1:ObservableObjectRelationshipVocab + "Unlocked_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Unpacked"^^vocabulary1:ObservableObjectRelationshipVocab + "Unpacked_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Uploaded"^^vocabulary1:ObservableObjectRelationshipVocab + "Uploaded_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Uploaded_From"^^vocabulary1:ObservableObjectRelationshipVocab + "Uploaded_To"^^vocabulary1:ObservableObjectRelationshipVocab + "Used"^^vocabulary1:ObservableObjectRelationshipVocab + "Used_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Values_Enumerated"^^vocabulary1:ObservableObjectRelationshipVocab + "Values_Enumerated_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Written_To_By"^^vocabulary1:ObservableObjectRelationshipVocab + "Wrote_To"^^vocabulary1:ObservableObjectRelationshipVocab + ) ; + . + +vocabulary1:ObservableObjectStateVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Cyber Item State Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of observable object states."@en ; + owl:oneOf ( + "Active"^^vocabulary1:ObservableObjectStateVocab + "Closed"^^vocabulary1:ObservableObjectStateVocab + "Does Not Exist"^^vocabulary1:ObservableObjectStateVocab + "Exists"^^vocabulary1:ObservableObjectStateVocab + "Inactive"^^vocabulary1:ObservableObjectStateVocab + "Locked"^^vocabulary1:ObservableObjectStateVocab + "Open"^^vocabulary1:ObservableObjectStateVocab + "Started"^^vocabulary1:ObservableObjectStateVocab + "Stopped"^^vocabulary1:ObservableObjectStateVocab + "Unlocked"^^vocabulary1:ObservableObjectStateVocab + ) ; + . + +vocabulary1:PartitionTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Partition Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of partition types. See http://www.win.tue.nl/~aeb/partitions/partition_types-1.html for more information about the various partition types."@en ; + owl:oneOf ( + "PARTITION_ENTRY_UNUSED"^^vocabulary1:PartitionTypeVocab + "PARTITION_EXTENDED"^^vocabulary1:PartitionTypeVocab + "PARTITION_FAT32"^^vocabulary1:PartitionTypeVocab + "PARTITION_FAT32_XINT13"^^vocabulary1:PartitionTypeVocab + "PARTITION_FAT_12"^^vocabulary1:PartitionTypeVocab + "PARTITION_FAT_16"^^vocabulary1:PartitionTypeVocab + "PARTITION_HUGE"^^vocabulary1:PartitionTypeVocab + "PARTITION_IFS"^^vocabulary1:PartitionTypeVocab + "PARTITION_LDM"^^vocabulary1:PartitionTypeVocab + "PARTITION_NTFT"^^vocabulary1:PartitionTypeVocab + "PARTITION_OS2BOOTMGR"^^vocabulary1:PartitionTypeVocab + "PARTITION_PREP"^^vocabulary1:PartitionTypeVocab + "PARTITION_UNIX"^^vocabulary1:PartitionTypeVocab + "PARTITION_XENIX_1"^^vocabulary1:PartitionTypeVocab + "PARTITION_XENIX_2"^^vocabulary1:PartitionTypeVocab + "PARTITION_XINT13"^^vocabulary1:PartitionTypeVocab + "PARTITION_XINT13_EXTENDED"^^vocabulary1:PartitionTypeVocab + "UNKNOWN"^^vocabulary1:PartitionTypeVocab + "VALID_NTFT"^^vocabulary1:PartitionTypeVocab + ) ; + . + +vocabulary1:ProcessorArchVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Processor Architecture Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of computer processor architectures."@en ; + owl:oneOf ( + "ARM"^^vocabulary1:ProcessorArchVocab + "Alpha"^^vocabulary1:ProcessorArchVocab + "IA-64"^^vocabulary1:ProcessorArchVocab + "MIPS"^^vocabulary1:ProcessorArchVocab + "Motorola 68k"^^vocabulary1:ProcessorArchVocab + "Other"^^vocabulary1:ProcessorArchVocab + "PowerPC"^^vocabulary1:ProcessorArchVocab + "SPARC"^^vocabulary1:ProcessorArchVocab + "eSi-RISC"^^vocabulary1:ProcessorArchVocab + "x86-32"^^vocabulary1:ProcessorArchVocab + "x86-64"^^vocabulary1:ProcessorArchVocab + "z/Architecture"^^vocabulary1:ProcessorArchVocab + ) ; + . + +vocabulary1:RegionalRegistryTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Regional Registry Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of Regional Internet Registries (RIRs) names, represented via their respective acronyms."@en ; + owl:oneOf ( + "APNIC"^^vocabulary1:RegionalRegistryTypeVocab + "ARIN"^^vocabulary1:RegionalRegistryTypeVocab + "AfriNIC"^^vocabulary1:RegionalRegistryTypeVocab + "LACNIC"^^vocabulary1:RegionalRegistryTypeVocab + "RIPE NCC"^^vocabulary1:RegionalRegistryTypeVocab + ) ; + . + +vocabulary1:RegistryDatatypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Registry Datatype Vocabulary"@en-US ; + owl:oneOf ( + "reg_binary"^^vocabulary1:RegistryDatatypeVocab + "reg_dword"^^vocabulary1:RegistryDatatypeVocab + "reg_dword_big_endian"^^vocabulary1:RegistryDatatypeVocab + "reg_expand_sz"^^vocabulary1:RegistryDatatypeVocab + "reg_full_resource_descriptor"^^vocabulary1:RegistryDatatypeVocab + "reg_invalid_type"^^vocabulary1:RegistryDatatypeVocab + "reg_link"^^vocabulary1:RegistryDatatypeVocab + "reg_multi_sz"^^vocabulary1:RegistryDatatypeVocab + "reg_none"^^vocabulary1:RegistryDatatypeVocab + "reg_qword"^^vocabulary1:RegistryDatatypeVocab + "reg_resource_list"^^vocabulary1:RegistryDatatypeVocab + "reg_resource_requirements_list"^^vocabulary1:RegistryDatatypeVocab + "reg_sz"^^vocabulary1:RegistryDatatypeVocab + ) ; + . + +vocabulary1:SIMFormVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "SIM Form Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of common SIM card form factors."@en ; + owl:oneOf ( + "Full-size SIM"^^vocabulary1:SIMFormVocab + "Micro SIM"^^vocabulary1:SIMFormVocab + "Nano SIM"^^vocabulary1:SIMFormVocab + ) ; + . + +vocabulary1:SIMTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "SIM Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of common SIM card types."@en ; + owl:oneOf ( + "SIM"^^vocabulary1:SIMTypeVocab + "UICC"^^vocabulary1:SIMTypeVocab + "USIM"^^vocabulary1:SIMTypeVocab + ) ; + . + +vocabulary1:TaskActionTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Task Action Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of task action types. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380596(v=vs.85).aspx."@en ; + owl:oneOf ( + "TASK_ACTION_COM_HANDLER"^^vocabulary1:TaskActionTypeVocab + "TASK_ACTION_EXEC"^^vocabulary1:TaskActionTypeVocab + "TASK_ACTION_SEND_EMAIL"^^vocabulary1:TaskActionTypeVocab + "TASK_ACTION_SHOW_MESSAGE"^^vocabulary1:TaskActionTypeVocab + ) ; + . + +vocabulary1:TaskFlagVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Task Flag Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of the run flags for a task scheduler task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381283(v=vs.85).aspx See Also: http://msdn.microsoft.com/en-us/library/microsoft.office.excel.server.addins.computecluster.taskscheduler.taskflags(v=office.12).aspx."@en ; + owl:oneOf ( + "TASK_FLAG_DELETE_WHEN_DONE"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_DISABLED"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_DONT_START_IF_ON_BATTERIES"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_HIDDEN"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_INTERACTIVE"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_KILL_IF_GOING_ON_BATTERIES"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_KILL_ON_IDLE_END"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_RESTART_ON_IDLE_RESUME"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_RUN_IF_CONNECTED_TO_INTERNET"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_RUN_ONLY_IF_LOGGED_ON"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_START_ONLY_IF_IDLE"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_SYSTEM_REQUIRED"^^vocabulary1:TaskFlagVocab + "TASK_FLAG_ZERO"^^vocabulary1:TaskFlagVocab + ) ; + . + +vocabulary1:TaskPriorityVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Task Priority Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of the priority levels of task scheduler tasks. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383512(v=vs.85).aspx."@en ; + owl:oneOf ( + "ABOVE_NORMAL_PRIORITY_CLASS"^^vocabulary1:TaskPriorityVocab + "BELOW_NORMAL_PRIORITY_CLASS"^^vocabulary1:TaskPriorityVocab + "HIGH_PRIORITY_CLASS"^^vocabulary1:TaskPriorityVocab + "IDLE_PRIORITY_CLASS"^^vocabulary1:TaskPriorityVocab + "NORMAL_PRIORITY_CLASS"^^vocabulary1:TaskPriorityVocab + "REALTIME_PRIORITY_CLASS"^^vocabulary1:TaskPriorityVocab + ) ; + . + +vocabulary1:TaskStatusVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Task Status Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of the possible statuses of a scheduled task. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383604(v=vs.85).aspx See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381263(v=vs.85).aspx See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa381833(v=vs.85).aspx See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383617(v=vs.85).aspx."@en ; + owl:oneOf ( + "SCHED_E_ACCOUNT_DBASE_CORRUPT"^^vocabulary1:TaskStatusVocab + "SCHED_E_ACCOUNT_INFORMATION_NOT_SET"^^vocabulary1:TaskStatusVocab + "SCHED_E_ACCOUNT_NAME_NOT_FOUND"^^vocabulary1:TaskStatusVocab + "SCHED_E_CANNOT_OPEN_TASK"^^vocabulary1:TaskStatusVocab + "SCHED_E_INVALID_TASK"^^vocabulary1:TaskStatusVocab + "SCHED_E_NO_SECURITY_SERVICES"^^vocabulary1:TaskStatusVocab + "SCHED_E_SERVICE_NOT_INSTALLED"^^vocabulary1:TaskStatusVocab + "SCHED_E_SERVICE_NOT_RUNNING"^^vocabulary1:TaskStatusVocab + "SCHED_E_TASK_NOT_READY"^^vocabulary1:TaskStatusVocab + "SCHED_E_TASK_NOT_RUNNING"^^vocabulary1:TaskStatusVocab + "SCHED_E_TRIGGER_NOT_FOUND"^^vocabulary1:TaskStatusVocab + "SCHED_E_UNKNOWN_OBJECT_VERSION"^^vocabulary1:TaskStatusVocab + "SCHED_E_UNSUPPORTED_ACCOUNT_OPTION"^^vocabulary1:TaskStatusVocab + "SCHED_S_EVENT_TRIGGER"^^vocabulary1:TaskStatusVocab + "SCHED_S_TASK_DISABLED"^^vocabulary1:TaskStatusVocab + "SCHED_S_TASK_HAS_NOT_RUN"^^vocabulary1:TaskStatusVocab + "SCHED_S_TASK_NOT_SCHEDULED"^^vocabulary1:TaskStatusVocab + "SCHED_S_TASK_NO_MORE_RUNS"^^vocabulary1:TaskStatusVocab + "SCHED_S_TASK_NO_VALID_TRIGGERS"^^vocabulary1:TaskStatusVocab + "SCHED_S_TASK_READY"^^vocabulary1:TaskStatusVocab + "SCHED_S_TASK_RUNNING"^^vocabulary1:TaskStatusVocab + "SCHED_S_TASK_TERMINATED"^^vocabulary1:TaskStatusVocab + "TASK_STATE_QUEUED"^^vocabulary1:TaskStatusVocab + "TASK_STATE_UNKNOWN"^^vocabulary1:TaskStatusVocab + ) ; + . + +vocabulary1:ThreadRunningStatusVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Thread Running Status Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of the various states that a thread may be in before, during, or after execution. See http://msdn.microsoft.com/en-us/library/system.diagnostics.threadstate(v=vs.110).aspx."@en ; + owl:oneOf ( + "Initialized"^^vocabulary1:ThreadRunningStatusVocab + "Ready"^^vocabulary1:ThreadRunningStatusVocab + "Running"^^vocabulary1:ThreadRunningStatusVocab + "Standby"^^vocabulary1:ThreadRunningStatusVocab + "Terminated"^^vocabulary1:ThreadRunningStatusVocab + "Transition"^^vocabulary1:ThreadRunningStatusVocab + "Unknown"^^vocabulary1:ThreadRunningStatusVocab + "Waiting"^^vocabulary1:ThreadRunningStatusVocab + ) ; + . + +vocabulary1:TimestampPrecisionVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Timestamp Precision Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of timestamp precision granularities."@en-US ; + owl:oneOf ( + "day"^^vocabulary1:TimestampPrecisionVocab + "hour"^^vocabulary1:TimestampPrecisionVocab + "minute"^^vocabulary1:TimestampPrecisionVocab + "month"^^vocabulary1:TimestampPrecisionVocab + "second"^^vocabulary1:TimestampPrecisionVocab + "year"^^vocabulary1:TimestampPrecisionVocab + ) ; + . + +vocabulary1:TrendVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Trend Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of trend values."@en-US ; + owl:oneOf ( + "Decreasing"^^vocabulary1:TrendVocab + "Increasing"^^vocabulary1:TrendVocab + ) ; + . + +vocabulary1:TriggerFrequencyVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Trigger Frequency Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of the frequency types that a trigger may use. See also: http://msdn.microsoft.com/en-us/library/windows/desktop/aa383620(v=vs.85).aspx and http://msdn.microsoft.com/en-us/library/windows/desktop/aa383987(v=vs.85).aspx."@en ; + owl:oneOf ( + "TASK_EVENT_TRIGGER_AT_LOGON"^^vocabulary1:TriggerFrequencyVocab + "TASK_EVENT_TRIGGER_AT_SYSTEMSTART"^^vocabulary1:TriggerFrequencyVocab + "TASK_EVENT_TRIGGER_ON_IDLE"^^vocabulary1:TriggerFrequencyVocab + "TASK_TIME_TRIGGER_DAILY"^^vocabulary1:TriggerFrequencyVocab + "TASK_TIME_TRIGGER_MONTHLYDATE"^^vocabulary1:TriggerFrequencyVocab + "TASK_TIME_TRIGGER_MONTHLYDOW"^^vocabulary1:TriggerFrequencyVocab + "TASK_TIME_TRIGGER_ONCE"^^vocabulary1:TriggerFrequencyVocab + "TASK_TIME_TRIGGER_WEEKLY"^^vocabulary1:TriggerFrequencyVocab + ) ; + . + +vocabulary1:TriggerTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Trigger Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of the types of triggers associated with a task."@en ; + owl:oneOf ( + "TASK_TRIGGER_BOOT"^^vocabulary1:TriggerTypeVocab + "TASK_TRIGGER_EVENT"^^vocabulary1:TriggerTypeVocab + "TASK_TRIGGER_IDLE"^^vocabulary1:TriggerTypeVocab + "TASK_TRIGGER_LOGON"^^vocabulary1:TriggerTypeVocab + "TASK_TRIGGER_REGISTRATION"^^vocabulary1:TriggerTypeVocab + "TASK_TRIGGER_SESSION_STATE_CHANGE"^^vocabulary1:TriggerTypeVocab + "TASK_TRIGGER_TIME"^^vocabulary1:TriggerTypeVocab + ) ; + . + +vocabulary1:URLTransitionTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "URL Transition Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of types of URL transitions."@en ; + owl:oneOf ( + "link"^^vocabulary1:URLTransitionTypeVocab + "typed"^^vocabulary1:URLTransitionTypeVocab + "auto_bookmark"^^vocabulary1:URLTransitionTypeVocab + "auto_subframe"^^vocabulary1:URLTransitionTypeVocab + "manual_subframe"^^vocabulary1:URLTransitionTypeVocab + "generated"^^vocabulary1:URLTransitionTypeVocab + "auto_toplevel"^^vocabulary1:URLTransitionTypeVocab + "form_submit"^^vocabulary1:URLTransitionTypeVocab + "reload"^^vocabulary1:URLTransitionTypeVocab + "keyword"^^vocabulary1:URLTransitionTypeVocab + "keyword_generated"^^vocabulary1:URLTransitionTypeVocab + ) ; + . + +vocabulary1:UnixProcessStateVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "UNIX Process State Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of Unix process states"@en ; + owl:oneOf ( + "Dead"^^vocabulary1:UnixProcessStateVocab + "InterruptibleSleep"^^vocabulary1:UnixProcessStateVocab + "Paging"^^vocabulary1:UnixProcessStateVocab + "Running"^^vocabulary1:UnixProcessStateVocab + "Stopped"^^vocabulary1:UnixProcessStateVocab + "UninterruptibleSleep"^^vocabulary1:UnixProcessStateVocab + "Zombie"^^vocabulary1:UnixProcessStateVocab + ) ; + . + +vocabulary1:WhoisContactTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Whois Contact Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of types of registrar contacts listed in a whois entry."@en ; + owl:oneOf ( + "ADMIN"^^vocabulary1:WhoisContactTypeVocab + "BILLING"^^vocabulary1:WhoisContactTypeVocab + "TECHNICAL"^^vocabulary1:WhoisContactTypeVocab + ) ; + . + +vocabulary1:WhoisDNSSECTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Whois DNSSEC Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of acceptable values for the DNSSEC field in a Whois entry."@en ; + owl:oneOf ( + "Signed"^^vocabulary1:WhoisDNSSECTypeVocab + "Unsigned"^^vocabulary1:WhoisDNSSECTypeVocab + ) ; + . + +vocabulary1:WhoisStatusTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Whois Status Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of all valid statuses for a domain within a whois entry."@en ; + owl:oneOf ( + "ADD_PERIOD"^^vocabulary1:WhoisStatusTypeVocab + "AUTO_RENEW_PERIOD"^^vocabulary1:WhoisStatusTypeVocab + "CLIENT_DELETE_PROHIBITED"^^vocabulary1:WhoisStatusTypeVocab + "CLIENT_HOLD"^^vocabulary1:WhoisStatusTypeVocab + "CLIENT_RENEW_PROHIBITED"^^vocabulary1:WhoisStatusTypeVocab + "CLIENT_TRANSFER_PROHIBITED"^^vocabulary1:WhoisStatusTypeVocab + "CLIENT_UPDATE_PROHIBITED"^^vocabulary1:WhoisStatusTypeVocab + "DELETE_PROHIBITED"^^vocabulary1:WhoisStatusTypeVocab + "HOLD"^^vocabulary1:WhoisStatusTypeVocab + "INACTIVE"^^vocabulary1:WhoisStatusTypeVocab + "OK"^^vocabulary1:WhoisStatusTypeVocab + "PENDING_DELETE_RESTORABLE"^^vocabulary1:WhoisStatusTypeVocab + "PENDING_DELETE_SCHEDULED_FOR_RELEASE"^^vocabulary1:WhoisStatusTypeVocab + "PENDING_RESTORE"^^vocabulary1:WhoisStatusTypeVocab + "RENEW_PERIOD"^^vocabulary1:WhoisStatusTypeVocab + "RENEW_PROHIBITED"^^vocabulary1:WhoisStatusTypeVocab + "TRANSFER_PERIOD"^^vocabulary1:WhoisStatusTypeVocab + "TRANSFER_PROHIBITED"^^vocabulary1:WhoisStatusTypeVocab + "UPDATE_PROHIBITED"^^vocabulary1:WhoisStatusTypeVocab + ) ; + . + +vocabulary1:WindowsDriveTypeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Windows Drive Type Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of possible drive types, as enumerated by the WINAPI GetDriveType function: http://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx."@en ; + owl:oneOf ( + "DRIVE_CDROM"^^vocabulary1:WindowsDriveTypeVocab + "DRIVE_FIXED"^^vocabulary1:WindowsDriveTypeVocab + "DRIVE_NO_ROOT_DIR"^^vocabulary1:WindowsDriveTypeVocab + "DRIVE_RAMDISK"^^vocabulary1:WindowsDriveTypeVocab + "DRIVE_REMOTE"^^vocabulary1:WindowsDriveTypeVocab + "DRIVE_REMOVABLE"^^vocabulary1:WindowsDriveTypeVocab + "DRIVE_UNKNOWN"^^vocabulary1:WindowsDriveTypeVocab + ) ; + . + +vocabulary1:WindowsVolumeAttributeVocab + a rdfs:Datatype ; + rdfs:subClassOf rdfs:Resource ; + rdfs:label "Windows Volume Attribute Vocabulary"@en-US ; + rdfs:comment "Defines an open-vocabulary of attributes that may be returned by the diskpart attributes command: http://technet.microsoft.com/en-us/library/cc766465(v=ws.10).aspx."@en ; + owl:oneOf ( + "Hidden"^^vocabulary1:WindowsVolumeAttributeVocab + "NoDefaultDriveLetter"^^vocabulary1:WindowsVolumeAttributeVocab + "ReadOnly"^^vocabulary1:WindowsVolumeAttributeVocab + "ShadowCopy"^^vocabulary1:WindowsVolumeAttributeVocab + ) ; + . + From e824307dbeb8fd39113d1ed5f0c383241c013fc6 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 28 Oct 2021 18:56:42 -0400 Subject: [PATCH 21/49] Add tests to confirm hard-coded version information against ontology References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- .../case_utils/ontology/test_version_info.py | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tests/case_utils/ontology/test_version_info.py diff --git a/tests/case_utils/ontology/test_version_info.py b/tests/case_utils/ontology/test_version_info.py new file mode 100644 index 0000000..ebf58a8 --- /dev/null +++ b/tests/case_utils/ontology/test_version_info.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +# 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. + +import importlib.resources +import pathlib +import typing + +import rdflib # type: ignore + +import case_utils.ontology + +from case_utils.ontology.version_info import * + +NS_OWL = rdflib.OWL + +def test_case_ontology_version_info_versus_monolithic() -> None: + ontology_graph = rdflib.Graph() + + ttl_filename = "case-" + CURRENT_CASE_VERSION + ".ttl" + ttl_data = importlib.resources.read_text(case_utils.ontology, ttl_filename) + ontology_graph.parse(data=ttl_data) + + version_info : typing.Optional[str] = None + for triple in ontology_graph.triples(( + rdflib.URIRef("https://ontology.caseontology.org/case/case"), + NS_OWL.versionInfo, + None + )): + version_info = str(triple[2]) + assert not version_info is None, "Failed to retrieve owl:versionInfo" + + assert CURRENT_CASE_VERSION == version_info, "Version recorded in case_utils.ontology.version_info does not match built ontology" + +def test_case_ontology_version_info_versus_submodule() -> None: + ontology_graph = rdflib.Graph() + + top_srcdir = pathlib.Path(__file__).parent / ".." / ".." / ".." + assert (top_srcdir / ".gitmodules").exists(), "Hard-coded path to top_srcdir no longer correct" + + ttl_filepath = top_srcdir / "dependencies" / "CASE" / "ontology" / "master" / "case.ttl" + + ontology_graph.parse(str(ttl_filepath)) + + version_info : typing.Optional[str] = None + for triple in ontology_graph.triples(( + rdflib.URIRef("https://ontology.caseontology.org/case/case"), + NS_OWL.versionInfo, + None + )): + version_info = str(triple[2]) + assert not version_info is None, "Failed to retrieve owl:versionInfo" + + assert CURRENT_CASE_VERSION == version_info, "Version recorded in case_utils.ontology.version_info does not match tracked ontology" From e1135a71472eedb7c23dd7c87f787ba61c37e507 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 28 Oct 2021 19:07:35 -0400 Subject: [PATCH 22/49] Add case_validate The first tests to confirm `case_validate` functionality are reproduction of the CASE and UCO ontology repositories' `pyshacl` test results. References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- README.md | 27 ++++ case_utils/case_validate/__init__.py | 151 ++++++++++++++++++ setup.cfg | 2 + tests/case_utils/Makefile | 26 ++- tests/case_utils/case_validate/Makefile | 58 +++++++ tests/case_utils/case_validate/README.md | 1 + .../case_validate/case_test_examples/Makefile | 76 +++++++++ .../test_case_validation.py | 1 + .../case_validate/uco_test_examples/Makefile | 84 ++++++++++ .../uco_test_examples/test_uco_validation.py | 1 + 10 files changed, 423 insertions(+), 4 deletions(-) create mode 100644 case_utils/case_validate/__init__.py create mode 100644 tests/case_utils/case_validate/Makefile create mode 100644 tests/case_utils/case_validate/README.md create mode 100644 tests/case_utils/case_validate/case_test_examples/Makefile create mode 120000 tests/case_utils/case_validate/case_test_examples/test_case_validation.py create mode 100644 tests/case_utils/case_validate/uco_test_examples/Makefile create mode 120000 tests/case_utils/case_validate/uco_test_examples/test_uco_validation.py diff --git a/README.md b/README.md index 370b29d..2f6a171 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,33 @@ Installation is demonstrated in the `.venv.done.log` target of the [`tests/`](te ## Usage +### `case_validate` + +This repository provides `case_validate` as an adaptation of the `pyshacl` command from [RDFLib's pySHACL](https://github.com/RDFLib/pySHACL). The command-line interface is adapted to run as though `pyshacl` were provided the full CASE ontology (and adopted full UCO ontology) as both a shapes and ontology graph. "Compiled" (or, "aggregated") CASE ontologies are in the [`case_utils/ontology/`](case_utils/ontology/) directory, and are installed with `pip`, so data validation can occur without requiring networking after this repository is installed. + +To see a human-readable validation report of an instance-data file: + +```bash +case_validate input.json +``` + +If `input.json` is not conformant, a report will be emitted, and `case_validate` will exit with status `1`. (This is a `pyshacl` behavior, where `0` and `1` report validation success. Status of >`1` is for other errors.) + +To produce the validation report as a machine-readable graph output, the `--format` flag can be used to modify the output format: + +```bash +case_validate --format turtle input.json > result.ttl +``` + +To use one or more supplementary ontology files, the `--ontology-graph` flag can be used, more than once if desired, to supplement the selected CASE version: + +```bash +case_validate --ontology-graph internal_ontology.ttl --ontology-graph experimental_shapes.ttl input.json +``` + +Other flags are reviewable with `case_validate --help`. + + ### `case_file` To characterize a file, including hashes: diff --git a/case_utils/case_validate/__init__.py b/case_utils/case_validate/__init__.py new file mode 100644 index 0000000..8aea35b --- /dev/null +++ b/case_utils/case_validate/__init__.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 + +# 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. + +__version__ = "0.1.0" + +import argparse +import importlib.resources +import logging +import os +import pathlib +import sys +import typing + +import rdflib # type: ignore +import pyshacl # type: ignore + +import case_utils.ontology + +from case_utils.ontology.version_info import * + +_logger = logging.getLogger(os.path.basename(__file__)) + +def main() -> None: + parser = argparse.ArgumentParser(description="CASE wrapper to PySHACL command line tool.") + + # Configure debug logging before running parse_args, because there could be an error raised before the construction of the argument parser. + logging.basicConfig(level=logging.DEBUG if ("--debug" in sys.argv or "-d" in sys.argv) else logging.INFO) + + case_version_choices_list = ["none", "case-" + CURRENT_CASE_VERSION] + + # Add arguments specific to case_validate. + parser.add_argument( + '-d', + '--debug', + action='store_true', + help='Output additional runtime messages.' + ) + parser.add_argument( + "--built-version", + choices=tuple(case_version_choices_list), + default="case-"+CURRENT_CASE_VERSION, + help="Monolithic aggregation of CASE ontology files at certain versions. Does not require networking to use. Default is most recent CASE release." + ) + parser.add_argument( + "--ontology-graph", + action="append", + help="Combined ontology (i.e. subclass hierarchy) and shapes (SHACL) file, in any format accepted by rdflib recognized by file extension (e.g. .ttl). Will supplement ontology selected by --built-version. Can be given multiple times." + ) + + # Inherit arguments from pyshacl. + parser.add_argument( + '--abort', + action='store_true', + help='(As with pyshacl CLI) Abort on first invalid data.' + ) + parser.add_argument( + '-w', + '--allow-warnings', + action='store_true', + help='(As with pyshacl CLI) Shapes marked with severity of Warning or Info will not cause result to be invalid.', + ) + parser.add_argument( + "-f", + "--format", + choices=('human', 'turtle', 'xml', 'json-ld', 'nt', 'n3'), + default='human', + help="(ALMOST as with pyshacl CLI) Choose an output format. Default is \"human\". Difference: 'table' not provided." + ) + parser.add_argument( + '-im', + '--imports', + action='store_true', + help='(As with pyshacl CLI) Allow import of sub-graphs defined in statements with owl:imports.', + ) + parser.add_argument( + '-i', + '--inference', + choices=('none', 'rdfs', 'owlrl', 'both'), + default='none', + help="(As with pyshacl CLI) Choose a type of inferencing to run against the Data Graph before validating. Default is \"none\".", + ) + + parser.add_argument("in_graph") + + args = parser.parse_args() + + data_graph = rdflib.Graph() + data_graph.parse(args.in_graph) + + ontology_graph = rdflib.Graph() + if args.built_version != "none": + ttl_filename = args.built_version + ".ttl" + _logger.debug("ttl_filename = %r.", ttl_filename) + ttl_data = importlib.resources.read_text(case_utils.ontology, ttl_filename) + ontology_graph.parse(data=ttl_data, format="turtle") + if args.ontology_graph: + for arg_ontology_graph in args.ontology_graph: + _logger.debug("arg_ontology_graph = %r.", arg_ontology_graph) + ontology_graph.parse(arg_ontology_graph) + + validate_result : typing.Tuple[ + bool, + typing.Union[Exception, bytes, str, rdflib.Graph], + str + ] + validate_result = pyshacl.validate( + data_graph, + shacl_graph=ontology_graph, + ont_graph=ontology_graph, + inference=args.inference, + abort_on_first=args.abort, + allow_warnings=True if args.allow_warnings else False, + debug=True if args.debug else False, + do_owl_imports=True if args.imports else False + ) + + # Relieve RAM of the data graph after validation has run. + del data_graph + + conforms = validate_result[0] + validation_graph = validate_result[1] + validation_text = validate_result[2] + + if args.format == "human": + sys.stdout.write(validation_text) + else: + if isinstance(validation_graph, rdflib.Graph): + validation_graph_str = validation_graph.serialize(format=args.format) + sys.stdout.write(validation_graph_str) + del validation_graph_str + elif isinstance(validation_graph, bytes): + sys.stdout.write(validation_graph.decode("utf-8")) + elif isinstance(validation_graph, str): + sys.stdout.write(validation_graph) + else: + raise NotImplementedError("Unexpected result type returned from validate: %r." % type(validation_graph)) + + sys.exit(0 if conforms else 1) + +if __name__ == "__main__": + main() diff --git a/setup.cfg b/setup.cfg index d6439d0..6b94050 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,6 +18,7 @@ classifiers = include_package_data = true install_requires = pandas + pyshacl rdflib >= 6.0.2 requests tabulate @@ -29,6 +30,7 @@ console_scripts = case_file = case_utils.case_file:main case_sparql_construct = case_utils.case_sparql_construct:main case_sparql_select = case_utils.case_sparql_select:main + case_validate = case_utils.case_validate:main [options.package_data] case_utils = py.typed diff --git a/tests/case_utils/Makefile b/tests/case_utils/Makefile index 14ac4be..1005660 100644 --- a/tests/case_utils/Makefile +++ b/tests/case_utils/Makefile @@ -20,15 +20,18 @@ tests_srcdir := $(top_srcdir)/tests all: \ all-case_file \ all-case_sparql_construct \ - all-case_sparql_select + all-case_sparql_select \ + all-case_validate .PHONY: \ all-case_file \ all-case_sparql_construct \ all-case_sparql_select \ + all-case_validate \ check-case_file \ check-case_sparql_construct \ - check-case_sparql_select + check-case_sparql_select \ + check-case_validate all-case_file: \ $(tests_srcdir)/.venv.done.log @@ -45,15 +48,21 @@ all-case_sparql_select: \ $(MAKE) \ --directory case_sparql_select +all-case_validate: \ + $(tests_srcdir)/.venv.done.log + $(MAKE) \ + --directory case_validate + check: \ check-case_file \ check-case_sparql_construct \ - check-case_sparql_select + check-case_sparql_select \ + check-case_validate source $(tests_srcdir)/venv/bin/activate \ && pytest \ --ignore case_file \ --ignore case_sparql_construct \ - --ignore case_sparql_select \ + --ignore case_validate \ --log-level=DEBUG check-case_file: \ @@ -74,7 +83,16 @@ check-case_sparql_select: \ --directory case_sparql_select \ check +check-case_validate: \ + $(tests_srcdir)/.venv.done.log + $(MAKE) \ + --directory case_validate \ + check + clean: + @$(MAKE) \ + --directory case_validate \ + clean @$(MAKE) \ --directory case_sparql_select \ clean diff --git a/tests/case_utils/case_validate/Makefile b/tests/case_utils/case_validate/Makefile new file mode 100644 index 0000000..8d863ed --- /dev/null +++ b/tests/case_utils/case_validate/Makefile @@ -0,0 +1,58 @@ +#!/usr/bin/make -f + +# 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) + +tests_srcdir := $(top_srcdir)/tests + +all: \ + all-case_test_examples \ + all-uco_test_examples + +.PHONY: \ + all-case_test_examples \ + all-uco_test_examples \ + check-case_test_examples \ + check-uco_test_examples + +all-case_test_examples: + $(MAKE) \ + --directory case_test_examples + +all-uco_test_examples: + $(MAKE) \ + --directory uco_test_examples + +check: \ + check-case_test_examples \ + check-uco_test_examples + +check-case_test_examples: + $(MAKE) \ + --directory case_test_examples \ + check + +check-uco_test_examples: + $(MAKE) \ + --directory uco_test_examples \ + check + +clean: + @$(MAKE) \ + --directory case_test_examples \ + clean + @$(MAKE) \ + --directory uco_test_examples \ + clean diff --git a/tests/case_utils/case_validate/README.md b/tests/case_utils/case_validate/README.md new file mode 100644 index 0000000..e853ba8 --- /dev/null +++ b/tests/case_utils/case_validate/README.md @@ -0,0 +1 @@ +This directory runs the examples-based tests in the CASE and UCO ontology repositories, using `case_validate` in place of `pyshacl`. diff --git a/tests/case_utils/case_validate/case_test_examples/Makefile b/tests/case_utils/case_validate/case_test_examples/Makefile new file mode 100644 index 0000000..ddf1667 --- /dev/null +++ b/tests/case_utils/case_validate/case_test_examples/Makefile @@ -0,0 +1,76 @@ +#!/usr/bin/make -f + +# 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) + +case_srcdir := $(top_srcdir)/dependencies/CASE + +examples_srcdir := $(case_srcdir)/tests/examples + +tests_srcdir := $(top_srcdir)/tests + +RDF_TOOLKIT_JAR := $(case_srcdir)/lib/rdf-toolkit.jar + +all: \ + investigative_action_PASS_validation.ttl \ + investigative_action_XFAIL_validation.ttl + +.PRECIOUS: \ + %_validation.ttl + +# NOTE - this recipe makes an allowance for a certain failure type +# reported by pyshacl. Pyshacl will exit status 1 in the case where +# "DataGraph is Non-Conformant". XFAIL tests are intended to +# generate a non-conformance result, and feed that result forward to +# pytest. Hence, the Make recipe allows for an exit status of 0 or 1. +# (0 would cause an expected failure later in pytest.) +# Note that should another issue cause an exit status of 1, pytest will +# fail because the result validation-graph file would not have expected +# characteristics. +%_validation.ttl: \ + $(examples_srcdir)/%.json \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --format turtle \ + $< \ + > __$@ \ + ; rc=$$? ; test 0 -eq $$rc -o 1 -eq $$rc + @#Fail if output is empty. + @test -s __$@ \ + || exit 1 + java -jar $(RDF_TOOLKIT_JAR) \ + --inline-blank-nodes \ + --source __$@ \ + --source-format turtle \ + --target _$@ \ + --target-format turtle + rm __$@ + mv _$@ $@ + +check: \ + investigative_action_PASS_validation.ttl \ + investigative_action_XFAIL_validation.ttl + source $(tests_srcdir)/venv/bin/activate \ + && pytest \ + --log-level=DEBUG + +clean: + @rm -f \ + *_validation.ttl diff --git a/tests/case_utils/case_validate/case_test_examples/test_case_validation.py b/tests/case_utils/case_validate/case_test_examples/test_case_validation.py new file mode 120000 index 0000000..a30d51c --- /dev/null +++ b/tests/case_utils/case_validate/case_test_examples/test_case_validation.py @@ -0,0 +1 @@ +../../../../dependencies/CASE/tests/examples/test_validation.py \ No newline at end of file diff --git a/tests/case_utils/case_validate/uco_test_examples/Makefile b/tests/case_utils/case_validate/uco_test_examples/Makefile new file mode 100644 index 0000000..224002a --- /dev/null +++ b/tests/case_utils/case_validate/uco_test_examples/Makefile @@ -0,0 +1,84 @@ +#!/usr/bin/make -f + +# 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) + +case_srcdir := $(top_srcdir)/dependencies/CASE + +uco_srcdir := $(case_srcdir)/dependencies/UCO + +examples_srcdir := $(uco_srcdir)/tests/examples + +tests_srcdir := $(top_srcdir)/tests + +RDF_TOOLKIT_JAR := $(case_srcdir)/lib/rdf-toolkit.jar + +all: \ + action_inheritance_PASS_validation.ttl \ + action_inheritance_XFAIL_validation.ttl \ + action_result_PASS_validation.ttl \ + location_PASS_validation.ttl \ + location_XFAIL_validation.ttl + +.PRECIOUS: \ + %_validation.ttl + +# NOTE - this recipe makes an allowance for a certain failure type +# reported by pyshacl. Pyshacl will exit status 1 in the case where +# "DataGraph is Non-Conformant". XFAIL tests are intended to +# generate a non-conformance result, and feed that result forward to +# pytest. Hence, the Make recipe allows for an exit status of 0 or 1. +# (0 would cause an expected failure later in pytest.) +# Note that should another issue cause an exit status of 1, pytest will +# fail because the result validation-graph file would not have expected +# characteristics. +%_validation.ttl: \ + $(examples_srcdir)/%.json \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --format turtle \ + $< \ + > __$@ \ + ; rc=$$? ; test 0 -eq $$rc -o 1 -eq $$rc + @#Fail if output is empty. + @test -s __$@ \ + || exit 1 + java -jar $(RDF_TOOLKIT_JAR) \ + --inline-blank-nodes \ + --source __$@ \ + --source-format turtle \ + --target _$@ \ + --target-format turtle + rm __$@ + mv _$@ $@ + +check: \ + action_inheritance_PASS_validation.ttl \ + action_inheritance_XFAIL_validation.ttl \ + action_result_PASS_validation.ttl \ + location_PASS_validation.ttl \ + location_XFAIL_validation.ttl + source $(tests_srcdir)/venv/bin/activate \ + && pytest \ + --log-level=DEBUG + +clean: + @rm -f \ + *_validation.ttl diff --git a/tests/case_utils/case_validate/uco_test_examples/test_uco_validation.py b/tests/case_utils/case_validate/uco_test_examples/test_uco_validation.py new file mode 120000 index 0000000..ba03864 --- /dev/null +++ b/tests/case_utils/case_validate/uco_test_examples/test_uco_validation.py @@ -0,0 +1 @@ +../../../../dependencies/CASE/dependencies/UCO/tests/examples/test_validation.py \ No newline at end of file From fb5cc0c392e7c84a2c6c6d19521618585848f018 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 28 Oct 2021 19:10:05 -0400 Subject: [PATCH 23/49] Generate Make-managed files References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- .../investigative_action_PASS_validation.ttl | 11 + .../investigative_action_XFAIL_validation.ttl | 44 ++++ .../action_inheritance_PASS_validation.ttl | 11 + .../action_inheritance_XFAIL_validation.ttl | 236 ++++++++++++++++++ .../action_result_PASS_validation.ttl | 11 + .../location_PASS_validation.ttl | 11 + .../location_XFAIL_validation.ttl | 73 ++++++ 7 files changed, 397 insertions(+) create mode 100644 tests/case_utils/case_validate/case_test_examples/investigative_action_PASS_validation.ttl create mode 100644 tests/case_utils/case_validate/case_test_examples/investigative_action_XFAIL_validation.ttl create mode 100644 tests/case_utils/case_validate/uco_test_examples/action_inheritance_PASS_validation.ttl create mode 100644 tests/case_utils/case_validate/uco_test_examples/action_inheritance_XFAIL_validation.ttl create mode 100644 tests/case_utils/case_validate/uco_test_examples/action_result_PASS_validation.ttl create mode 100644 tests/case_utils/case_validate/uco_test_examples/location_PASS_validation.ttl create mode 100644 tests/case_utils/case_validate/uco_test_examples/location_XFAIL_validation.ttl diff --git a/tests/case_utils/case_validate/case_test_examples/investigative_action_PASS_validation.ttl b/tests/case_utils/case_validate/case_test_examples/investigative_action_PASS_validation.ttl new file mode 100644 index 0000000..33496ff --- /dev/null +++ b/tests/case_utils/case_validate/case_test_examples/investigative_action_PASS_validation.ttl @@ -0,0 +1,11 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +[] + a sh:ValidationReport ; + sh:conforms "true"^^xsd:boolean ; + . + diff --git a/tests/case_utils/case_validate/case_test_examples/investigative_action_XFAIL_validation.ttl b/tests/case_utils/case_validate/case_test_examples/investigative_action_XFAIL_validation.ttl new file mode 100644 index 0000000..d930ffa --- /dev/null +++ b/tests/case_utils/case_validate/case_test_examples/investigative_action_XFAIL_validation.ttl @@ -0,0 +1,44 @@ +@prefix investigation: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +[] + a sh:ValidationReport ; + sh:conforms "false"^^xsd:boolean ; + sh:result + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value is not Literal with datatype xsd:string" ; + sh:resultPath investigation:exhibitNumber ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent ; + sh:sourceShape [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path investigation:exhibitNumber ; + ] ; + sh:value "1"^^xsd:integer ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value is not Literal with datatype xsd:string" ; + sh:resultPath investigation:rootExhibitNumber ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent ; + sh:sourceShape [ + sh:datatype xsd:string ; + sh:minCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path investigation:rootExhibitNumber ; + ] ; + sh:value "1"^^xsd:integer ; + ] + ; + . + diff --git a/tests/case_utils/case_validate/uco_test_examples/action_inheritance_PASS_validation.ttl b/tests/case_utils/case_validate/uco_test_examples/action_inheritance_PASS_validation.ttl new file mode 100644 index 0000000..33496ff --- /dev/null +++ b/tests/case_utils/case_validate/uco_test_examples/action_inheritance_PASS_validation.ttl @@ -0,0 +1,11 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +[] + a sh:ValidationReport ; + sh:conforms "true"^^xsd:boolean ; + . + diff --git a/tests/case_utils/case_validate/uco_test_examples/action_inheritance_XFAIL_validation.ttl b/tests/case_utils/case_validate/uco_test_examples/action_inheritance_XFAIL_validation.ttl new file mode 100644 index 0000000..7a2d7d0 --- /dev/null +++ b/tests/case_utils/case_validate/uco_test_examples/action_inheritance_XFAIL_validation.ttl @@ -0,0 +1,236 @@ +@prefix action: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix vocabulary1: . +@prefix xsd: . + +[] + a sh:ValidationReport ; + sh:conforms "false"^^xsd:boolean ; + sh:result + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "More than 0 values on kb:action-lifecycle1->action:actionStatus" ; + sh:resultPath action:actionStatus ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:MaxCountConstraintComponent ; + sh:sourceShape [ + sh:datatype vocabulary1:ActionStatusTypeVocab ; + sh:maxCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionStatus ; + ] ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value is not Literal with datatype vocabulary1:ActionStatusTypeVocab" ; + sh:resultPath action:actionStatus ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent ; + sh:sourceShape [ + sh:datatype vocabulary1:ActionStatusTypeVocab ; + sh:maxCount "0"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionStatus ; + ] ; + sh:value "Pending" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value is not Literal with datatype vocabulary1:ActionStatusTypeVocab" ; + sh:resultPath action:actionStatus ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent ; + sh:sourceShape [ + sh:datatype vocabulary1:ActionStatusTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionStatus ; + ] ; + sh:value "Pending" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value is not Literal with datatype vocabulary1:ActionStatusTypeVocab" ; + sh:resultPath action:actionStatus ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent ; + sh:sourceShape [ + sh:datatype vocabulary1:ActionStatusTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionStatus ; + ] ; + sh:value "Pending" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value is not Literal with datatype vocabulary1:ActionStatusTypeVocab" ; + sh:resultPath action:actionStatus ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent ; + sh:sourceShape [ + sh:datatype vocabulary1:ActionStatusTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionStatus ; + ] ; + sh:value "Pending" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value is not Literal with datatype vocabulary1:ActionStatusTypeVocab" ; + sh:resultPath action:actionStatus ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent ; + sh:sourceShape [ + sh:datatype vocabulary1:ActionStatusTypeVocab ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path action:actionStatus ; + ] ; + sh:value "Pending" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode [ + a action:ArrayOfAction ; + action:action + "kb:action1" , + "kb:action2" , + "kb:action3" + ; + ] ; + sh:resultMessage "Value does not have class action:Action" ; + sh:resultPath action:action ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:ClassConstraintComponent ; + sh:sourceShape [ + sh:class action:Action ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:action ; + ] ; + sh:value "kb:action1" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode [ + a action:ArrayOfAction ; + action:action + "kb:action1" , + "kb:action2" , + "kb:action3" + ; + ] ; + sh:resultMessage "Value does not have class action:Action" ; + sh:resultPath action:action ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:ClassConstraintComponent ; + sh:sourceShape [ + sh:class action:Action ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:action ; + ] ; + sh:value "kb:action2" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode [ + a action:ArrayOfAction ; + action:action + "kb:action1" , + "kb:action2" , + "kb:action3" + ; + ] ; + sh:resultMessage "Value does not have class action:Action" ; + sh:resultPath action:action ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:ClassConstraintComponent ; + sh:sourceShape [ + sh:class action:Action ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:action ; + ] ; + sh:value "kb:action3" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode [ + a action:ArrayOfAction ; + action:action + "kb:action1" , + "kb:action2" , + "kb:action3" + ; + ] ; + sh:resultMessage "Value is not of Node Kind sh:BlankNodeOrIRI" ; + sh:resultPath action:action ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape [ + sh:class action:Action ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:action ; + ] ; + sh:value "kb:action1" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode [ + a action:ArrayOfAction ; + action:action + "kb:action1" , + "kb:action2" , + "kb:action3" + ; + ] ; + sh:resultMessage "Value is not of Node Kind sh:BlankNodeOrIRI" ; + sh:resultPath action:action ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape [ + sh:class action:Action ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:action ; + ] ; + sh:value "kb:action2" ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode [ + a action:ArrayOfAction ; + action:action + "kb:action1" , + "kb:action2" , + "kb:action3" + ; + ] ; + sh:resultMessage "Value is not of Node Kind sh:BlankNodeOrIRI" ; + sh:resultPath action:action ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:NodeKindConstraintComponent ; + sh:sourceShape [ + sh:class action:Action ; + sh:minCount "1"^^xsd:integer ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path action:action ; + ] ; + sh:value "kb:action3" ; + ] + ; + . + diff --git a/tests/case_utils/case_validate/uco_test_examples/action_result_PASS_validation.ttl b/tests/case_utils/case_validate/uco_test_examples/action_result_PASS_validation.ttl new file mode 100644 index 0000000..33496ff --- /dev/null +++ b/tests/case_utils/case_validate/uco_test_examples/action_result_PASS_validation.ttl @@ -0,0 +1,11 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +[] + a sh:ValidationReport ; + sh:conforms "true"^^xsd:boolean ; + . + diff --git a/tests/case_utils/case_validate/uco_test_examples/location_PASS_validation.ttl b/tests/case_utils/case_validate/uco_test_examples/location_PASS_validation.ttl new file mode 100644 index 0000000..33496ff --- /dev/null +++ b/tests/case_utils/case_validate/uco_test_examples/location_PASS_validation.ttl @@ -0,0 +1,11 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +[] + a sh:ValidationReport ; + sh:conforms "true"^^xsd:boolean ; + . + diff --git a/tests/case_utils/case_validate/uco_test_examples/location_XFAIL_validation.ttl b/tests/case_utils/case_validate/uco_test_examples/location_XFAIL_validation.ttl new file mode 100644 index 0000000..9be9d0b --- /dev/null +++ b/tests/case_utils/case_validate/uco_test_examples/location_XFAIL_validation.ttl @@ -0,0 +1,73 @@ +@prefix core: . +@prefix location: . +@prefix ns1: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +[] + a sh:ValidationReport ; + sh:conforms "false"^^xsd:boolean ; + sh:result + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value does not have class core:Facet" ; + sh:resultPath core:hasFacet ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:ClassConstraintComponent ; + sh:sourceShape [ + sh:class core:Facet ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:hasFacet ; + ] ; + sh:value [ + a ns1:InternalLocationFacet ; + ns1:floor "3"^^xsd:integer ; + ns1:roomNumber "345" ; + ] ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode ; + sh:resultMessage "Value does not have class core:Facet" ; + sh:resultPath core:hasFacet ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:ClassConstraintComponent ; + sh:sourceShape [ + sh:class core:Facet ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path core:hasFacet ; + ] ; + sh:value [ + a location:LatLongCoordinates ; + location:latitude "48.860346"^^xsd:decimal ; + location:longitude "2.331199"^^xsd:decimal ; + ] ; + ] , + [ + a sh:ValidationResult ; + sh:focusNode [ + a location:SimpleAddressFacet ; + location:locality "Seattle" ; + location:postalCode "98052"^^xsd:integer ; + location:region "WA" ; + location:street "20341 Whitworth Institute 405 N. Whitworth" ; + ] ; + sh:resultMessage "Value is not Literal with datatype xsd:string" ; + sh:resultPath location:postalCode ; + sh:resultSeverity sh:Violation ; + sh:sourceConstraintComponent sh:DatatypeConstraintComponent ; + sh:sourceShape [ + sh:datatype xsd:string ; + sh:maxCount "1"^^xsd:integer ; + sh:nodeKind sh:Literal ; + sh:path location:postalCode ; + ] ; + sh:value "98052"^^xsd:integer ; + ] + ; + . + From 0708fc2126d5963f4a872168ff7f8df217bc904b Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Thu, 28 Oct 2021 19:17:47 -0400 Subject: [PATCH 24/49] Validate output of case_file test References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- tests/case_utils/case_file/Makefile | 18 ++++++++++++++++++ tests/case_utils/case_file/kb_validation.ttl | 11 +++++++++++ 2 files changed, 29 insertions(+) create mode 100644 tests/case_utils/case_file/kb_validation.ttl diff --git a/tests/case_utils/case_file/Makefile b/tests/case_utils/case_file/Makefile index ecf4508..f63e264 100644 --- a/tests/case_utils/case_file/Makefile +++ b/tests/case_utils/case_file/Makefile @@ -39,6 +39,7 @@ all: \ check: \ kb.json \ + kb_validation.ttl \ sample.txt.json \ sample.txt-nocompact.json \ undefined_vocabulary.txt @@ -93,6 +94,23 @@ kb.ttl: \ rm __$@ mv _$@ $@ +#TODO - kb.json has a conversion error with context dictionary construction and custom datatypes. +kb_validation.ttl: \ + kb.ttl + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --format turtle \ + kb.ttl \ + > __$@ + java -jar $(RDF_TOOLKIT_JAR) \ + --inline-blank-nodes \ + --source __$@ \ + --source-format turtle \ + --target _$@ \ + --target-format turtle + rm __$@ + mv _$@ $@ + sample.txt.done.log: \ $(tests_srcdir)/.venv.done.log \ sample_txt.py diff --git a/tests/case_utils/case_file/kb_validation.ttl b/tests/case_utils/case_file/kb_validation.ttl new file mode 100644 index 0000000..33496ff --- /dev/null +++ b/tests/case_utils/case_file/kb_validation.ttl @@ -0,0 +1,11 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix sh: . +@prefix xsd: . + +[] + a sh:ValidationReport ; + sh:conforms "true"^^xsd:boolean ; + . + From 94b9607dc36e753ed9363648445ba09c1ded7b49 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 2 Nov 2021 14:56:53 -0400 Subject: [PATCH 25/49] Fix or-gated descent syntax References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index da58060..5222197 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,7 @@ clean: .*.done.log @# 'clean' in the ontology directory should only happen when testing and building new ontology versions. Hence, it is not called from the top-level Makefile. @test ! -r dependencies/CASE/README.md \ - || @$(MAKE) \ + || $(MAKE) \ --directory dependencies/CASE \ clean @# Restore CASE validation output files that do not affect CASE build process. From d803cbe670246d2cd3f72002b58c0bd6388d2ca2 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 2 Nov 2021 15:52:09 -0400 Subject: [PATCH 26/49] Add --output to case_validate, and document and test flag adaptation References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- case_utils/case_validate/__init__.py | 60 +++++- tests/case_utils/case_validate/Makefile | 16 ++ tests/case_utils/case_validate/README.md | 2 + .../case_validate/case_test_examples/Makefile | 3 +- tests/case_utils/case_validate/cli/Makefile | 173 ++++++++++++++++++ .../cli/test_format_output_flags.py | 141 ++++++++++++++ 6 files changed, 384 insertions(+), 11 deletions(-) create mode 100644 tests/case_utils/case_validate/cli/Makefile create mode 100644 tests/case_utils/case_validate/cli/test_format_output_flags.py diff --git a/case_utils/case_validate/__init__.py b/case_utils/case_validate/__init__.py index 8aea35b..30a1124 100644 --- a/case_utils/case_validate/__init__.py +++ b/case_utils/case_validate/__init__.py @@ -11,6 +11,24 @@ # # We would appreciate acknowledgement if the software is used. +""" +This script provides a wrapper to the pySHACL command line tool, +available here: +https://github.com/RDFLib/pySHACL + +Portions of the pySHACL command line interface are preserved and passed +through to the underlying pySHACL validation functionality. + +Other portions of the pySHACL command line interface are adapted to +CASE, specifically to support CASE and UCO as ontologies that store +subclass hierarchy and node shapes together (rather than as separate +ontology and shape graphs). More specifically to CASE, if no particular +ontology or shapes graph is requested, the most recent version of CASE +will be used. (That most recent version is shipped with this package as +a monolithic file; see case_utils.ontology if interested in further +details.) +""" + __version__ = "0.1.0" import argparse @@ -21,7 +39,7 @@ import sys import typing -import rdflib # type: ignore +import rdflib.util # type: ignore import pyshacl # type: ignore import case_utils.ontology @@ -31,9 +49,11 @@ _logger = logging.getLogger(os.path.basename(__file__)) def main() -> None: - parser = argparse.ArgumentParser(description="CASE wrapper to PySHACL command line tool.") + parser = argparse.ArgumentParser(description="CASE wrapper to pySHACL command line tool.") - # Configure debug logging before running parse_args, because there could be an error raised before the construction of the argument parser. + # Configure debug logging before running parse_args, because there + # could be an error raised before the construction of the argument + # parser. logging.basicConfig(level=logging.DEBUG if ("--debug" in sys.argv or "-d" in sys.argv) else logging.INFO) case_version_choices_list = ["none", "case-" + CURRENT_CASE_VERSION] @@ -89,6 +109,15 @@ def main() -> None: default='none', help="(As with pyshacl CLI) Choose a type of inferencing to run against the Data Graph before validating. Default is \"none\".", ) + parser.add_argument( + '-o', + '--output', + dest='output', + nargs='?', + type=argparse.FileType('x'), + help="(ALMOST as with pyshacl CLI) Send output to a file. If absent, output will be written to stdout. Difference: If specified, file is expected not to exist. Clarification: Does NOT influence --format flag's default value of \"human\". (I.e., any machine-readable serialization format must be specified with --format.)", + default=sys.stdout, + ) parser.add_argument("in_graph") @@ -108,6 +137,16 @@ def main() -> None: _logger.debug("arg_ontology_graph = %r.", arg_ontology_graph) ontology_graph.parse(arg_ontology_graph) + # Determine output format. + # pySHACL's determination of output formatting is handled solely + # through the -f flag. Other CASE CLI tools handle format + # determination by output file extension. case_validate will defer + # to pySHACL behavior, as other CASE tools don't (at the time of + # this writing) have the value "human" as an output format. + validator_kwargs : typing.Dict[str, str] = dict() + if args.format != "human": + validator_kwargs['serialize_report_graph'] = args.format + validate_result : typing.Tuple[ bool, typing.Union[Exception, bytes, str, rdflib.Graph], @@ -121,7 +160,8 @@ def main() -> None: abort_on_first=args.abort, allow_warnings=True if args.allow_warnings else False, debug=True if args.debug else False, - do_owl_imports=True if args.imports else False + do_owl_imports=True if args.imports else False, + **validator_kwargs ) # Relieve RAM of the data graph after validation has run. @@ -131,17 +171,17 @@ def main() -> None: validation_graph = validate_result[1] validation_text = validate_result[2] + # NOTE: The output logistics code is adapted from pySHACL's file + # pyshacl/cli.py. This section should be monitored for code drift. if args.format == "human": - sys.stdout.write(validation_text) + args.output.write(validation_text) else: if isinstance(validation_graph, rdflib.Graph): - validation_graph_str = validation_graph.serialize(format=args.format) - sys.stdout.write(validation_graph_str) - del validation_graph_str + raise NotImplementedError("rdflib.Graph expected not to be created from --format value %r." % args.format) elif isinstance(validation_graph, bytes): - sys.stdout.write(validation_graph.decode("utf-8")) + args.output.write(validation_graph.decode("utf-8")) elif isinstance(validation_graph, str): - sys.stdout.write(validation_graph) + args.output.write(validation_graph) else: raise NotImplementedError("Unexpected result type returned from validate: %r." % type(validation_graph)) diff --git a/tests/case_utils/case_validate/Makefile b/tests/case_utils/case_validate/Makefile index 8d863ed..37378f4 100644 --- a/tests/case_utils/case_validate/Makefile +++ b/tests/case_utils/case_validate/Makefile @@ -18,24 +18,32 @@ top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests all: \ + all-cli \ all-case_test_examples \ all-uco_test_examples .PHONY: \ all-case_test_examples \ + all-cli \ all-uco_test_examples \ check-case_test_examples \ + check-cli \ check-uco_test_examples all-case_test_examples: $(MAKE) \ --directory case_test_examples +all-cli: + $(MAKE) \ + --directory cli + all-uco_test_examples: $(MAKE) \ --directory uco_test_examples check: \ + check-cli \ check-case_test_examples \ check-uco_test_examples @@ -44,6 +52,11 @@ check-case_test_examples: --directory case_test_examples \ check +check-cli: + $(MAKE) \ + --directory cli \ + check + check-uco_test_examples: $(MAKE) \ --directory uco_test_examples \ @@ -56,3 +69,6 @@ clean: @$(MAKE) \ --directory uco_test_examples \ clean + @$(MAKE) \ + --directory cli \ + clean diff --git a/tests/case_utils/case_validate/README.md b/tests/case_utils/case_validate/README.md index e853ba8..0835b88 100644 --- a/tests/case_utils/case_validate/README.md +++ b/tests/case_utils/case_validate/README.md @@ -1 +1,3 @@ This directory runs the examples-based tests in the CASE and UCO ontology repositories, using `case_validate` in place of `pyshacl`. + +The [`cli/`](cli/) directory demonstrates how some command line flags interact, such as how unlike other `case_*` tools, the output-file parameter does not determine the serialization format. Instead, the `--format` flag does. diff --git a/tests/case_utils/case_validate/case_test_examples/Makefile b/tests/case_utils/case_validate/case_test_examples/Makefile index ddf1667..66e3284 100644 --- a/tests/case_utils/case_validate/case_test_examples/Makefile +++ b/tests/case_utils/case_validate/case_test_examples/Makefile @@ -45,12 +45,13 @@ all: \ $(top_srcdir)/.ontology.done.log \ $(top_srcdir)/case_utils/case_validate/__init__.py \ $(top_srcdir)/case_utils/ontology/__init__.py + rm -f __$@ _$@ source $(tests_srcdir)/venv/bin/activate \ && case_validate \ --debug \ --format turtle \ + --output __$@ \ $< \ - > __$@ \ ; rc=$$? ; test 0 -eq $$rc -o 1 -eq $$rc @#Fail if output is empty. @test -s __$@ \ diff --git a/tests/case_utils/case_validate/cli/Makefile b/tests/case_utils/case_validate/cli/Makefile new file mode 100644 index 0000000..b7e9f6c --- /dev/null +++ b/tests/case_utils/case_validate/cli/Makefile @@ -0,0 +1,173 @@ +#!/usr/bin/make -f + +# 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) + +case_srcdir := $(top_srcdir)/dependencies/CASE + +examples_srcdir := $(case_srcdir)/tests/examples + +tests_srcdir := $(top_srcdir)/tests + +RDF_TOOLKIT_JAR := $(case_srcdir)/lib/rdf-toolkit.jar + +files_to_generate := \ + format_human_output_jsonld.jsonld \ + format_human_output_turtle.ttl \ + format_human_output_txt.txt \ + format_human_output_unspecified.txt \ + format_jsonld_output_jsonld.jsonld \ + format_jsonld_output_turtle.ttl \ + format_jsonld_output_txt.txt \ + format_jsonld_output_unspecified.jsonld \ + format_turtle_output_jsonld.jsonld \ + format_turtle_output_turtle.ttl \ + format_turtle_output_txt.txt \ + format_turtle_output_unspecified.ttl \ + format_unspecified_output_jsonld.jsonld \ + format_unspecified_output_turtle.ttl \ + format_unspecified_output_txt.txt \ + format_unspecified_output_unspecified.txt + +all: \ + $(files_to_generate) + +check: \ + $(files_to_generate) + source $(tests_srcdir)/venv/bin/activate \ + && pytest \ + --log-level=DEBUG + +clean: + @rm -f \ + $(files_to_generate) + +format_human_output_%: \ + $(examples_srcdir)/investigative_action_PASS_validation.ttl \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --format human \ + --output _$@ \ + $< + mv _$@ $@ + +format_human_output_unspecified.txt: \ + $(examples_srcdir)/investigative_action_PASS_validation.ttl \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --format human \ + $< \ + > _$@ + mv _$@ $@ + +format_jsonld_output_%: \ + $(examples_srcdir)/investigative_action_PASS_validation.ttl \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --format json-ld \ + --output _$@ \ + $< + mv _$@ $@ + +format_jsonld_output_unspecified.jsonld: \ + $(examples_srcdir)/investigative_action_PASS_validation.ttl \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --format json-ld \ + $< \ + > _$@ + mv _$@ $@ + +format_turtle_output_%: \ + $(examples_srcdir)/investigative_action_PASS_validation.ttl \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --format turtle \ + --output _$@ \ + $< + mv _$@ $@ + +format_turtle_output_unspecified.ttl: \ + $(examples_srcdir)/investigative_action_PASS_validation.ttl \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --format turtle \ + $< \ + > _$@ + mv _$@ $@ + +format_unspecified_output_%: \ + $(examples_srcdir)/investigative_action_PASS_validation.ttl \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + --output _$@ \ + $< + mv _$@ $@ + +format_unspecified_output_unspecified.txt: \ + $(examples_srcdir)/investigative_action_PASS_validation.ttl \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + $< \ + > _$@ + mv _$@ $@ diff --git a/tests/case_utils/case_validate/cli/test_format_output_flags.py b/tests/case_utils/case_validate/cli/test_format_output_flags.py new file mode 100644 index 0000000..56e4d1e --- /dev/null +++ b/tests/case_utils/case_validate/cli/test_format_output_flags.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 + +# 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. + +import json +import pathlib +import typing + +import pytest +import rdflib.plugins.parsers.notation3 # type: ignore + +srcdir = pathlib.Path(__file__).parent + +PLAINTEXT_VALIDATION_PASS = """\ +Validation Report +Conforms: True +""".strip() + +def _guess_format( + basename +) -> typing.Optional[str]: + """ + Guess format by file extension. + """ + filepath = srcdir / basename + return rdflib.util.guess_format(str(filepath)) + +def _parse_graph( + basename : str, + asserted_format : str +) -> rdflib.Graph: + graph = rdflib.Graph() + filepath = srcdir / basename + graph.parse(str(filepath), format=asserted_format) + return graph + +def _verify_plaintext_report( + basename: str +) -> None: + filepath = srcdir / basename + with filepath.open("r") as fh: + assert PLAINTEXT_VALIDATION_PASS == fh.read(50)[:-1] + +@pytest.mark.xfail(reason="Known mismatch", raises=json.decoder.JSONDecodeError, strict=True) +def test_format_human_output_jsonld() -> None: + subject_file = "format_human_output_jsonld.jsonld" + asserted_format = _guess_format(subject_file) + assert asserted_format == "json-ld" + _parse_graph(subject_file, asserted_format) + +@pytest.mark.xfail(reason="Known mismatch", raises=rdflib.plugins.parsers.notation3.BadSyntax, strict=True) +def test_format_human_output_turtle() -> None: + subject_file = "format_human_output_turtle.ttl" + asserted_format = _guess_format(subject_file) + assert asserted_format == "turtle" + _parse_graph(subject_file, asserted_format) + +def test_format_human_output_txt() -> None: + _verify_plaintext_report("format_human_output_txt.txt") + +def test_format_human_output_unspecified() -> None: + _verify_plaintext_report("format_human_output_unspecified.txt") + +def test_format_jsonld_output_jsonld() -> None: + subject_file = "format_jsonld_output_jsonld.jsonld" + asserted_format = _guess_format(subject_file) + assert asserted_format == "json-ld" + graph = _parse_graph(subject_file, asserted_format) + +@pytest.mark.xfail(reason="Known mismatch", raises=rdflib.plugins.parsers.notation3.BadSyntax, strict=True) +def test_format_jsonld_output_turtle() -> None: + subject_file = "format_jsonld_output_turtle.ttl" + asserted_format = _guess_format(subject_file) + assert asserted_format == "turtle" + _parse_graph(subject_file, asserted_format) + +def test_format_jsonld_output_txt() -> None: + subject_file = "format_jsonld_output_txt.txt" + asserted_format = _guess_format(subject_file) + assert asserted_format is None + _parse_graph(subject_file, "json-ld") + +def test_format_jsonld_output_unspecified() -> None: + subject_file = "format_jsonld_output_unspecified.jsonld" + asserted_format = _guess_format(subject_file) + assert asserted_format == "json-ld" + graph = _parse_graph(subject_file, asserted_format) + +@pytest.mark.xfail(reason="Known mismatch", raises=json.decoder.JSONDecodeError, strict=True) +def test_format_turtle_output_jsonld() -> None: + subject_file = "format_turtle_output_jsonld.jsonld" + asserted_format = _guess_format(subject_file) + assert asserted_format == "json-ld" + _parse_graph(subject_file, asserted_format) + +def test_format_turtle_output_turtle() -> None: + subject_file = "format_turtle_output_turtle.ttl" + asserted_format = _guess_format(subject_file) + assert asserted_format == "turtle" + graph = _parse_graph(subject_file, asserted_format) + +def test_format_turtle_output_txt() -> None: + subject_file = "format_turtle_output_txt.txt" + asserted_format = _guess_format(subject_file) + assert asserted_format is None + _parse_graph(subject_file, "turtle") + +def test_format_turtle_output_unspecified() -> None: + subject_file = "format_turtle_output_unspecified.ttl" + asserted_format = _guess_format(subject_file) + assert asserted_format == "turtle" + graph = _parse_graph(subject_file, asserted_format) + +@pytest.mark.xfail(reason="Known mismatch", raises=json.decoder.JSONDecodeError, strict=True) +def test_format_unspecified_output_jsonld() -> None: + subject_file = "format_unspecified_output_jsonld.jsonld" + asserted_format = _guess_format(subject_file) + assert asserted_format == "json-ld" + _parse_graph(subject_file, asserted_format) + +@pytest.mark.xfail(reason="Known mismatch", raises=rdflib.plugins.parsers.notation3.BadSyntax, strict=True) +def test_format_unspecified_output_turtle() -> None: + subject_file = "format_unspecified_output_turtle.ttl" + asserted_format = _guess_format(subject_file) + assert asserted_format == "turtle" + _parse_graph(subject_file, asserted_format) + +def test_format_unspecified_output_txt() -> None: + _verify_plaintext_report("format_unspecified_output_txt.txt") + +def test_format_unspecified_output_unspecified() -> None: + _verify_plaintext_report("format_unspecified_output_unspecified.txt") From 6066e995c7461c18718a91cf003b0c3872fa1b6c Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 2 Nov 2021 15:55:34 -0400 Subject: [PATCH 27/49] Generate Make-managed files References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- .../cli/format_human_output_jsonld.jsonld | 2 ++ .../cli/format_human_output_turtle.ttl | 2 ++ .../case_validate/cli/format_human_output_txt.txt | 2 ++ .../cli/format_human_output_unspecified.txt | 2 ++ .../cli/format_jsonld_output_jsonld.jsonld | 13 +++++++++++++ .../cli/format_jsonld_output_turtle.ttl | 13 +++++++++++++ .../case_validate/cli/format_jsonld_output_txt.txt | 13 +++++++++++++ .../cli/format_jsonld_output_unspecified.jsonld | 13 +++++++++++++ .../cli/format_turtle_output_jsonld.jsonld | 6 ++++++ .../cli/format_turtle_output_turtle.ttl | 6 ++++++ .../case_validate/cli/format_turtle_output_txt.txt | 6 ++++++ .../cli/format_turtle_output_unspecified.ttl | 6 ++++++ .../cli/format_unspecified_output_jsonld.jsonld | 2 ++ .../cli/format_unspecified_output_turtle.ttl | 2 ++ .../cli/format_unspecified_output_txt.txt | 2 ++ .../cli/format_unspecified_output_unspecified.txt | 2 ++ 16 files changed, 92 insertions(+) create mode 100644 tests/case_utils/case_validate/cli/format_human_output_jsonld.jsonld create mode 100644 tests/case_utils/case_validate/cli/format_human_output_turtle.ttl create mode 100644 tests/case_utils/case_validate/cli/format_human_output_txt.txt create mode 100644 tests/case_utils/case_validate/cli/format_human_output_unspecified.txt create mode 100644 tests/case_utils/case_validate/cli/format_jsonld_output_jsonld.jsonld create mode 100644 tests/case_utils/case_validate/cli/format_jsonld_output_turtle.ttl create mode 100644 tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt create mode 100644 tests/case_utils/case_validate/cli/format_jsonld_output_unspecified.jsonld create mode 100644 tests/case_utils/case_validate/cli/format_turtle_output_jsonld.jsonld create mode 100644 tests/case_utils/case_validate/cli/format_turtle_output_turtle.ttl create mode 100644 tests/case_utils/case_validate/cli/format_turtle_output_txt.txt create mode 100644 tests/case_utils/case_validate/cli/format_turtle_output_unspecified.ttl create mode 100644 tests/case_utils/case_validate/cli/format_unspecified_output_jsonld.jsonld create mode 100644 tests/case_utils/case_validate/cli/format_unspecified_output_turtle.ttl create mode 100644 tests/case_utils/case_validate/cli/format_unspecified_output_txt.txt create mode 100644 tests/case_utils/case_validate/cli/format_unspecified_output_unspecified.txt diff --git a/tests/case_utils/case_validate/cli/format_human_output_jsonld.jsonld b/tests/case_utils/case_validate/cli/format_human_output_jsonld.jsonld new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_human_output_jsonld.jsonld @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/format_human_output_turtle.ttl b/tests/case_utils/case_validate/cli/format_human_output_turtle.ttl new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_human_output_turtle.ttl @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/format_human_output_txt.txt b/tests/case_utils/case_validate/cli/format_human_output_txt.txt new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_human_output_txt.txt @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/format_human_output_unspecified.txt b/tests/case_utils/case_validate/cli/format_human_output_unspecified.txt new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_human_output_unspecified.txt @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/format_jsonld_output_jsonld.jsonld b/tests/case_utils/case_validate/cli/format_jsonld_output_jsonld.jsonld new file mode 100644 index 0000000..79c0e14 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_jsonld_output_jsonld.jsonld @@ -0,0 +1,13 @@ +[ + { + "@id": "_:Ne3c3fa53d833480eb7b2a3018b3c5f55", + "@type": [ + "http://www.w3.org/ns/shacl#ValidationReport" + ], + "http://www.w3.org/ns/shacl#conforms": [ + { + "@value": true + } + ] + } +] \ No newline at end of file diff --git a/tests/case_utils/case_validate/cli/format_jsonld_output_turtle.ttl b/tests/case_utils/case_validate/cli/format_jsonld_output_turtle.ttl new file mode 100644 index 0000000..c67b708 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_jsonld_output_turtle.ttl @@ -0,0 +1,13 @@ +[ + { + "@id": "_:N41a7e66881954578a485d366b4a7f6c7", + "@type": [ + "http://www.w3.org/ns/shacl#ValidationReport" + ], + "http://www.w3.org/ns/shacl#conforms": [ + { + "@value": true + } + ] + } +] \ No newline at end of file diff --git a/tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt b/tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt new file mode 100644 index 0000000..15e9632 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt @@ -0,0 +1,13 @@ +[ + { + "@id": "_:Na94600890a954773bd2399c8732183f5", + "@type": [ + "http://www.w3.org/ns/shacl#ValidationReport" + ], + "http://www.w3.org/ns/shacl#conforms": [ + { + "@value": true + } + ] + } +] \ No newline at end of file diff --git a/tests/case_utils/case_validate/cli/format_jsonld_output_unspecified.jsonld b/tests/case_utils/case_validate/cli/format_jsonld_output_unspecified.jsonld new file mode 100644 index 0000000..1218154 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_jsonld_output_unspecified.jsonld @@ -0,0 +1,13 @@ +[ + { + "@id": "_:N7f3ff63af0924b7a9a98a1e2b35af084", + "@type": [ + "http://www.w3.org/ns/shacl#ValidationReport" + ], + "http://www.w3.org/ns/shacl#conforms": [ + { + "@value": true + } + ] + } +] \ No newline at end of file diff --git a/tests/case_utils/case_validate/cli/format_turtle_output_jsonld.jsonld b/tests/case_utils/case_validate/cli/format_turtle_output_jsonld.jsonld new file mode 100644 index 0000000..9b8084b --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_turtle_output_jsonld.jsonld @@ -0,0 +1,6 @@ +@prefix sh: . +@prefix xsd: . + +[] a sh:ValidationReport ; + sh:conforms true . + diff --git a/tests/case_utils/case_validate/cli/format_turtle_output_turtle.ttl b/tests/case_utils/case_validate/cli/format_turtle_output_turtle.ttl new file mode 100644 index 0000000..9b8084b --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_turtle_output_turtle.ttl @@ -0,0 +1,6 @@ +@prefix sh: . +@prefix xsd: . + +[] a sh:ValidationReport ; + sh:conforms true . + diff --git a/tests/case_utils/case_validate/cli/format_turtle_output_txt.txt b/tests/case_utils/case_validate/cli/format_turtle_output_txt.txt new file mode 100644 index 0000000..9b8084b --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_turtle_output_txt.txt @@ -0,0 +1,6 @@ +@prefix sh: . +@prefix xsd: . + +[] a sh:ValidationReport ; + sh:conforms true . + diff --git a/tests/case_utils/case_validate/cli/format_turtle_output_unspecified.ttl b/tests/case_utils/case_validate/cli/format_turtle_output_unspecified.ttl new file mode 100644 index 0000000..9b8084b --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_turtle_output_unspecified.ttl @@ -0,0 +1,6 @@ +@prefix sh: . +@prefix xsd: . + +[] a sh:ValidationReport ; + sh:conforms true . + diff --git a/tests/case_utils/case_validate/cli/format_unspecified_output_jsonld.jsonld b/tests/case_utils/case_validate/cli/format_unspecified_output_jsonld.jsonld new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_unspecified_output_jsonld.jsonld @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/format_unspecified_output_turtle.ttl b/tests/case_utils/case_validate/cli/format_unspecified_output_turtle.ttl new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_unspecified_output_turtle.ttl @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/format_unspecified_output_txt.txt b/tests/case_utils/case_validate/cli/format_unspecified_output_txt.txt new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_unspecified_output_txt.txt @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/format_unspecified_output_unspecified.txt b/tests/case_utils/case_validate/cli/format_unspecified_output_unspecified.txt new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/format_unspecified_output_unspecified.txt @@ -0,0 +1,2 @@ +Validation Report +Conforms: True From b89231a54555ba40b5e24be7a104ec3a26eaa2a0 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 2 Nov 2021 16:13:17 -0400 Subject: [PATCH 28/49] Make JSON-LD blank nodes consistently generated References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- tests/case_utils/case_validate/cli/Makefile | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/case_utils/case_validate/cli/Makefile b/tests/case_utils/case_validate/cli/Makefile index b7e9f6c..ac10b28 100644 --- a/tests/case_utils/case_validate/cli/Makefile +++ b/tests/case_utils/case_validate/cli/Makefile @@ -84,19 +84,26 @@ format_human_output_unspecified.txt: \ > _$@ mv _$@ $@ +# JSON-LD recipes contain a sed command to remove a randomly-valued +# blank node ID that does not serve to inform the example. format_jsonld_output_%: \ $(examples_srcdir)/investigative_action_PASS_validation.ttl \ $(tests_srcdir)/.venv.done.log \ $(top_srcdir)/.ontology.done.log \ $(top_srcdir)/case_utils/case_validate/__init__.py \ $(top_srcdir)/case_utils/ontology/__init__.py - rm -f _$@ + rm -f __$@ _$@ source $(tests_srcdir)/venv/bin/activate \ && case_validate \ --debug \ --format json-ld \ - --output _$@ \ + --output __$@ \ $< + sed \ + -e '/"@id": "_:/d' \ + __$@ \ + > _$@ + rm -f __$@ mv _$@ $@ format_jsonld_output_unspecified.jsonld: \ @@ -105,13 +112,18 @@ format_jsonld_output_unspecified.jsonld: \ $(top_srcdir)/.ontology.done.log \ $(top_srcdir)/case_utils/case_validate/__init__.py \ $(top_srcdir)/case_utils/ontology/__init__.py - rm -f _$@ + rm -f __$@ _$@ source $(tests_srcdir)/venv/bin/activate \ && case_validate \ --debug \ --format json-ld \ $< \ - > _$@ + > __$@ + sed \ + -e '/"@id": "_:/d' \ + __$@ \ + > _$@ + rm -f __$@ mv _$@ $@ format_turtle_output_%: \ From 913bd99d1011b4c526ac948a77757884317937d3 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 2 Nov 2021 16:13:47 -0400 Subject: [PATCH 29/49] Regenerate Make-managed output References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- .../case_validate/cli/format_jsonld_output_jsonld.jsonld | 1 - .../case_utils/case_validate/cli/format_jsonld_output_turtle.ttl | 1 - tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt | 1 - .../case_validate/cli/format_jsonld_output_unspecified.jsonld | 1 - 4 files changed, 4 deletions(-) diff --git a/tests/case_utils/case_validate/cli/format_jsonld_output_jsonld.jsonld b/tests/case_utils/case_validate/cli/format_jsonld_output_jsonld.jsonld index 79c0e14..8476653 100644 --- a/tests/case_utils/case_validate/cli/format_jsonld_output_jsonld.jsonld +++ b/tests/case_utils/case_validate/cli/format_jsonld_output_jsonld.jsonld @@ -1,6 +1,5 @@ [ { - "@id": "_:Ne3c3fa53d833480eb7b2a3018b3c5f55", "@type": [ "http://www.w3.org/ns/shacl#ValidationReport" ], diff --git a/tests/case_utils/case_validate/cli/format_jsonld_output_turtle.ttl b/tests/case_utils/case_validate/cli/format_jsonld_output_turtle.ttl index c67b708..8476653 100644 --- a/tests/case_utils/case_validate/cli/format_jsonld_output_turtle.ttl +++ b/tests/case_utils/case_validate/cli/format_jsonld_output_turtle.ttl @@ -1,6 +1,5 @@ [ { - "@id": "_:N41a7e66881954578a485d366b4a7f6c7", "@type": [ "http://www.w3.org/ns/shacl#ValidationReport" ], diff --git a/tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt b/tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt index 15e9632..8476653 100644 --- a/tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt +++ b/tests/case_utils/case_validate/cli/format_jsonld_output_txt.txt @@ -1,6 +1,5 @@ [ { - "@id": "_:Na94600890a954773bd2399c8732183f5", "@type": [ "http://www.w3.org/ns/shacl#ValidationReport" ], diff --git a/tests/case_utils/case_validate/cli/format_jsonld_output_unspecified.jsonld b/tests/case_utils/case_validate/cli/format_jsonld_output_unspecified.jsonld index 1218154..8476653 100644 --- a/tests/case_utils/case_validate/cli/format_jsonld_output_unspecified.jsonld +++ b/tests/case_utils/case_validate/cli/format_jsonld_output_unspecified.jsonld @@ -1,6 +1,5 @@ [ { - "@id": "_:N7f3ff63af0924b7a9a98a1e2b35af084", "@type": [ "http://www.w3.org/ns/shacl#ValidationReport" ], From 844eeab02b26ed4b1af640c31581c355dcee0037 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 09:34:40 -0500 Subject: [PATCH 30/49] Bump CASE-Examples-QC pointer --- dependencies/CASE-Examples-QC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/CASE-Examples-QC b/dependencies/CASE-Examples-QC index 49e1bdf..6ccbb32 160000 --- a/dependencies/CASE-Examples-QC +++ b/dependencies/CASE-Examples-QC @@ -1 +1 @@ -Subproject commit 49e1bdf7d6f366dc18655ace5ea3043e84493767 +Subproject commit 6ccbb32b3bb195e5e2fed7d8dafc89a0e3e8b652 From 12b26b8badbcab1ea807c0ba58f8e59e56bc7450 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 09:35:01 -0500 Subject: [PATCH 31/49] Clean whitespace --- tests/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Makefile b/tests/Makefile index 340aca2..9ceb8d6 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -52,7 +52,6 @@ all: \ . touch $@ - all-case_utils: \ .venv.done.log $(MAKE) \ From d360c7b1823879ce55859ba45e982cad8402668c Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 09:43:10 -0500 Subject: [PATCH 32/49] Sort imports --- case_utils/case_sparql_select/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/case_utils/case_sparql_select/__init__.py b/case_utils/case_sparql_select/__init__.py index 2580b89..7bbb809 100644 --- a/case_utils/case_sparql_select/__init__.py +++ b/case_utils/case_sparql_select/__init__.py @@ -30,8 +30,8 @@ import argparse import binascii -import os import logging +import os import pandas as pd # type: ignore import rdflib.plugins.sparql # type: ignore From b393a3712f90a0ec1b915fe0ea0e0b6603ce2fee Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 09:53:36 -0500 Subject: [PATCH 33/49] Use one rdf-toolkit.jar --- Makefile | 3 ++- tests/case_utils/case_file/Makefile | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 5222197..1ec8807 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,8 @@ all: \ # Build an ontology terms list, which has a side effect of initiating further submodules. $(MAKE) \ --directory dependencies/CASE-Examples-QC \ - download + .git_submodule_init.done.log \ + .venv.done.log $(MAKE) \ --directory dependencies/CASE-Examples-QC/tests \ ontology_vocabulary.txt diff --git a/tests/case_utils/case_file/Makefile b/tests/case_utils/case_file/Makefile index f63e264..a771381 100644 --- a/tests/case_utils/case_file/Makefile +++ b/tests/case_utils/case_file/Makefile @@ -17,9 +17,11 @@ top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests +case_srcdir := $(top_srcdir)/dependencies/CASE + qc_srcdir := $(top_srcdir)/dependencies/CASE-Examples-QC -RDF_TOOLKIT_JAR := $(qc_srcdir)/dependencies/CASE-Examples/dependencies/CASE-0.3.0/CASE/lib/rdf-toolkit.jar +RDF_TOOLKIT_JAR := $(case_srcdir)/lib/rdf-toolkit.jar COMM ?= $(shell which gcomm 2>/dev/null || which comm) ifeq ($(COMM),) From edeff218a42111ff2617602f16ce4006d4137a47 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 13:12:22 -0500 Subject: [PATCH 34/49] Reduce Python 3 detection With AC-195, macOS environments no longer need to search for other Python 3 deployments that might have `virtualenv`. References: * [AC-195] Use Python venv instead of virtualenv to build virtual environments for CI Signed-off-by: Alex Nelson --- Makefile | 2 +- tests/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 1ec8807..fa526f6 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ SHELL := /bin/bash -PYTHON3 ?= $(shell which python3.9 2>/dev/null || which python3.8 2>/dev/null || which python3.7 2>/dev/null || which python3.6 2>/dev/null || which python3) +PYTHON3 ?= python3 case_version := $(shell $(PYTHON3) case_utils/ontology/version_info.py) ifeq ($(case_version),) diff --git a/tests/Makefile b/tests/Makefile index 9ceb8d6..25fa731 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -15,7 +15,7 @@ SHELL := /bin/bash top_srcdir := $(shell cd .. ; pwd) -PYTHON3 ?= $(shell which python3.9 2>/dev/null || which python3.8 2>/dev/null || which python3.7 2>/dev/null || which python3.6 2>/dev/null || which python3) +PYTHON3 ?= python3 all: \ all-case_utils From adff60ef7b88d5e6cf765700fc22888768e98506 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 13:28:52 -0500 Subject: [PATCH 35/49] Align variable name References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- case_utils/case_validate/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/case_utils/case_validate/__init__.py b/case_utils/case_validate/__init__.py index 30a1124..de84989 100644 --- a/case_utils/case_validate/__init__.py +++ b/case_utils/case_validate/__init__.py @@ -56,7 +56,7 @@ def main() -> None: # parser. logging.basicConfig(level=logging.DEBUG if ("--debug" in sys.argv or "-d" in sys.argv) else logging.INFO) - case_version_choices_list = ["none", "case-" + CURRENT_CASE_VERSION] + built_version_choices_list = ["none", "case-" + CURRENT_CASE_VERSION] # Add arguments specific to case_validate. parser.add_argument( @@ -67,7 +67,7 @@ def main() -> None: ) parser.add_argument( "--built-version", - choices=tuple(case_version_choices_list), + choices=tuple(built_version_choices_list), default="case-"+CURRENT_CASE_VERSION, help="Monolithic aggregation of CASE ontology files at certain versions. Does not require networking to use. Default is most recent CASE release." ) From e0ca0ce066047b765723a117e673308110d79366 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 13:31:12 -0500 Subject: [PATCH 36/49] Add multi-data-graph handling to case_validate References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- README.md | 2 +- case_utils/case_validate/__init__.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2f6a171..1367780 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ This repository provides `case_validate` as an adaptation of the `pyshacl` comma To see a human-readable validation report of an instance-data file: ```bash -case_validate input.json +case_validate input.json [input-2.json ...] ``` If `input.json` is not conformant, a report will be emitted, and `case_validate` will exit with status `1`. (This is a `pyshacl` behavior, where `0` and `1` report validation success. Status of >`1` is for other errors.) diff --git a/case_utils/case_validate/__init__.py b/case_utils/case_validate/__init__.py index de84989..97f7e66 100644 --- a/case_utils/case_validate/__init__.py +++ b/case_utils/case_validate/__init__.py @@ -119,12 +119,14 @@ def main() -> None: default=sys.stdout, ) - parser.add_argument("in_graph") + parser.add_argument("in_graph", nargs="+") args = parser.parse_args() data_graph = rdflib.Graph() - data_graph.parse(args.in_graph) + for in_graph in args.in_graph: + _logger.debug("in_graph = %r.", in_graph) + data_graph.parse(in_graph) ontology_graph = rdflib.Graph() if args.built_version != "none": From 822d2a1069e688fbaa5e93594ce560592dd5758e Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 13:33:57 -0500 Subject: [PATCH 37/49] Test case_validate multi-data-graph handling References: * [AC-210] Add validation command to CASE-Utilities-Python Signed-off-by: Alex Nelson --- tests/case_utils/case_validate/cli/Makefile | 35 ++++++++++++++++++- .../case_validate/cli/split_data_graph_1.json | 16 +++++++++ .../case_validate/cli/split_data_graph_2.json | 13 +++++++ .../cli/split_data_graph_PASS.txt | 2 ++ .../cli/split_data_graph_XFAIL.txt | 10 ++++++ 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 tests/case_utils/case_validate/cli/split_data_graph_1.json create mode 100644 tests/case_utils/case_validate/cli/split_data_graph_2.json create mode 100644 tests/case_utils/case_validate/cli/split_data_graph_PASS.txt create mode 100644 tests/case_utils/case_validate/cli/split_data_graph_XFAIL.txt diff --git a/tests/case_utils/case_validate/cli/Makefile b/tests/case_utils/case_validate/cli/Makefile index ac10b28..f61d421 100644 --- a/tests/case_utils/case_validate/cli/Makefile +++ b/tests/case_utils/case_validate/cli/Makefile @@ -39,7 +39,9 @@ files_to_generate := \ format_unspecified_output_jsonld.jsonld \ format_unspecified_output_turtle.ttl \ format_unspecified_output_txt.txt \ - format_unspecified_output_unspecified.txt + format_unspecified_output_unspecified.txt \ + split_data_graph_PASS.txt \ + split_data_graph_XFAIL.txt all: \ $(files_to_generate) @@ -183,3 +185,34 @@ format_unspecified_output_unspecified.txt: \ $< \ > _$@ mv _$@ $@ + +split_data_graph_PASS.txt: \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + split_data_graph_1.json \ + split_data_graph_2.json + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + split_data_graph_1.json \ + split_data_graph_2.json \ + > _$@ + mv _$@ $@ + +split_data_graph_XFAIL.txt: \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/.ontology.done.log \ + $(top_srcdir)/case_utils/case_validate/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + split_data_graph_1.json + rm -f _$@ + source $(tests_srcdir)/venv/bin/activate \ + && case_validate \ + --debug \ + split_data_graph_1.json \ + > _$@ \ + ; rc=$$? ; test 1 -eq $$rc + mv _$@ $@ diff --git a/tests/case_utils/case_validate/cli/split_data_graph_1.json b/tests/case_utils/case_validate/cli/split_data_graph_1.json new file mode 100644 index 0000000..04237ba --- /dev/null +++ b/tests/case_utils/case_validate/cli/split_data_graph_1.json @@ -0,0 +1,16 @@ +{ + "@context": { + "kb": "http://example.org/kb/", + "case-investigation": "https://ontology.caseontology.org/case/investigation/", + "uco-core": "https://unifiedcyberontology.org/ontology/uco/core#" + }, + "@graph": [ + { + "@id": "kb:provenance-record-1", + "@type": "case-investigation:ProvenanceRecord", + "uco-core:object": { + "@id": "kb:file-1" + } + } + ] +} diff --git a/tests/case_utils/case_validate/cli/split_data_graph_2.json b/tests/case_utils/case_validate/cli/split_data_graph_2.json new file mode 100644 index 0000000..54df483 --- /dev/null +++ b/tests/case_utils/case_validate/cli/split_data_graph_2.json @@ -0,0 +1,13 @@ +{ + "@context": { + "kb": "http://example.org/kb/", + "uco-observable": "https://unifiedcyberontology.org/ontology/uco/observable#" + }, + "@graph": [ + { + "@id": "kb:file-1", + "@type": "uco-observable:File" + } + ] +} + diff --git a/tests/case_utils/case_validate/cli/split_data_graph_PASS.txt b/tests/case_utils/case_validate/cli/split_data_graph_PASS.txt new file mode 100644 index 0000000..0c16da6 --- /dev/null +++ b/tests/case_utils/case_validate/cli/split_data_graph_PASS.txt @@ -0,0 +1,2 @@ +Validation Report +Conforms: True diff --git a/tests/case_utils/case_validate/cli/split_data_graph_XFAIL.txt b/tests/case_utils/case_validate/cli/split_data_graph_XFAIL.txt new file mode 100644 index 0000000..f5fa2c7 --- /dev/null +++ b/tests/case_utils/case_validate/cli/split_data_graph_XFAIL.txt @@ -0,0 +1,10 @@ +Validation Report +Conforms: False +Results (1): +Constraint Violation in ClassConstraintComponent (http://www.w3.org/ns/shacl#ClassConstraintComponent): + Severity: sh:Violation + Source Shape: [ sh:class core:UcoObject ; sh:minCount Literal("1", datatype=xsd:integer) ; sh:nodeKind sh:BlankNodeOrIRI ; sh:path core:object ] + Focus Node: kb:provenance-record-1 + Value Node: kb:file-1 + Result Path: core:object + Message: Value does not have class core:UcoObject From 8ca27948d921c8b84f143d449fe88f85d3017d06 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 14:31:18 -0500 Subject: [PATCH 38/49] Adjust formatting for existing arguments This is to prepare for a coming long-named flag specification. References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- case_utils/case_sparql_construct/__init__.py | 17 ++++++++++++++--- case_utils/case_sparql_select/__init__.py | 17 ++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/case_utils/case_sparql_construct/__init__.py b/case_utils/case_sparql_construct/__init__.py index f53df06..c119a0c 100644 --- a/case_utils/case_sparql_construct/__init__.py +++ b/case_utils/case_sparql_construct/__init__.py @@ -30,9 +30,20 @@ def main() -> None: parser = argparse.ArgumentParser() - parser.add_argument("-d", "--debug", action="store_true") - parser.add_argument("--disallow-empty-results", action="store_true", help="Raise error if no results are returned for query.") - parser.add_argument("--output-format", help="Override extension-based format guesser.") + parser.add_argument( + "-d", + "--debug", + action="store_true" + ) + parser.add_argument( + "--disallow-empty-results", + action="store_true", + help="Raise error if no results are returned for query." + ) + parser.add_argument( + "--output-format", + help="Override extension-based format guesser." + ) parser.add_argument("out_graph") parser.add_argument("in_sparql") parser.add_argument("in_graph", nargs="+") diff --git a/case_utils/case_sparql_select/__init__.py b/case_utils/case_sparql_select/__init__.py index 7bbb809..dc01f86 100644 --- a/case_utils/case_sparql_select/__init__.py +++ b/case_utils/case_sparql_select/__init__.py @@ -44,9 +44,20 @@ def main() -> None: parser = argparse.ArgumentParser() - parser.add_argument("-d", "--debug", action="store_true") - parser.add_argument("--disallow-empty-results", action="store_true", help="Raise error if no results are returned for query.") - parser.add_argument("out_table", help="Expected extensions are .html for HTML tables or .md for Markdown tables.") + parser.add_argument( + "-d", + "--debug", + action="store_true" + ) + parser.add_argument( + "--disallow-empty-results", + action="store_true", + help="Raise error if no results are returned for query." + ) + parser.add_argument( + "out_table", + help="Expected extensions are .html for HTML tables or .md for Markdown tables." + ) parser.add_argument("in_sparql") parser.add_argument("in_graph", nargs="+") args = parser.parse_args() From 9af628a47c101d628b04c8e6bef293c48bdf44cb Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 14:35:44 -0500 Subject: [PATCH 39/49] Configure logging before argument parsing This is to prepare for a coming function lookup of built ontology versions to use. References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- case_utils/case_sparql_construct/__init__.py | 9 ++++++--- case_utils/case_sparql_select/__init__.py | 7 +++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/case_utils/case_sparql_construct/__init__.py b/case_utils/case_sparql_construct/__init__.py index c119a0c..c129a6a 100644 --- a/case_utils/case_sparql_construct/__init__.py +++ b/case_utils/case_sparql_construct/__init__.py @@ -18,8 +18,9 @@ __version__ = "0.1.0" import argparse -import os import logging +import os +import sys import typing import rdflib.plugins.sparql # type: ignore @@ -30,6 +31,10 @@ def main() -> None: parser = argparse.ArgumentParser() + + # Configure debug logging before running parse_args, because there could be an error raised before the construction of the argument parser. + logging.basicConfig(level=logging.DEBUG if ("--debug" in sys.argv or "-d" in sys.argv) else logging.INFO) + parser.add_argument( "-d", "--debug", @@ -49,8 +54,6 @@ def main() -> None: parser.add_argument("in_graph", nargs="+") args = parser.parse_args() - logging.basicConfig(level=logging.DEBUG if args.debug else logging.INFO) - in_graph = rdflib.Graph() for in_graph_filename in args.in_graph: in_graph.parse(in_graph_filename) diff --git a/case_utils/case_sparql_select/__init__.py b/case_utils/case_sparql_select/__init__.py index dc01f86..f5b3862 100644 --- a/case_utils/case_sparql_select/__init__.py +++ b/case_utils/case_sparql_select/__init__.py @@ -32,6 +32,7 @@ import binascii import logging import os +import sys import pandas as pd # type: ignore import rdflib.plugins.sparql # type: ignore @@ -44,6 +45,10 @@ def main() -> None: parser = argparse.ArgumentParser() + + # Configure debug logging before running parse_args, because there could be an error raised before the construction of the argument parser. + logging.basicConfig(level=logging.DEBUG if ("--debug" in sys.argv or "-d" in sys.argv) else logging.INFO) + parser.add_argument( "-d", "--debug", @@ -62,8 +67,6 @@ def main() -> None: parser.add_argument("in_graph", nargs="+") args = parser.parse_args() - logging.basicConfig(level=logging.DEBUG if args.debug else logging.INFO) - graph = rdflib.Graph() for in_graph_filename in args.in_graph: graph.parse(in_graph_filename) From 16a5a2ba52b6317d346bd4d999ef0f8fec3f3da5 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 14:57:13 -0500 Subject: [PATCH 40/49] Build subclass hierarchy as additional static resource References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- Makefile | 2 + case_utils/ontology/Makefile | 34 +++++++++++++++- case_utils/ontology/src/README.md | 1 + case_utils/ontology/src/subclasses_ttl.py | 47 +++++++++++++++++++++++ 4 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 case_utils/ontology/src/README.md create mode 100644 case_utils/ontology/src/subclasses_ttl.py diff --git a/Makefile b/Makefile index fa526f6..aacc5ea 100644 --- a/Makefile +++ b/Makefile @@ -56,10 +56,12 @@ all: \ # Do not rebuild the current ontology file if it is already present. It is expected not to change once built. # touch -c: Do not create the file if it does not exist. This will convince the recursive make nothing needs to be done if the file is present. touch -c case_utils/ontology/case-$(case_version).ttl + touch -c case_utils/ontology/case-$(case_version)-subclasses.ttl $(MAKE) \ --directory case_utils/ontology # Confirm the current monolithic file is in place. test -r case_utils/ontology/case-$(case_version).ttl + test -r case_utils/ontology/case-$(case_version)-subclasses.ttl touch $@ check: \ diff --git a/case_utils/ontology/Makefile b/case_utils/ontology/Makefile index bd53acb..ab4e5db 100644 --- a/case_utils/ontology/Makefile +++ b/case_utils/ontology/Makefile @@ -24,6 +24,9 @@ RDF_TOOLKIT_JAR := $(case_srcdir)/lib/rdf-toolkit.jar case_version := $(shell python3 version_info.py) all: \ + case-$(case_version)-subclasses.ttl + +.PRECIOUS: \ case-$(case_version).ttl case-$(case_version).ttl: \ @@ -45,5 +48,34 @@ case-$(case_version).ttl: \ --target-format turtle mv _$@ $@ +case-$(case_version)-subclasses.ttl: \ + case-$(case_version).ttl \ + src/subclasses_ttl.py + # The CASE ontology test venv is made by the earlier build step + # of case_monolithic.ttl. However, unless a new ontology + # release is being made, that step will have been skipped. + # This recursive Make call guarantees the virtual environment is + # set up. + $(MAKE) \ + --directory $(case_srcdir)/tests \ + .venv.done.log + #TODO This cleanup step should be removed after the 0.3.0 release of CASE-Utility-SHACL-Inheritance-Reviewer. + test ! -d $(uco_srcdir)/dependencies/CASE-Utility-SHACL-Inheritance-Reviewer/build \ + || rm -rf \ + $(uco_srcdir)/dependencies/CASE-Utility-SHACL-Inheritance-Reviewer/build + source $(case_srcdir)/tests/venv/bin/activate \ + && python3 src/subclasses_ttl.py \ + __$@ \ + $< + java -jar $(RDF_TOOLKIT_JAR) \ + --inline-blank-nodes \ + --source __$@ \ + --source-format turtle \ + --target _$@ \ + --target-format turtle + rm __$@ + mv _$@ $@ + clean: - @rm -f case-$(case_version).ttl + @rm -f \ + case-$(case_version)*.ttl diff --git a/case_utils/ontology/src/README.md b/case_utils/ontology/src/README.md new file mode 100644 index 0000000..6068cc0 --- /dev/null +++ b/case_utils/ontology/src/README.md @@ -0,0 +1 @@ +This directory is not intended to be exported as part of the `case_utils` package. diff --git a/case_utils/ontology/src/subclasses_ttl.py b/case_utils/ontology/src/subclasses_ttl.py new file mode 100644 index 0000000..893d458 --- /dev/null +++ b/case_utils/ontology/src/subclasses_ttl.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 + +# 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. + +""" +This script creates an excerpt of an ontology graph that consists solely of all rdfs:subClassOf statements. +""" + +__version__ = "0.1.0" + +import argparse + +import rdflib + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("out_ttl") + parser.add_argument("in_ttl", nargs="+") + args = parser.parse_args() + + in_graph = rdflib.Graph() + out_graph = rdflib.Graph() + + in_ttl : str + for in_ttl in args.in_ttl: + in_graph.parse(in_ttl) + + for triple in in_graph.triples(( + None, + rdflib.RDFS.subClassOf, + None + )): + out_graph.add(triple) + + out_graph.serialize(args.out_ttl) + +if __name__ == "__main__": + main() From f4ec1751d04da79eb9d3f414dd937e62ef900815 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 15:04:52 -0500 Subject: [PATCH 41/49] Build case-0.5.0-subclasses.ttl References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- case_utils/ontology/case-0.5.0-subclasses.ttl | 1568 +++++++++++++++++ 1 file changed, 1568 insertions(+) create mode 100644 case_utils/ontology/case-0.5.0-subclasses.ttl diff --git a/case_utils/ontology/case-0.5.0-subclasses.ttl b/case_utils/ontology/case-0.5.0-subclasses.ttl new file mode 100644 index 0000000..15da4a3 --- /dev/null +++ b/case_utils/ontology/case-0.5.0-subclasses.ttl @@ -0,0 +1,1568 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xs: . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf + , + + ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + + + rdfs:subClassOf rdfs:Resource ; + . + From 6eb2be4124648963964398d9af5cd0bceca89e8e Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 15:26:04 -0500 Subject: [PATCH 42/49] Load subclass hierarchy when subClassOf used in query References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- README.md | 2 ++ case_utils/case_sparql_construct/__init__.py | 15 ++++++++- case_utils/case_sparql_select/__init__.py | 16 +++++++++- case_utils/ontology/__init__.py | 32 +++++++++++++++++++ .../case_utils/case_sparql_construct/Makefile | 2 ++ tests/case_utils/case_sparql_select/Makefile | 2 ++ 6 files changed, 67 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1367780..e7d036b 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,8 @@ case_file --disable-hashes sample.txt.json sample.txt Two commands are provided to generate output from a SPARQL query and one or more input graphs. Input graphs can be any graph, such as instance data or supplementary ontology files that supply custom class definitions or other external ontologies. +These commands can be used with any RDF files to run arbitrary SPARQL queries. They have one additional behavior tailored to CASE: If a path query is used for subclasses, the CASE subclass hierarchy will be loaded to supplement the input graph. An expected use case of this feature is subclasses of `ObservableObject`. For instance, if a data graph included an object with only the class `uco-observable:File` specified, the query `?x a/rdfs:subClassOf* uco-observable:ObservableObject` would match `?x` against that object. + #### `case_sparql_construct` diff --git a/case_utils/case_sparql_construct/__init__.py b/case_utils/case_sparql_construct/__init__.py index c129a6a..abcdd27 100644 --- a/case_utils/case_sparql_construct/__init__.py +++ b/case_utils/case_sparql_construct/__init__.py @@ -25,7 +25,9 @@ import rdflib.plugins.sparql # type: ignore -import case_utils +import case_utils.ontology + +from case_utils.ontology.version_info import * _logger = logging.getLogger(os.path.basename(__file__)) @@ -35,11 +37,19 @@ def main() -> None: # Configure debug logging before running parse_args, because there could be an error raised before the construction of the argument parser. logging.basicConfig(level=logging.DEBUG if ("--debug" in sys.argv or "-d" in sys.argv) else logging.INFO) + built_version_choices_list = ["none", "case-" + CURRENT_CASE_VERSION] + parser.add_argument( "-d", "--debug", action="store_true" ) + parser.add_argument( + "--built-version", + choices=tuple(built_version_choices_list), + default="case-"+CURRENT_CASE_VERSION, + help="Ontology version to use to supplement query, such as for subclass querying. Does not require networking to use. Default is most recent CASE release." + ) parser.add_argument( "--disallow-empty-results", action="store_true", @@ -72,6 +82,9 @@ def main() -> None: construct_query_text = in_fh.read().strip() assert not construct_query_text is None + if "subClassOf" in construct_query_text: + case_utils.ontology.load_subclass_hierarchy(in_graph, built_version=args.built_version) + construct_query_object = rdflib.plugins.sparql.prepareQuery(construct_query_text, initNs=nsdict) # https://rdfextras.readthedocs.io/en/latest/working_with.html diff --git a/case_utils/case_sparql_select/__init__.py b/case_utils/case_sparql_select/__init__.py index f5b3862..12404f1 100644 --- a/case_utils/case_sparql_select/__init__.py +++ b/case_utils/case_sparql_select/__init__.py @@ -30,6 +30,7 @@ import argparse import binascii +import importlib.resources import logging import os import sys @@ -37,7 +38,9 @@ import pandas as pd # type: ignore import rdflib.plugins.sparql # type: ignore -import case_utils +import case_utils.ontology + +from case_utils.ontology.version_info import * NS_XSD = rdflib.XSD @@ -49,11 +52,19 @@ def main() -> None: # Configure debug logging before running parse_args, because there could be an error raised before the construction of the argument parser. logging.basicConfig(level=logging.DEBUG if ("--debug" in sys.argv or "-d" in sys.argv) else logging.INFO) + built_version_choices_list = ["none", "case-" + CURRENT_CASE_VERSION] + parser.add_argument( "-d", "--debug", action="store_true" ) + parser.add_argument( + "--built-version", + choices=tuple(built_version_choices_list), + default="case-"+CURRENT_CASE_VERSION, + help="Ontology version to use to supplement query, such as for subclass querying. Does not require networking to use. Default is most recent CASE release." + ) parser.add_argument( "--disallow-empty-results", action="store_true", @@ -79,6 +90,9 @@ def main() -> None: select_query_text = in_fh.read().strip() _logger.debug("select_query_text = %r." % select_query_text) + if "subClassOf" in select_query_text: + case_utils.ontology.load_subclass_hierarchy(graph, built_version=args.built_version) + # Build columns list from SELECT line. select_query_text_lines = select_query_text.split("\n") select_line = [line for line in select_query_text_lines if line.startswith("SELECT ")][0] diff --git a/case_utils/ontology/__init__.py b/case_utils/ontology/__init__.py index 081745d..eb14af5 100644 --- a/case_utils/ontology/__init__.py +++ b/case_utils/ontology/__init__.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + # 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 @@ -8,3 +10,33 @@ # reliability, or any other characteristic. # # We would appreciate acknowledgement if the software is used. + +__version__ = "0.1.0" + +import importlib.resources +import logging +import os + +import rdflib + +# Yes, this next import is self-referential (/circular). But, it does work with importlib. +import case_utils.ontology + +from .version_info import * + +_logger = logging.getLogger(os.path.basename(__file__)) + +def load_subclass_hierarchy( + graph : rdflib.Graph, + *, + built_version : str = "case-"+CURRENT_CASE_VERSION +) -> None: + """ + Adds all ontology rdfs:subClassOf statements from the version referred to by built_version. + """ + if built_version != "none": + _logger.debug("Loading subclass hierarchy.") + ttl_filename = built_version + "-subclasses.ttl" + _logger.debug("ttl_filename = %r.", ttl_filename) + ttl_data = importlib.resources.read_text(case_utils.ontology, ttl_filename) + graph.parse(data=ttl_data) diff --git a/tests/case_utils/case_sparql_construct/Makefile b/tests/case_utils/case_sparql_construct/Makefile index d0dabb3..dac64fe 100644 --- a/tests/case_utils/case_sparql_construct/Makefile +++ b/tests/case_utils/case_sparql_construct/Makefile @@ -37,6 +37,8 @@ clean: output.%: \ $(tests_srcdir)/.venv.done.log \ $(top_srcdir)/case_utils/case_sparql_construct/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + $(top_srcdir)/case_utils/ontology/version_info.py \ input-1.sparql \ input-2.ttl \ input-3.json diff --git a/tests/case_utils/case_sparql_select/Makefile b/tests/case_utils/case_sparql_select/Makefile index 6070739..7422a23 100644 --- a/tests/case_utils/case_sparql_select/Makefile +++ b/tests/case_utils/case_sparql_select/Makefile @@ -53,6 +53,8 @@ clean: output.%: \ $(tests_srcdir)/.venv.done.log \ $(top_srcdir)/case_utils/case_sparql_select/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + $(top_srcdir)/case_utils/ontology/version_info.py \ input-1.sparql \ input-2.ttl \ input-3.json From 6ae59f31957f179de374dd91f2759edddb4b8ce1 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 16:39:21 -0500 Subject: [PATCH 43/49] Move W3C test data files to "w3-" prefixed files References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- .../case_sparql_construct/.gitignore | 3 +- .../case_utils/case_sparql_construct/Makefile | 21 +++++----- .../case_sparql_construct/README.md | 15 +++---- .../test_case_sparql_construct.py | 10 ++--- .../{input-1.sparql => w3-input-1.sparql} | 0 .../{input-2.ttl => w3-input-2.ttl} | 0 .../{input-3.json => w3-input-3.json} | 0 ...heck-output.html => .check-w3-output.html} | 0 .../{.check-output.md => .check-w3-output.md} | 0 .../case_utils/case_sparql_select/.gitignore | 3 +- tests/case_utils/case_sparql_select/Makefile | 40 +++++++++---------- .../{input-1.sparql => w3-input-1.sparql} | 0 .../{input-2.ttl => w3-input-2.ttl} | 0 .../{input-3.json => w3-input-3.json} | 0 14 files changed, 46 insertions(+), 46 deletions(-) rename tests/case_utils/case_sparql_construct/{input-1.sparql => w3-input-1.sparql} (100%) rename tests/case_utils/case_sparql_construct/{input-2.ttl => w3-input-2.ttl} (100%) rename tests/case_utils/case_sparql_construct/{input-3.json => w3-input-3.json} (100%) rename tests/case_utils/case_sparql_select/{.check-output.html => .check-w3-output.html} (100%) rename tests/case_utils/case_sparql_select/{.check-output.md => .check-w3-output.md} (100%) rename tests/case_utils/case_sparql_select/{input-1.sparql => w3-input-1.sparql} (100%) rename tests/case_utils/case_sparql_select/{input-2.ttl => w3-input-2.ttl} (100%) rename tests/case_utils/case_sparql_select/{input-3.json => w3-input-3.json} (100%) diff --git a/tests/case_utils/case_sparql_construct/.gitignore b/tests/case_utils/case_sparql_construct/.gitignore index 6553b72..1ca1147 100644 --- a/tests/case_utils/case_sparql_construct/.gitignore +++ b/tests/case_utils/case_sparql_construct/.gitignore @@ -1,2 +1 @@ -output.json -output.ttl +w3-output.* diff --git a/tests/case_utils/case_sparql_construct/Makefile b/tests/case_utils/case_sparql_construct/Makefile index dac64fe..222f1d7 100644 --- a/tests/case_utils/case_sparql_construct/Makefile +++ b/tests/case_utils/case_sparql_construct/Makefile @@ -18,11 +18,12 @@ top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests all: \ - output.ttl + w3-output.json \ + w3-output.ttl check: \ - output.json \ - output.ttl + w3-output.json \ + w3-output.ttl source $(tests_srcdir)/venv/bin/activate \ && pytest \ --log-level=DEBUG @@ -34,18 +35,18 @@ clean: output.* \ _* -output.%: \ +w3-output.%: \ $(tests_srcdir)/.venv.done.log \ $(top_srcdir)/case_utils/case_sparql_construct/__init__.py \ $(top_srcdir)/case_utils/ontology/__init__.py \ $(top_srcdir)/case_utils/ontology/version_info.py \ - input-1.sparql \ - input-2.ttl \ - input-3.json + w3-input-1.sparql \ + w3-input-2.ttl \ + w3-input-3.json source $(tests_srcdir)/venv/bin/activate \ && case_sparql_construct \ _$@ \ - input-1.sparql \ - input-2.ttl \ - input-3.json + w3-input-1.sparql \ + w3-input-2.ttl \ + w3-input-3.json mv _$@ $@ diff --git a/tests/case_utils/case_sparql_construct/README.md b/tests/case_utils/case_sparql_construct/README.md index bab41ac..7a36679 100644 --- a/tests/case_utils/case_sparql_construct/README.md +++ b/tests/case_utils/case_sparql_construct/README.md @@ -1,16 +1,17 @@ # Test of CASE SPARQL CONSTRUCT query runner +The tests in this directory confirms `case_sparql_construct` satisfies a base set of expected command line functionality. + ## Test procedure -The tests in this directory confirms `case_sparql_construct` satisfies a base set of expected command line functionality. -1. Inputs - `input-2.ttl` and `input-3.json` contain a small graph split across two files, and `input-1.sparql` contains a SPARQL `CONSTRUCT` query. -2. Outputs - `output.ttl` is generated by using `case_sparql_construct` to run `input-1.sparql` against the two `input-*.*` graph files. This affirms that `case_sparql_construct` can read multiple input files of differing formats. -3. Output verification - two name-pairs should have vcard records generated. The test `test_templates_with_blank_nodes_result()` confirms those pairs are in the output graph. +1. Inputs - `w3-input-2.ttl` and `w3-input-3.json` contain a small graph split across two files, and `w3-input-1.sparql` contains a SPARQL `CONSTRUCT` query. +2. Outputs - `w3-output.ttl` is generated by using `case_sparql_construct` to run `w3-input-1.sparql` against the two `w3-input-*.*` graph files. This affirms that `case_sparql_construct` can read multiple input files of differing formats. +3. Output verification - two name-pairs should have vcard records generated. The tests `test_w3_templates_with_blank_nodes_result_json()` and `_turtle()` confirm those pairs are in the output graphs. ## References -The data and query used in `input-2.ttl`, `input-3.json` and `input.sparql` are copied from ["SPARQL Query Language for RDF", Section 10.2.1](https://www.w3.org/TR/rdf-sparql-query/#tempatesWithBNodes), with these modifications: -* `input-2.ttl` contains the original example's `_:a` (Alice) records, but drops the `_:b` (Bob) records. -* `input-3.json` is a conversion of the original Turtle example's `_:b` records to JSON-LD. +The data and query used in `w3-input-2.ttl`, `w3-input-3.json` and `w3-input.sparql` are copied from ["SPARQL Query Language for RDF", Section 10.2.1](https://www.w3.org/TR/rdf-sparql-query/#tempatesWithBNodes), with these modifications: +* `w3-input-2.ttl` contains the original example's `_:a` (Alice) records, but drops the `_:b` (Bob) records. +* `w3-input-3.json` is a conversion of the original Turtle example's `_:b` records to JSON-LD. diff --git a/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py b/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py index 1d919c1..e1b220a 100644 --- a/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py +++ b/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py @@ -17,7 +17,7 @@ import case_utils -def _test_templates_with_blank_nodes_result( +def _test_w3_templates_with_blank_nodes_result( filename : str ) -> None: ground_truth_positive = { @@ -52,8 +52,8 @@ def _test_templates_with_blank_nodes_result( )) assert computed == ground_truth_positive -def test_templates_with_blank_nodes_result_json() -> None: - _test_templates_with_blank_nodes_result("output.json") +def test_w3_templates_with_blank_nodes_result_json() -> None: + _test_w3_templates_with_blank_nodes_result("w3-output.json") -def test_templates_with_blank_nodes_result_turtle() -> None: - _test_templates_with_blank_nodes_result("output.ttl") +def test_w3_templates_with_blank_nodes_result_turtle() -> None: + _test_w3_templates_with_blank_nodes_result("w3-output.ttl") diff --git a/tests/case_utils/case_sparql_construct/input-1.sparql b/tests/case_utils/case_sparql_construct/w3-input-1.sparql similarity index 100% rename from tests/case_utils/case_sparql_construct/input-1.sparql rename to tests/case_utils/case_sparql_construct/w3-input-1.sparql diff --git a/tests/case_utils/case_sparql_construct/input-2.ttl b/tests/case_utils/case_sparql_construct/w3-input-2.ttl similarity index 100% rename from tests/case_utils/case_sparql_construct/input-2.ttl rename to tests/case_utils/case_sparql_construct/w3-input-2.ttl diff --git a/tests/case_utils/case_sparql_construct/input-3.json b/tests/case_utils/case_sparql_construct/w3-input-3.json similarity index 100% rename from tests/case_utils/case_sparql_construct/input-3.json rename to tests/case_utils/case_sparql_construct/w3-input-3.json diff --git a/tests/case_utils/case_sparql_select/.check-output.html b/tests/case_utils/case_sparql_select/.check-w3-output.html similarity index 100% rename from tests/case_utils/case_sparql_select/.check-output.html rename to tests/case_utils/case_sparql_select/.check-w3-output.html diff --git a/tests/case_utils/case_sparql_select/.check-output.md b/tests/case_utils/case_sparql_select/.check-w3-output.md similarity index 100% rename from tests/case_utils/case_sparql_select/.check-output.md rename to tests/case_utils/case_sparql_select/.check-w3-output.md diff --git a/tests/case_utils/case_sparql_select/.gitignore b/tests/case_utils/case_sparql_select/.gitignore index a85ef3b..1ca1147 100644 --- a/tests/case_utils/case_sparql_select/.gitignore +++ b/tests/case_utils/case_sparql_select/.gitignore @@ -1,2 +1 @@ -output.html -output.md +w3-output.* diff --git a/tests/case_utils/case_sparql_select/Makefile b/tests/case_utils/case_sparql_select/Makefile index 7422a23..b24f584 100644 --- a/tests/case_utils/case_sparql_select/Makefile +++ b/tests/case_utils/case_sparql_select/Makefile @@ -18,28 +18,28 @@ top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests all: \ - output.html \ - output.md + w3-output.html \ + w3-output.md .PHONY: \ - check-html \ - check-markdown + check-w3-html \ + check-w3-markdown .PRECIOUS: \ - output.% + w3-output.% check: \ - check-html \ - check-markdown + check-w3-html \ + check-w3-markdown -check-html: \ - .check-output.html \ - output.html +check-w3-html: \ + .check-w3-output.html \ + w3-output.html diff $^ -check-markdown: \ - .check-output.md \ - output.md +check-w3-markdown: \ + .check-w3-output.md \ + w3-output.md diff $^ clean: @@ -50,18 +50,18 @@ clean: *.md \ _* -output.%: \ +w3-output.%: \ $(tests_srcdir)/.venv.done.log \ $(top_srcdir)/case_utils/case_sparql_select/__init__.py \ $(top_srcdir)/case_utils/ontology/__init__.py \ $(top_srcdir)/case_utils/ontology/version_info.py \ - input-1.sparql \ - input-2.ttl \ - input-3.json + w3-input-1.sparql \ + w3-input-2.ttl \ + w3-input-3.json source $(tests_srcdir)/venv/bin/activate \ && case_sparql_select \ _$@ \ - input-1.sparql \ - input-2.ttl \ - input-3.json + w3-input-1.sparql \ + w3-input-2.ttl \ + w3-input-3.json mv _$@ $@ diff --git a/tests/case_utils/case_sparql_select/input-1.sparql b/tests/case_utils/case_sparql_select/w3-input-1.sparql similarity index 100% rename from tests/case_utils/case_sparql_select/input-1.sparql rename to tests/case_utils/case_sparql_select/w3-input-1.sparql diff --git a/tests/case_utils/case_sparql_select/input-2.ttl b/tests/case_utils/case_sparql_select/w3-input-2.ttl similarity index 100% rename from tests/case_utils/case_sparql_select/input-2.ttl rename to tests/case_utils/case_sparql_select/w3-input-2.ttl diff --git a/tests/case_utils/case_sparql_select/input-3.json b/tests/case_utils/case_sparql_select/w3-input-3.json similarity index 100% rename from tests/case_utils/case_sparql_select/input-3.json rename to tests/case_utils/case_sparql_select/w3-input-3.json From 4cf096712c97a3142a350f2fefb0d30fcaa4e496 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 16:57:38 -0500 Subject: [PATCH 44/49] Add subclass tests for case_sparql_* commands References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- .../case_sparql_construct/.gitignore | 1 + .../case_utils/case_sparql_construct/Makefile | 33 ++++++++++++ .../case_sparql_construct/README.md | 19 +++++-- .../case_sparql_construct/subclass.json | 16 ++++++ .../case_sparql_construct/subclass.sparql | 9 ++++ .../test_case_sparql_construct.py | 38 ++++++++++++++ .../.check-subclass-explicit-none.md | 3 ++ .../.check-subclass-implicit-any.md | 4 ++ .../case_utils/case_sparql_select/.gitignore | 1 + tests/case_utils/case_sparql_select/Makefile | 52 ++++++++++++++++++- .../case_sparql_select/subclass.json | 16 ++++++ .../case_sparql_select/subclass.sparql | 5 ++ 12 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 tests/case_utils/case_sparql_construct/subclass.json create mode 100644 tests/case_utils/case_sparql_construct/subclass.sparql create mode 100644 tests/case_utils/case_sparql_select/.check-subclass-explicit-none.md create mode 100644 tests/case_utils/case_sparql_select/.check-subclass-implicit-any.md create mode 100644 tests/case_utils/case_sparql_select/subclass.json create mode 100644 tests/case_utils/case_sparql_select/subclass.sparql diff --git a/tests/case_utils/case_sparql_construct/.gitignore b/tests/case_utils/case_sparql_construct/.gitignore index 1ca1147..376ddf7 100644 --- a/tests/case_utils/case_sparql_construct/.gitignore +++ b/tests/case_utils/case_sparql_construct/.gitignore @@ -1 +1,2 @@ +subclass-*.ttl w3-output.* diff --git a/tests/case_utils/case_sparql_construct/Makefile b/tests/case_utils/case_sparql_construct/Makefile index 222f1d7..d749fe7 100644 --- a/tests/case_utils/case_sparql_construct/Makefile +++ b/tests/case_utils/case_sparql_construct/Makefile @@ -18,10 +18,14 @@ top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests all: \ + subclass-explicit-none.ttl \ + subclass-implicit-any.ttl \ w3-output.json \ w3-output.ttl check: \ + subclass-explicit-none.ttl \ + subclass-implicit-any.ttl \ w3-output.json \ w3-output.ttl source $(tests_srcdir)/venv/bin/activate \ @@ -35,6 +39,35 @@ clean: output.* \ _* +subclass-explicit-none.ttl: \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/case_utils/case_sparql_construct/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + $(top_srcdir)/case_utils/ontology/version_info.py \ + subclass.json \ + subclass.sparql + source $(tests_srcdir)/venv/bin/activate \ + && case_sparql_construct \ + --built-version none \ + _$@ \ + subclass.sparql \ + subclass.json + mv _$@ $@ + +subclass-implicit-any.ttl: \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/case_utils/case_sparql_construct/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + $(top_srcdir)/case_utils/ontology/version_info.py \ + subclass.json \ + subclass.sparql + source $(tests_srcdir)/venv/bin/activate \ + && case_sparql_construct \ + _$@ \ + subclass.sparql \ + subclass.json + mv _$@ $@ + w3-output.%: \ $(tests_srcdir)/.venv.done.log \ $(top_srcdir)/case_utils/case_sparql_construct/__init__.py \ diff --git a/tests/case_utils/case_sparql_construct/README.md b/tests/case_utils/case_sparql_construct/README.md index 7a36679..9c125f8 100644 --- a/tests/case_utils/case_sparql_construct/README.md +++ b/tests/case_utils/case_sparql_construct/README.md @@ -1,17 +1,30 @@ -# Test of CASE SPARQL CONSTRUCT query runner +# Tests of CASE SPARQL CONSTRUCT query runner The tests in this directory confirms `case_sparql_construct` satisfies a base set of expected command line functionality. -## Test procedure +## Test 1 - CONSTRUCT from W3C example + + +### Test procedure 1. Inputs - `w3-input-2.ttl` and `w3-input-3.json` contain a small graph split across two files, and `w3-input-1.sparql` contains a SPARQL `CONSTRUCT` query. 2. Outputs - `w3-output.ttl` is generated by using `case_sparql_construct` to run `w3-input-1.sparql` against the two `w3-input-*.*` graph files. This affirms that `case_sparql_construct` can read multiple input files of differing formats. 3. Output verification - two name-pairs should have vcard records generated. The tests `test_w3_templates_with_blank_nodes_result_json()` and `_turtle()` confirm those pairs are in the output graphs. -## References +### References The data and query used in `w3-input-2.ttl`, `w3-input-3.json` and `w3-input.sparql` are copied from ["SPARQL Query Language for RDF", Section 10.2.1](https://www.w3.org/TR/rdf-sparql-query/#tempatesWithBNodes), with these modifications: * `w3-input-2.ttl` contains the original example's `_:a` (Alice) records, but drops the `_:b` (Bob) records. * `w3-input-3.json` is a conversion of the original Turtle example's `_:b` records to JSON-LD. + + +## Test 2 - CASE subclass inference + + +### Test procedure + +1. Inputs - `subclass.json` contain a small graph with two resources that are `ObservableObject`s. `kb:file-1` is explicitly an `ObservableObject`. `kb:file-2` is implicitly an `ObservableObject`, by way of `File` being a subclass of `ObservableObject`. `subclass.sparql` queries for all `ObservableObject`s, to construct an additional extending statement that they are also [`prov:Entity`](https://www.w3.org/TR/prov-o/#Entity)s. +2. Outputs - `subclass-implicit-any.ttl` is the constructed graph that uses CASE's subclass hierarchy. `subclass-explicit-none.ttl` is the constructed graph that foregoes any implicit CASE ontology structure, via the `--built-version none` flag. +3. Output verification - See the tests `test_subclass_templates_result_default_case` and `test_subclass_templates_result_no_case`, that verify foregoing the CASE subclass structure means one node is missed by the `CONSTRUCT` query. diff --git a/tests/case_utils/case_sparql_construct/subclass.json b/tests/case_utils/case_sparql_construct/subclass.json new file mode 100644 index 0000000..57646b1 --- /dev/null +++ b/tests/case_utils/case_sparql_construct/subclass.json @@ -0,0 +1,16 @@ +{ + "@context": { + "kb": "http://example.org/kb/", + "uco-observable": "https://unifiedcyberontology.org/ontology/uco/observable#" + }, + "@graph": [ + { + "@id": "kb:file-1", + "@type": "uco-observable:ObservableObject" + }, + { + "@id": "kb:file-2", + "@type": "uco-observable:File" + } + ] +} diff --git a/tests/case_utils/case_sparql_construct/subclass.sparql b/tests/case_utils/case_sparql_construct/subclass.sparql new file mode 100644 index 0000000..b0b1868 --- /dev/null +++ b/tests/case_utils/case_sparql_construct/subclass.sparql @@ -0,0 +1,9 @@ +PREFIX prov: +PREFIX uco-observable: +CONSTRUCT { + ?nEntity a prov:Entity . +} +WHERE +{ + ?nEntity a/rdfs:subClassOf* uco-observable:ObservableObject . +} diff --git a/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py b/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py index e1b220a..b111d9e 100644 --- a/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py +++ b/tests/case_utils/case_sparql_construct/test_case_sparql_construct.py @@ -17,6 +17,27 @@ import case_utils +def _test_subclass_templates_result( + filename : str, + expected : typing.Set[str] +) -> None: + computed : typing.Set[str] = set() + + graph = rdflib.Graph() + graph.parse(filename) + + query_string = """\ +PREFIX prov: +SELECT ?nEntity +WHERE { + ?nEntity a prov:Entity +} +""" + for result in graph.query(query_string): + n_entity = result[0] + computed.add(n_entity.toPython()) + assert expected == computed + def _test_w3_templates_with_blank_nodes_result( filename : str ) -> None: @@ -57,3 +78,20 @@ def test_w3_templates_with_blank_nodes_result_json() -> None: def test_w3_templates_with_blank_nodes_result_turtle() -> None: _test_w3_templates_with_blank_nodes_result("w3-output.ttl") + +def test_subclass_templates_result_default_case() -> None: + _test_subclass_templates_result( + "subclass-implicit-any.ttl", + { + "http://example.org/kb/file-1", + "http://example.org/kb/file-2" + } + ) + +def test_subclass_templates_result_no_case() -> None: + _test_subclass_templates_result( + "subclass-explicit-none.ttl", + { + "http://example.org/kb/file-1" + } + ) diff --git a/tests/case_utils/case_sparql_select/.check-subclass-explicit-none.md b/tests/case_utils/case_sparql_select/.check-subclass-explicit-none.md new file mode 100644 index 0000000..5d9d1ef --- /dev/null +++ b/tests/case_utils/case_sparql_select/.check-subclass-explicit-none.md @@ -0,0 +1,3 @@ +| | ?nFile | +|----|------------------------------| +| 0 | http://example.org/kb/file-1 | \ No newline at end of file diff --git a/tests/case_utils/case_sparql_select/.check-subclass-implicit-any.md b/tests/case_utils/case_sparql_select/.check-subclass-implicit-any.md new file mode 100644 index 0000000..251fcf6 --- /dev/null +++ b/tests/case_utils/case_sparql_select/.check-subclass-implicit-any.md @@ -0,0 +1,4 @@ +| | ?nFile | +|----|------------------------------| +| 0 | http://example.org/kb/file-1 | +| 1 | http://example.org/kb/file-2 | \ No newline at end of file diff --git a/tests/case_utils/case_sparql_select/.gitignore b/tests/case_utils/case_sparql_select/.gitignore index 1ca1147..0ae4849 100644 --- a/tests/case_utils/case_sparql_select/.gitignore +++ b/tests/case_utils/case_sparql_select/.gitignore @@ -1 +1,2 @@ +subclass-*.md w3-output.* diff --git a/tests/case_utils/case_sparql_select/Makefile b/tests/case_utils/case_sparql_select/Makefile index b24f584..22a849b 100644 --- a/tests/case_utils/case_sparql_select/Makefile +++ b/tests/case_utils/case_sparql_select/Makefile @@ -18,19 +18,40 @@ top_srcdir := $(shell cd ../../.. ; pwd) tests_srcdir := $(top_srcdir)/tests all: \ + subclass-explicit-none.md \ + subclass-implicit-any.md \ w3-output.html \ w3-output.md .PHONY: \ + check-subclass \ + check-subclass-explicit-none \ + check-subclass-implicit-any \ check-w3-html \ check-w3-markdown .PRECIOUS: \ + subclass-% \ w3-output.% check: \ check-w3-html \ - check-w3-markdown + check-w3-markdown \ + check-subclass + +check-subclass: \ + check-subclass-explicit-none \ + check-subclass-implicit-any + +check-subclass-explicit-none: \ + .check-subclass-explicit-none.md \ + subclass-explicit-none.md + diff $^ + +check-subclass-implicit-any: \ + .check-subclass-implicit-any.md \ + subclass-implicit-any.md + diff $^ check-w3-html: \ .check-w3-output.html \ @@ -50,6 +71,35 @@ clean: *.md \ _* +subclass-explicit-none.md: \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/case_utils/case_sparql_select/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + $(top_srcdir)/case_utils/ontology/version_info.py \ + subclass.json \ + subclass.sparql + source $(tests_srcdir)/venv/bin/activate \ + && case_sparql_select \ + --built-version none \ + _$@ \ + subclass.sparql \ + subclass.json + mv _$@ $@ + +subclass-implicit-any.md: \ + $(tests_srcdir)/.venv.done.log \ + $(top_srcdir)/case_utils/case_sparql_select/__init__.py \ + $(top_srcdir)/case_utils/ontology/__init__.py \ + $(top_srcdir)/case_utils/ontology/version_info.py \ + subclass.json \ + subclass.sparql + source $(tests_srcdir)/venv/bin/activate \ + && case_sparql_select \ + _$@ \ + subclass.sparql \ + subclass.json + mv _$@ $@ + w3-output.%: \ $(tests_srcdir)/.venv.done.log \ $(top_srcdir)/case_utils/case_sparql_select/__init__.py \ diff --git a/tests/case_utils/case_sparql_select/subclass.json b/tests/case_utils/case_sparql_select/subclass.json new file mode 100644 index 0000000..57646b1 --- /dev/null +++ b/tests/case_utils/case_sparql_select/subclass.json @@ -0,0 +1,16 @@ +{ + "@context": { + "kb": "http://example.org/kb/", + "uco-observable": "https://unifiedcyberontology.org/ontology/uco/observable#" + }, + "@graph": [ + { + "@id": "kb:file-1", + "@type": "uco-observable:ObservableObject" + }, + { + "@id": "kb:file-2", + "@type": "uco-observable:File" + } + ] +} diff --git a/tests/case_utils/case_sparql_select/subclass.sparql b/tests/case_utils/case_sparql_select/subclass.sparql new file mode 100644 index 0000000..9c52721 --- /dev/null +++ b/tests/case_utils/case_sparql_select/subclass.sparql @@ -0,0 +1,5 @@ +PREFIX uco-observable: +SELECT ?nFile +WHERE { + ?nFile a/rdfs:subClassOf* uco-observable:ObservableObject . +} From 8fe74619d636ea11275cc5702b7e3164003aef47 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 16:59:18 -0500 Subject: [PATCH 45/49] Load subclass hierarchy to prepare for case_file implying ObservableObject superclass References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- tests/case_utils/case_file/test_case_file.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/case_utils/case_file/test_case_file.py b/tests/case_utils/case_file/test_case_file.py index acbad79..19ba199 100644 --- a/tests/case_utils/case_file/test_case_file.py +++ b/tests/case_utils/case_file/test_case_file.py @@ -18,6 +18,8 @@ import pytest import rdflib.plugins.sparql # type: ignore +import case_utils.ontology + _logger = logging.getLogger(os.path.basename(__file__)) IRI_UCO_CORE = "https://unifiedcyberontology.org/ontology/uco/core#" @@ -42,6 +44,8 @@ def load_graph( ) -> rdflib.Graph: in_graph = rdflib.Graph() in_graph.parse(filename) + # The queries in this test rely on the subclass hierarchy. Load it. + case_utils.ontology.load_subclass_hierarchy(in_graph) return in_graph @pytest.fixture From fcfdd4bce3c01b44116948ecd13236ed13dbaa23 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 17:01:56 -0500 Subject: [PATCH 46/49] Use ObservableObject subclass File for case_file References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- case_utils/case_file/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/case_utils/case_file/__init__.py b/case_utils/case_file/__init__.py index a25481d..3ac56ac 100644 --- a/case_utils/case_file/__init__.py +++ b/case_utils/case_file/__init__.py @@ -85,7 +85,7 @@ def create_file_node( graph.add(( n_file, NS_RDF.type, - NS_UCO_OBSERVABLE.ObservableObject + NS_UCO_OBSERVABLE.File )) basename = os.path.basename(filepath) From 6f9458f41114fb932e156fd3bcca39219b2882df Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 17:05:30 -0500 Subject: [PATCH 47/49] Regenerate Make-managed files References: * [UCO OC-65] (CP-13) UCO needs subclasses of ObservableObject Signed-off-by: Alex Nelson --- tests/case_utils/case_file/kb.json | 4 +-- tests/case_utils/case_file/kb.ttl | 4 +-- .../case_file/sample.txt-disable_hashes.ttl | 2 +- .../case_file/sample.txt-nocompact.json | 26 +++++++++---------- tests/case_utils/case_file/sample.txt.json | 26 +++++++++---------- tests/case_utils/case_file/sample.txt.ttl | 2 +- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/tests/case_utils/case_file/kb.json b/tests/case_utils/case_file/kb.json index 5f3863b..eadf906 100644 --- a/tests/case_utils/case_file/kb.json +++ b/tests/case_utils/case_file/kb.json @@ -10,7 +10,7 @@ "@graph": [ { "@id": "kb:file-69751792-9d04-5f5f-8791-99ca3729cd3c", - "@type": "uco-observable:ObservableObject", + "@type": "uco-observable:File", "uco-core:hasFacet": { "@type": "uco-observable:FileFacet", "uco-observable:fileName": "sample.txt", @@ -26,7 +26,7 @@ }, { "@id": "kb:file-9477a6eb-3a94-590b-b51e-6ce6892f0941", - "@type": "uco-observable:ObservableObject", + "@type": "uco-observable:File", "uco-core:hasFacet": [ { "@type": "uco-observable:ContentDataFacet", diff --git a/tests/case_utils/case_file/kb.ttl b/tests/case_utils/case_file/kb.ttl index 0fb50ca..f82b0f3 100644 --- a/tests/case_utils/case_file/kb.ttl +++ b/tests/case_utils/case_file/kb.ttl @@ -9,7 +9,7 @@ @prefix xsd: . kb:file-69751792-9d04-5f5f-8791-99ca3729cd3c - a uco-observable:ObservableObject ; + a uco-observable:File ; uco-core:hasFacet [ a uco-observable:FileFacet ; uco-observable:fileName "sample.txt" ; @@ -19,7 +19,7 @@ kb:file-69751792-9d04-5f5f-8791-99ca3729cd3c . kb:file-9477a6eb-3a94-590b-b51e-6ce6892f0941 - a uco-observable:ObservableObject ; + a uco-observable:File ; uco-core:hasFacet [ a uco-observable:ContentDataFacet ; diff --git a/tests/case_utils/case_file/sample.txt-disable_hashes.ttl b/tests/case_utils/case_file/sample.txt-disable_hashes.ttl index 0bc4d82..2b526be 100644 --- a/tests/case_utils/case_file/sample.txt-disable_hashes.ttl +++ b/tests/case_utils/case_file/sample.txt-disable_hashes.ttl @@ -7,7 +7,7 @@ @prefix xsd: . kb:file-69751792-9d04-5f5f-8791-99ca3729cd3c - a uco-observable:ObservableObject ; + a uco-observable:File ; uco-core:hasFacet [ a uco-observable:FileFacet ; uco-observable:fileName "sample.txt" ; diff --git a/tests/case_utils/case_file/sample.txt-nocompact.json b/tests/case_utils/case_file/sample.txt-nocompact.json index 6d2569b..c14fdf3 100644 --- a/tests/case_utils/case_file/sample.txt-nocompact.json +++ b/tests/case_utils/case_file/sample.txt-nocompact.json @@ -13,18 +13,18 @@ "@graph": [ { "@id": "http://example.org/kb/file-4216a9f3-45fc-55aa-8e48-a9f828173625", - "@type": "https://unifiedcyberontology.org/ontology/uco/observable#ObservableObject", + "@type": "https://unifiedcyberontology.org/ontology/uco/observable#File", "https://unifiedcyberontology.org/ontology/uco/core#hasFacet": [ { - "@id": "_:Ncbd74ec540fa42b09802cdf033ec0e86" + "@id": "_:N44ce7f76801a429d9aabefe1046da060" }, { - "@id": "_:N1b091168b6e746ca8ffef67ba546f52c" + "@id": "_:Ndd6e8785860848aeb6823b493c6420a7" } ] }, { - "@id": "_:Ncbd74ec540fa42b09802cdf033ec0e86", + "@id": "_:N44ce7f76801a429d9aabefe1046da060", "@type": "https://unifiedcyberontology.org/ontology/uco/observable#FileFacet", "https://unifiedcyberontology.org/ontology/uco/observable#fileName": "sample.txt", "https://unifiedcyberontology.org/ontology/uco/observable#modifiedTime": { @@ -34,26 +34,26 @@ "https://unifiedcyberontology.org/ontology/uco/observable#sizeInBytes": 4 }, { - "@id": "_:N1b091168b6e746ca8ffef67ba546f52c", + "@id": "_:Ndd6e8785860848aeb6823b493c6420a7", "@type": "https://unifiedcyberontology.org/ontology/uco/observable#ContentDataFacet", "https://unifiedcyberontology.org/ontology/uco/observable#hash": [ { - "@id": "_:Nf0f6ff73c49045ffa53e2fc83249d20b" + "@id": "_:N334acc4a58624aa29968e0d155bd34c7" }, { - "@id": "_:Na2470e1f29914026a1690b0e9386cc1f" + "@id": "_:Na1176e4f42e442b2bd4167202aa93383" }, { - "@id": "_:Nd8473ff30e87456d8dcd034729ba27ed" + "@id": "_:N400f582d54af4f8190253677f57de728" }, { - "@id": "_:Ncaa10f1e5cf84d8286f1d1c536b9fa06" + "@id": "_:Nef2949777f2b4b34a46a7d99ea01f44e" } ], "https://unifiedcyberontology.org/ontology/uco/observable#sizeInBytes": 4 }, { - "@id": "_:Nf0f6ff73c49045ffa53e2fc83249d20b", + "@id": "_:N334acc4a58624aa29968e0d155bd34c7", "@type": "https://unifiedcyberontology.org/ontology/uco/types#Hash", "https://unifiedcyberontology.org/ontology/uco/types#hashMethod": { "@type": "https://unifiedcyberontology.org/ontology/uco/vocabulary#HashNameVocab", @@ -65,7 +65,7 @@ } }, { - "@id": "_:Na2470e1f29914026a1690b0e9386cc1f", + "@id": "_:Na1176e4f42e442b2bd4167202aa93383", "@type": "https://unifiedcyberontology.org/ontology/uco/types#Hash", "https://unifiedcyberontology.org/ontology/uco/types#hashMethod": { "@type": "https://unifiedcyberontology.org/ontology/uco/vocabulary#HashNameVocab", @@ -77,7 +77,7 @@ } }, { - "@id": "_:Nd8473ff30e87456d8dcd034729ba27ed", + "@id": "_:N400f582d54af4f8190253677f57de728", "@type": "https://unifiedcyberontology.org/ontology/uco/types#Hash", "https://unifiedcyberontology.org/ontology/uco/types#hashMethod": { "@type": "https://unifiedcyberontology.org/ontology/uco/vocabulary#HashNameVocab", @@ -89,7 +89,7 @@ } }, { - "@id": "_:Ncaa10f1e5cf84d8286f1d1c536b9fa06", + "@id": "_:Nef2949777f2b4b34a46a7d99ea01f44e", "@type": "https://unifiedcyberontology.org/ontology/uco/types#Hash", "https://unifiedcyberontology.org/ontology/uco/types#hashMethod": { "@type": "https://unifiedcyberontology.org/ontology/uco/vocabulary#HashNameVocab", diff --git a/tests/case_utils/case_file/sample.txt.json b/tests/case_utils/case_file/sample.txt.json index c2b4f6e..f9b1b2d 100644 --- a/tests/case_utils/case_file/sample.txt.json +++ b/tests/case_utils/case_file/sample.txt.json @@ -13,18 +13,18 @@ "@graph": [ { "@id": "kb:file-a44b2ee3-968f-5528-883a-fa65ac45ce2c", - "@type": "uco-observable:ObservableObject", + "@type": "uco-observable:File", "uco-core:hasFacet": [ { - "@id": "_:N4acc005af38245cb843d4a7009cce7df" + "@id": "_:N2767c0726ce542be9a1ad27b1f7ae944" }, { - "@id": "_:Nc02deac289534fbf93c061d03bbb589d" + "@id": "_:N78869d50bb384b24b8fd147d9bfe7e51" } ] }, { - "@id": "_:N4acc005af38245cb843d4a7009cce7df", + "@id": "_:N2767c0726ce542be9a1ad27b1f7ae944", "@type": "uco-observable:FileFacet", "uco-observable:fileName": "sample.txt", "uco-observable:modifiedTime": { @@ -34,26 +34,26 @@ "uco-observable:sizeInBytes": 4 }, { - "@id": "_:Nc02deac289534fbf93c061d03bbb589d", + "@id": "_:N78869d50bb384b24b8fd147d9bfe7e51", "@type": "uco-observable:ContentDataFacet", "uco-observable:hash": [ { - "@id": "_:Nbbf71d61d9fa4615bc074268fd60b4b5" + "@id": "_:N6407c0f0a27545e0a15a7e147e862003" }, { - "@id": "_:N6741cf44d9da464191c6a0014dbb602b" + "@id": "_:Na90e92d493a84c78802a307bbbdaafda" }, { - "@id": "_:N3b6cc89816394294bc260958408d74de" + "@id": "_:Nfe3e54d32dcc4ef79934ca120dc3d59e" }, { - "@id": "_:Nfc008212dd584b16a8d4d50df33f0a47" + "@id": "_:N80c90d89e47b4f30b585752201376e22" } ], "uco-observable:sizeInBytes": 4 }, { - "@id": "_:Nbbf71d61d9fa4615bc074268fd60b4b5", + "@id": "_:N6407c0f0a27545e0a15a7e147e862003", "@type": "uco-types:Hash", "uco-types:hashMethod": { "@type": "uco-vocabulary:HashNameVocab", @@ -65,7 +65,7 @@ } }, { - "@id": "_:N6741cf44d9da464191c6a0014dbb602b", + "@id": "_:Na90e92d493a84c78802a307bbbdaafda", "@type": "uco-types:Hash", "uco-types:hashMethod": { "@type": "uco-vocabulary:HashNameVocab", @@ -77,7 +77,7 @@ } }, { - "@id": "_:N3b6cc89816394294bc260958408d74de", + "@id": "_:Nfe3e54d32dcc4ef79934ca120dc3d59e", "@type": "uco-types:Hash", "uco-types:hashMethod": { "@type": "uco-vocabulary:HashNameVocab", @@ -89,7 +89,7 @@ } }, { - "@id": "_:Nfc008212dd584b16a8d4d50df33f0a47", + "@id": "_:N80c90d89e47b4f30b585752201376e22", "@type": "uco-types:Hash", "uco-types:hashMethod": { "@type": "uco-vocabulary:HashNameVocab", diff --git a/tests/case_utils/case_file/sample.txt.ttl b/tests/case_utils/case_file/sample.txt.ttl index 16029aa..faecc50 100644 --- a/tests/case_utils/case_file/sample.txt.ttl +++ b/tests/case_utils/case_file/sample.txt.ttl @@ -9,7 +9,7 @@ @prefix xsd: . kb:file-9477a6eb-3a94-590b-b51e-6ce6892f0941 - a uco-observable:ObservableObject ; + a uco-observable:File ; uco-core:hasFacet [ a uco-observable:ContentDataFacet ; From fac290abe83d9e419d95f3815bcb5f9358ee6c88 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 18:08:08 -0500 Subject: [PATCH 48/49] Bump versions References: * [AC-207] Release CASE-Utilities-Python 0.3.0 Signed-off-by: Alex Nelson --- case_utils/__init__.py | 2 +- case_utils/case_file/__init__.py | 2 +- case_utils/case_sparql_construct/__init__.py | 2 +- case_utils/case_sparql_select/__init__.py | 2 +- case_utils/local_uuid.py | 2 +- tests/src/compact.py | 2 +- tests/src/glom_graph.py | 2 +- tests/src/isomorphic_diff.py | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/case_utils/__init__.py b/case_utils/__init__.py index 678e6e7..8e770ec 100644 --- a/case_utils/__init__.py +++ b/case_utils/__init__.py @@ -11,7 +11,7 @@ # # We would appreciate acknowledgement if the software is used. -__version__ = "0.2.1" +__version__ = "0.3.0" import typing import warnings diff --git a/case_utils/case_file/__init__.py b/case_utils/case_file/__init__.py index 3ac56ac..1ad3ba3 100644 --- a/case_utils/case_file/__init__.py +++ b/case_utils/case_file/__init__.py @@ -15,7 +15,7 @@ This module creates a graph object that provides a basic UCO characterization of a single file. The gathered metadata is among the more "durable" file characteristics, i.e. characteristics that would remain consistent when transferring a file between locations. """ -__version__ = "0.1.0" +__version__ = "0.2.0" import datetime import hashlib diff --git a/case_utils/case_sparql_construct/__init__.py b/case_utils/case_sparql_construct/__init__.py index abcdd27..69e1116 100644 --- a/case_utils/case_sparql_construct/__init__.py +++ b/case_utils/case_sparql_construct/__init__.py @@ -15,7 +15,7 @@ This script executes a SPARQL CONSTRUCT query, returning a graph of the generated triples. """ -__version__ = "0.1.0" +__version__ = "0.2.0" import argparse import logging diff --git a/case_utils/case_sparql_select/__init__.py b/case_utils/case_sparql_select/__init__.py index 12404f1..332411b 100644 --- a/case_utils/case_sparql_select/__init__.py +++ b/case_utils/case_sparql_select/__init__.py @@ -26,7 +26,7 @@ Should a more complex query be necessary, an outer, wrapping SELECT query would let this script continue to function. """ -__version__ = "0.3.0" +__version__ = "0.4.0" import argparse import binascii diff --git a/case_utils/local_uuid.py b/case_utils/local_uuid.py index c4cb5a1..f25daf3 100644 --- a/case_utils/local_uuid.py +++ b/case_utils/local_uuid.py @@ -15,7 +15,7 @@ This library is a wrapper for uuid, provided to generate repeatable UUIDs if requested. """ -__version__ = "0.1.0" +__version__ = "0.2.0" import os import sys diff --git a/tests/src/compact.py b/tests/src/compact.py index f314004..e673edd 100644 --- a/tests/src/compact.py +++ b/tests/src/compact.py @@ -18,7 +18,7 @@ https://www.w3.org/TR/json-ld11/#terms """ -__version__ = "0.1.0" +__version__ = "0.2.0" import logging import os diff --git a/tests/src/glom_graph.py b/tests/src/glom_graph.py index 0b4e5ad..2441954 100644 --- a/tests/src/glom_graph.py +++ b/tests/src/glom_graph.py @@ -15,7 +15,7 @@ This script takes multiple input JSON-LD or Turtle files and emits a single Turtle graph. """ -__version__ = "0.1.0" +__version__ = "0.2.0" import rdflib # type: ignore diff --git a/tests/src/isomorphic_diff.py b/tests/src/isomorphic_diff.py index 0a2c0ce..0c3fea1 100644 --- a/tests/src/isomorphic_diff.py +++ b/tests/src/isomorphic_diff.py @@ -27,7 +27,7 @@ On resolution of rdflib issue 812, and on adding some format-support flexibility, isomorphic_diff.py is likely to be deprecated in favor of using the upstream rdfgraphisomorphism command. """ -__version__ = "0.1.0" +__version__ = "0.2.0" import argparse import logging From 1acc5e207949b221b9b92405891ed4e542f40355 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 10 Nov 2021 18:21:43 -0500 Subject: [PATCH 49/49] Remove obviated remark about Python <3.7 --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index e7d036b..ffd0415 100644 --- a/README.md +++ b/README.md @@ -91,8 +91,6 @@ case_sparql_select output.html input.sparql input.json [input-2.json ...] case_sparql_select output.md input.sparql input.json [input-2.json ...] ``` -Note that `case_sparql_select` is not guaranteed to function with Pythons below version 3.7. - ### `local_uuid`