{"library":"pyshacl","title":"PySHACL: Python SHACL Validator","description":"PySHACL is a Python library that implements the W3C Shapes Constraint Language (SHACL) specification. It allows users to validate RDF data graphs against SHACL shapes, identify data quality issues, and generate detailed validation reports. Currently at version 0.31.0, the library maintains an active release cadence, with significant updates and fixes appearing every 1-3 months.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install pyshacl"],"cli":{"name":"pyshacl","version":"PySHACL Version: 0.31.0"}},"imports":["from pyshacl import validate"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"from pyshacl import validate\nfrom rdflib import Graph, Literal, URIRef\nfrom rdflib.namespace import SH, XSD\n\n# Define data graph and shapes graph in TTL format\ndata_graph_ttl = \"\"\"\n@prefix ex: <http://example.com/ns#> .\n@prefix sh: <http://www.w3.org/ns/shacl#> .\n\nex:John a ex:Person ;\n  ex:name \"John Doe\" .\n\nex:Jane a ex:Person . # This node will violate ex:PersonShape (missing ex:name)\n\"\"\"\n\nshapes_graph_ttl = \"\"\"\n@prefix ex: <http://example.com/ns#> .\n@prefix sh: <http://www.w3.org/ns/shacl#> .\n\nex:PersonShape a sh:NodeShape ;\n  sh:targetClass ex:Person ;\n  sh:property [\n    sh:path ex:name ;\n    sh:minCount 1 ;\n    sh:maxCount 1 ;\n    sh:datatype xsd:string ;\n  ] .\n\"\"\"\n\n# Load graphs using RDFLib\ndata_graph = Graph().parse(data=data_graph_ttl, format=\"ttl\")\nshapes_graph = Graph().parse(data=shapes_graph_ttl, format=\"ttl\")\n\n# Validate the data graph against the shapes graph\nconforms, results_graph, results_text = validate(\n    data_graph,\n    shacl_graph=shapes_graph,\n    inference='rdfs', # Perform RDFS inference before validation\n    serialize_report_graph=True # Return the report graph as an RDFLib Graph\n)\n\nprint(f\"Validation Conforms: {conforms}\")\nif not conforms:\n    print(\"\\nValidation Report:\")\n    print(results_text)\n    # for s, p, o in results_graph.triples((None, SH.resultMessage, None)):\n    #     print(f\" - {o}\")","lang":"python","description":"This example demonstrates how to validate a simple RDF data graph against a SHACL shapes graph using `pyshacl.validate`. It defines two in-memory graphs, one containing sample data and another defining a shape that requires every `ex:Person` to have exactly one `ex:name`. The validation identifies `ex:Jane` as non-conformant.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"0.31.0","pypi_latest":"0.31.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.7,"avg_import_s":0.49,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.53,"mem_mb":11.8,"disk_size":"34.0M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.8,"import_time_s":0.34,"mem_mb":11.8,"disk_size":"35M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.59,"mem_mb":12.9,"disk_size":"37.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.7,"import_time_s":0.52,"mem_mb":12.9,"disk_size":"38M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.54,"mem_mb":12.5,"disk_size":"28.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.4,"import_time_s":0.51,"mem_mb":12.5,"disk_size":"29M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.55,"mem_mb":13.3,"disk_size":"28.4M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.5,"import_time_s":0.49,"mem_mb":13.3,"disk_size":"29M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.44,"mem_mb":11.6,"disk_size":"33.4M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyshacl","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3,"import_time_s":0.38,"mem_mb":11.6,"disk_size":"34M"}]}}