Skip to main content

Python SHACL Validator

Project description

pySHACL

A Python validator for SHACL.

PyPI version

This is a pure Python module which allows for the validation of RDF graphs against Shapes Constraint Language (SHACL) graphs. This module uses the rdflib Python library for working with RDF and is dependent on the OWL-RL Python module for OWL2 RL Profile-based expansion of data graphs.

This module is developed to adhere to the SHACL Recommendation:

Holger Knublauch; Dimitris Kontokostas. Shapes Constraint Language (SHACL). 20 July 2017. W3C Recommendation. URL: https://www.w3.org/TR/shacl/ ED: https://w3c.github.io/data-shapes/shacl/

Installation

Install with PIP (Using the Python3 pip installer pip3)

$ pip3 install pyshacl

Or in a python virtualenv (these example commandline instructions are for a Linux/Unix based OS)

$ python3 -m virtualenv --python=python3 --no-site-packages shaclvenv
$ source ./shaclvenv/bin/activate
$ pip3 install pyshacl

To exit the virtual enviornment:

$ deactivate

Command Line Use

For command line use:
(these example commandline instructions are for a Linux/Unix based OS)

pyshacl -s /path/to/shapesGraph.ttl -m -i rdfs -f human /path/to/dataGraph.ttl

Where

  • -s is an (optional) path to the shapes graph to use
  • -i is the pre-inferencing option
  • -f is the ValidationReport output format (human = human-readable validation report)
  • -m enable the meta-shacl feature

System exit codes are:
0 = DataGraph is Conformant
1 = DataGraph is Non-Conformant
2 = The validator encountered a RuntimeError (check stderr output for details)
3 = Not-Implemented; The validator encountered a SHACL feature that is not yet implemented.

Full CLI Usage options:

pyshacl [-h] [-s [SHACL]] [-i {none,rdfs,owlrl,both}] [-m] [-a] [-d]
        [-f {human,turtle,xml,json-ld,nt}] [-df {auto,turtle,xml,json-ld,nt}]
        [-sf {auto,turtle,xml,json-ld,nt}] [-o [OUTPUT]]
        /path/to/datagraph.rdf

positional arguments:
  DataGraph             The file containing the Data Graph (target graph).

optional arguments:
  -h, --help            show this help message and exit
  -s [SHACL], --shacl [SHACL]
                        [Optional] The file containing the SHACL Shapes Graph.
  -i {none,rdfs,owlrl,both}, --inference {none,rdfs,owlrl,both}
                        [Optional] Choose a type of inferencing to run against
                        the Data Graph before validating.
  -m, --metashacl       [Optional] Validate the SHACL Shapes graph against the
                        shacl-shacl Shapes Graph before before validating the
                        Data Graph.
  -a, --abort           [Optional] Abort on first error.
  -d, --debug           [Optional] Output additional runtime messages.
  -f {human,turtle,xml,json-ld,nt,n3}, --format {human,turtle,xml,json-ld,nt,n3}
                        [Optional] Choose an output format. Default is "human".
  -df {auto,turtle,xml,json-ld,nt,n3}, --data-file-format {auto,turtle,xml,json-ld,nt,n3}
                        [Optional] Explicitly state the RDF File format of the
                        input DataGraph file. Default="auto".
  -sf {auto,turtle,xml,json-ld,nt,n3}, --shacl-file-format {auto,turtle,xml,json-ld,nt,n3}
                        [Optional] Explicitly state the RDF File format of the
                        input SHACL file. Default="auto".

  -o [OUTPUT], --output [OUTPUT]
                        [Optional] Send output to a file (defaults to stdout).

Python Module Use

For basic use of this module, you can just call the validate function of the pyshacl module like this:

from pyshacl import validate
r = validate(data_graph, shacl_graph, inference='rdfs', abort_on_error=False, meta_shacl=False, debug=False)
conforms, results_graph, results_text = r

where:

  • data_graph is an rdflib Graph object, the graph to be validated
  • shacl_graph is an rdflib Graph object, the graph containing the SHACL shapes to validate with, or None if the SHACL shapes are included in the data_graph.
  • inference is a Python string value to indicate whether or not to perform OWL inferencing expansion of the data_graph before validation. Options are 'rdfs', 'owlrl', 'both', or 'none'. The default is 'none'.
  • abort_on_error (optional) a Python bool value to indicate whether or not the program should abort after encountering a validation error or to continue. Default is to continue.
  • meta_shacl (optional) a Python bool value to indicate whether or not the program should enable the Meta-SHACL feature. Default is False.
  • debug (optional) a Python bool value to indicate whether or not the program should emit debugging output text. Default is False.

