The problem
Property graphs can stay queryable while silently losing required properties, cardinalities, relationship direction, or the answers an application depends on. Those failures are difficult to review consistently because schema expectations, business questions, and drift thresholds usually live in separate tools and ad hoc queries. GraphCheck turns those expectations into version-controlled YAML and produces deterministic, evidence-backed JSON and offline HTML reports for local runs and CI.
Quickstart
For complete setup, credential, authoring, redaction, baseline, and configuration instructions, see the full user guide.
GraphCheck requires Python 3.12 or 3.13, a supported Neo4j server, and
uv. See the compatibility matrix for the tested
Neo4j and Cypher versions.
Install the CLI from source and scaffold a project:
git clone https://github.com/graphora/graphcheck.git
cd graphcheck
uv tool install .
mkdir graph-health
cd graph-health
graphcheck init
graphcheck init creates the following local project:
graphcheck.yml Project paths and runtime settings
profiles.yml Neo4j connection profiles; ignored by Git
checks/example.yml Example check suite
.graphcheck/ Baselines, run history, JSON, and HTML reports
Edit profiles.yml with the URI, database, and credential for your Neo4j instance. Enterprise and
Developer deployments must use a user assigned only Neo4j's built-in reader role plus the
automatic PUBLIC role; GraphCheck rejects missing, additional, or custom roles. Community
deployments cannot enforce read-only roles, so GraphCheck instead rejects every customer-authored
query unless Neo4j plans it as read-only.
Verify the connection, replace the generated suite with the baseline-free example below, and run it:
graphcheck debug
graphcheck run
Each prepared run writes immutable history plus convenient latest copies:
.graphcheck/runs/<run-id>/results.json
.graphcheck/runs/<run-id>/report.html
.graphcheck/runs/latest/results.json
.graphcheck/runs/latest/report.html
The HTML report is self-contained and works offline. Exit codes are stable for CI: 0 means all
executed checks passed, 1 means an error-severity finding or execution error, 2 means a warning or
incomplete evaluation, and 3 means the run could not be prepared or completed.
For development, use the locked environment instead:
uv sync --group dev
uv run graphcheck --version
Example
Replace checks/example.yml with a suite that matches labels in your graph:
suite: customer-health
defaults:
severity: error
tags: [production]
conformance:
- id: customer-name-present
check: completeness
with:
label: Customer
property: name
threshold: 0.98
competency:
- id: customers-can-be-counted
question: Can customers be counted?
query: MATCH (c:Customer) RETURN count(c) AS count
expect:
rows: { exactly: 1 }
columns: [count]
Then select it directly or by tag:
graphcheck run --suite customer-health
graphcheck run --select tag:production
A suite can combine three kinds of checks:
- Conformance applies reusable rules for completeness, uniqueness, types, formats, cardinality, relationship direction, temporal sanity, outliers, and sampled PII signals.
- Competency runs authored read-only Cypher and asserts its rows, columns, uniqueness, emptiness, or returned values.
- Drift compares node counts, relationship counts, or property coverage with a stored baseline.
Suite YAML is strict: duplicate keys, unknown fields, invalid payloads, and inconsistent expectations fail before execution. Runtime evaluation is rule-based; generated check suggestions remain inert until a person reviews and activates them.
For the full contracts, see the check YAML specification,
results.json specification, and
engine and CLI specification. The
agent guide, telemetry disclosure,
and contributor guide cover integration and operational workflows.
Non-goals
- GraphCheck does not mutate, repair, or migrate the graph.
- GraphCheck does not decide which business rules are sufficient for a domain or claim complete schema coverage.
- GraphCheck does not use an LLM as the judge for check results; execution and evaluation are deterministic.
- Sampled PII checks are heuristics, not a guarantee of complete PII discovery.
- GraphCheck's read-query guard is defense in depth, not a replacement for Neo4j authorization where server-enforced read-only roles are available.
License
Apache-2.0. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file graphcheck-0.1.0.tar.gz.
File metadata
- Download URL: graphcheck-0.1.0.tar.gz
- Upload date:
- Size: 801.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c07537e7a02f9f8fc35728ddc26ca6fa391c0b8da1817b16d58315c4ef33bb37
|
|
| MD5 |
89452da1d35066d682ef6530061cea38
|
|
| BLAKE2b-256 |
0e8ed37a75f61d986e0f38fa965694700a8999a65c967635746ecd5b5a9de2f8
|
Provenance
The following attestation bundles were made for graphcheck-0.1.0.tar.gz:
Publisher:
release.yml on graphora/graphcheck
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
graphcheck-0.1.0.tar.gz -
Subject digest:
c07537e7a02f9f8fc35728ddc26ca6fa391c0b8da1817b16d58315c4ef33bb37 - Sigstore transparency entry: 2527482681
- Sigstore integration time:
-
Permalink:
graphora/graphcheck@0fd1e51f71816e73f5a8d8f60caf85d0d7fc8fce -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/graphora
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0fd1e51f71816e73f5a8d8f60caf85d0d7fc8fce -
Trigger Event:
release
-
Statement type:
File details
Details for the file graphcheck-0.1.0-py3-none-any.whl.
File metadata
- Download URL: graphcheck-0.1.0-py3-none-any.whl
- Upload date:
- Size: 219.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34546dceb7ce7fc536638c79eae646ecd0301041584dfee41e7c096359d53af7
|
|
| MD5 |
0eda7b2552f1b51a379df73b145b74ca
|
|
| BLAKE2b-256 |
8fe1694d53de650649ed38d3838b59a5d9ce7e6809ade4bc23dff0bba65b722a
|
Provenance
The following attestation bundles were made for graphcheck-0.1.0-py3-none-any.whl:
Publisher:
release.yml on graphora/graphcheck
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
graphcheck-0.1.0-py3-none-any.whl -
Subject digest:
34546dceb7ce7fc536638c79eae646ecd0301041584dfee41e7c096359d53af7 - Sigstore transparency entry: 2527482880
- Sigstore integration time:
-
Permalink:
graphora/graphcheck@0fd1e51f71816e73f5a8d8f60caf85d0d7fc8fce -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/graphora
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0fd1e51f71816e73f5a8d8f60caf85d0d7fc8fce -
Trigger Event:
release
-
Statement type: