Validate RDF data purely in JavaScript. An implementation of the W3C SHACL specification on top of the RDFJS stack.
We provide a SHACL playground based on this library.
The library only handles SHACL validation and not data loading/parsing. The following example uses rdf-utils-fs for this purpose. For more information about handling RDF data in JavaScript, check out Get started with RDF in JavaScript.
The validation function returns a ValidationReport
object that can be used
to inspect conformance and results. The ValidationReport
also has a
.dataset
property, which provides the report as RDF data.
import rdf from '@zazuko/env-node'
import SHACLValidator from 'rdf-validate-shacl'
async function main() {
const shapes = await rdf.dataset().import(rdf.fromFile('my-shapes.ttl'))
const data = await rdf.dataset().import(rdf.fromFile('my-data.ttl'))
const validator = new SHACLValidator(shapes, { factory: rdf })
const report = await validator.validate(data)
// Check conformance: `true` or `false`
console.log(report.conforms)
for (const result of report.results) {
// See https://www.w3.org/TR/shacl/#results-validation-result for details
// about each property
console.log(result.message)
console.log(result.path)
console.log(result.focusNode)
console.log(result.severity)
console.log(result.sourceConstraintComponent)
console.log(result.sourceShape)
}
// Validation report as RDF dataset
console.log(await report.dataset.serialize({ format: 'text/n3' }))
}
main();
The SHACLValidator
constructor accepts an optional options object as second
parameter. The available options are:
Parameter | type | |
---|---|---|
factory |
DatasetFactory |
|
maxErrors |
number |
max number of errors after which the validation process should stop. By default, it only stops after all the errors are found. |
allowNamedNodeInList |
boolean |
SHACL only allows blank nodes in property lists. To allow named nodes to occur in property lists, set this value to true . |
importGraph |
(url: NamedNode) => DatasetCore | Promise<DatasetCore> |
function to load imported shape graphs. |
constraintVocabularies |
Array<({ factory: DataFactory }) => Quad[]> |
quad factories returning additional vocabulary graphs with SHACL constraints, such as DASH |
constraintValidators |
Record<string, Validator> |
custom constraint validators to override or extend the default ones. See Custom constraints for more details. |
You can add custom constraints to the validator by providing a constraintValidators
and constraintVocabularies
.
The latter can be skipped if you only intend to override existing constraints.
In a module with validators, export objects which implement the Validator
interface.
// dash-validators.js
import type { Validator } from 'rdf-validate-shacl';
export const singleLine: Validator = {
component: rdf.ns.dash.SingleLineConstraintComponent,
validate(context, focusNode, valueNode, constraint) {
return !valueNode.value.includes('\n')
}
}
Then, you can import the validators and pass them to the SHACLValidator
constructor.
To use DASH, import the module @vocabulary/dash
.
import SHACLValidator from 'rdf-validate-shacl'
import { DatasetCore } from '@rdfjs/types'
import dash from '@vocabulary/dash'
import * as constraintValidators from './dash-validators.js'
let shapes: DatasetCore
const validator = new SHACLValidator(shapes, {
constraintVocabularies: [dash],
constraintValidators,
})
$ npm test
rdf-validate-shacl does not support SHACL-SPARQL constraints
rdf-validate-shacl was originally a fork of shacl-js meant to make it compatible with RDF/JS libraries. Since then, we dropped support for the SHACL-JS extension and adapted the API to suit our needs.