on return:

  • a three-component tuple containing:
    • conforms a bool, indicating whether or not the data_graph conforms to the shacl_graph
    • results_graph an rdflib Graph object built according to the SHACL specification's Validation Report semantics
    • results_text python string representing a verbose textual representation of the Validation Report

Errors

Under certain circumstances pySHACL can produce a Validation Failure. This is a formal error defined by the SHACL specification and is required to be produced as a result of specific conditions within the SHACL graph. If the validator produces a Validation Failure, the result_graph variable returned by the validate() function will be an instance of ValidationFailure. Use see the .message attribute on that instance to get more information about the validation failure.

Other errors the validator can generate:

  • ShapeLoadError: This error is thrown when a SHACL Shape in the SHACL graph is in an invalid state and cannot be loaded into the validation engine.
  • ConstraintLoadError: This error is thrown when a SHACL Constraint Component is in an invalid state and cannot be loaded into the validation engine.
  • ReportableRuntimeError: An error occurred for a different reason, and the reason should be communicated back to the user of the validator.
  • RuntimeError: The validator encountered a situation that caused it to throw an error, but the reason does concern the user.

Unlike ValidationFailure, these errors are not passed back as a result by the validate() function, but thrown as exceptions by the validation engine and must be caught in a try ... except block. In the case of ShapeLoadError and ConstraintLoadError, see the str() string representation of the exception instance for the error message along with a link to the relevant section in the SHACL spec document.

Compatibility

PySHACL is a Python3 library. For best compatibility use Python v3.5 or greater. This library does not work on Python 2.7.x or below.

Features

A features matrix is kept in the FEATURES file.

Changelog

A comprehensive changelog is kept in the CHANGELOG file.

Benchmarks

This project includes a script to measure the difference in performance of validating the same source graph that has been inferenced using each of the four different inferencing options. Run it on your computer to see how fast the validator operates for you.

License

This repository is licensed under Apache License, Version 2.0. See the LICENSE deed for details.

Contributors

See the CONTRIBUTORS file.

Contacts

Project Lead:
Nicholas Car
Senior Experimental Scientist
CSIRO Land & Water, Environmental Informatics Group
Brisbane, Qld, Australia
nicholas.car@csiro.au
http://orcid.org/0000-0002-8742-7730

Lead Developer:
Ashley Sommer
Software Engineer
CSIRO Land & Water, Environmental Informatics Group
Brisbane, Qld, Australia
Ashley.Sommer@csiro.au

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyshacl-0.9.8.post1.tar.gz (67.8 kB view details)

Uploaded Source

Built Distribution

pyshacl-0.9.8.post1-py3-none-any.whl (64.0 kB view details)

Uploaded Python 3

File details

Details for the file pyshacl-0.9.8.post1.tar.gz.

File metadata

  • Download URL: pyshacl-0.9.8.post1.tar.gz
  • Upload date:
  • Size: 67.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.5

File hashes

Hashes for pyshacl-0.9.8.post1.tar.gz
Algorithm Hash digest
SHA256 76427cfb3d3432e2d3647af5655fc5b9ec8f4296bed50e84622db6cd8be08c60
MD5 186acea14f622d6c59101a64deb8f450
BLAKE2b-256 9ed34547734710e38fab05f49b70f13d6fc58e22bd6428c93263cd4a2cb945dc

See more details on using hashes here.

File details

Details for the file pyshacl-0.9.8.post1-py3-none-any.whl.

File metadata

  • Download URL: pyshacl-0.9.8.post1-py3-none-any.whl
  • Upload date:
  • Size: 64.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.5

File hashes

Hashes for pyshacl-0.9.8.post1-py3-none-any.whl
Algorithm Hash digest
SHA256 006e46770ede5cd028a454963cb9a783d2feabba74e1486cc99335f92f67b34b
MD5 434095c1df2ededd3cce4cfebce31679
BLAKE2b-256 dda0b13f65c2cc705b2af91a984d8320b897da5d202a1ee707bfd223cf50ec59

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page