Scala implementation of SHEX and SHACL.
This project contains an implementation of SHACL and ShEx
This project contains an implementation of SHACL and ShEx.
Both are implemented in Scala using the same underlying mechanism using a purely functional approach.
The library handles RDF using a simple RDF library which has 2 implementations, one using Apache Jena and another one using RDF4j, this means that it is possible to use this library to validate RDF models from any of those RDF libraries, as well as from external SPARQL endpoints.
The project uses sbt for compilation as well as Java 1.8.
sbt test
compiles and runs the tests
Once compiled, the program can be run as a command line tool.
It is possible to run the program inside sbt
as:
Example:
sbt "run --data examples/shacl/good1.ttl \
--engine shaclex \
--showValidationReport"
It is also possible to use Jena SHACL using:
sbt "run --data examples/shacl/good1.ttl \
--engine JenaSHACL \
--showValidationReport"
or [Top Braid SHACL API] using:
sbt "run --data examples/shacl/good1.ttl \
--engine shacl-tq \
--showValidationReport"
Example:
sbt "run --engine=ShEx
--schema examples/shex/good1.shex
--schemaFormat ShExC
--data examples/shex/good1.ttl"
The following example validates RDF nodes from wikidata using Gene-wiki ShEx:
sbt "run --endpoint=https://query.wikidata.org/sparql
--schemaUrl=https://raw.githubusercontent.com/SuLab/Genewiki-ShEx/master/diseases/wikidata-disease-ontology.shex
--shapeMap=examples/shex/wikidata/disease1.shapeMap
--schemaFormat=ShExC
--engine=ShEx
--trigger=ShapeMap
--showResult
--resultFormat=JSON"
It is usually faster to run the sbt
command, which opens the interactive sbt
shell and inside that shell, execute
the different commands.
$ sbt
... several information about loading libraries
sbt> run -d examples/shacl/good1.ttl --engine ShaClex
The fastest way to run Shaclex is to compile the code and generate a comand line binary file.
The following command will generate a binary file:
$ sbt universal:packageBin
...generates the file...
target/universal/shaclex-N.N.N.zip
which contains the compressed binary code.
The Shaclex library can be invoked programmatically.
- Simple project validating ShEx
- Simple example validating SHACL
- The engine is based on Monads using the cats library
- The ShEx compact syntax parser is implemented using the following Antlr grammar (previous versions used Scala Parser Combinators) which is based on this grammar
- JSON encoding and decoding uses the Json structure defined here and is implemented using Circe
The current implementation passes all shacl-core tests. In order to generate the EARL report, run:
$ sbt
[...]
sbt:shaclex> project shacl
sbt:shacl> testOnly es.weso.shacl.report.ReportGeneratorCompatTest
We also aim to pass the ShEx test-suite.
In order to run the shex test-suite and generate the EARL report, you can do the following:
sbt
...
sbt:shaclex> project shex
sbt:shex> compat:test
Shaclex can be used to convert between different schema formats. The following example shows how to convert between ShExC to ShExJ:
$ sbt "run --schema examples/shex/good1.shex
--schemaFormat ShExC
--outSchemaFormat ShExJ
--showSchema"
Shaclex can be used to convert schemas from ShEx to SHACL and viceversa. The following example shows how to convert a SHACL schema to ShEx.
$ sbt "run --schema examples/shacl/good1.ttl
--schemaFormat Turtle
--outSchemaFormat ShExC
--engine SHACLEX
--outEngine SHEX
--showSchema
--no-validate"
The conversion code is work in progress. This issue tracks ShEx->SHACL conversion and this one tracks SHACL->ShEx conversion.
The project supports experimental Answer Set Programming based validation by converting the validation process to a [Clingo program])(https://potassco.org/clingo/). To run this, use the option --showClingo
which will generate a Cling program. Example:
sbt "run --engine=ShEx
--schema examples/shex/good1.shex
--schemaFormat ShExC
--data examples/shex/good1.ttl
--showClingo
--clingoFile clingoProgram.pl"
Once you generate the Clingo program and have installed Clingo itself, you can run the program with:
clingo clingoProgram.pl
This feature is experimental. This issue tracks the Clingo conversion.
- The aim of Shaclex is to support both ShEx and SHACL and to provide conversions between both languages. More information about both languages can be read in the Validating RDF data written by the authors.
- An online demo based on this library is available at http://rdfshape.weso.es.
- Another online demo based on this library customized for Wikidata is available at http://wikidata.weso.es.
- This project was based on ShExcala which was focused on Shape Expressions only.
This project uses the sbt ci release plugin for publishing to OSS Sonatype.
Open a PR and merge it to watch the CI release a -SNAPSHOT version
- Push a tag and watch the CI do a regular release
git tag -a v0.1.0 -m "v0.1.0"
git push origin v0.1.0
Note that the tag version MUST start with v.
- Author: Jose Emilio Labra Gayo
Contributors:
- RDFShape: An online demo powered by this library.
- Wikishape: An online demo powered by this library for Wikidata.
- Eclipse lyo: An SDK and a modelling environment to design and develop linked data applications based on the OSLC standards. The validation library is lyo-validation.
Contributions are greatly appreciated. Please fork this repository and open a pull request to add more features or submit issues