This repo contains an RDF data shapes library implemented in Rust. The implementation supports ShEx, SHACL, DCTap and conversions between different RDF data modeling formalisms.
The code can be used as a Rust library
but it also contains a binary called rudof
which can be used as an RDF playground.
We provide binaries for Linux, Windows, Mac and Docker (see releases), as well as Python bindings.
- Documentation
- Using rudof as Jupyter notebooks
- Installation
- List of issues
- Discussion
- FAQ
- How to guides
- Roadmap
rudof currently supports the following:
- RDF and RDF 1.2 parsing, conversion and visualization.
- SPARQL querying to RDF data and endpoints
- Parsing SPARQL service description
- ShEx
- SHACL
- DCTAP
Future features we are planning to add:
- rdf-config
- LinkML
You can download a binary from the latest release page. There you will also find the compiled packages for the installation on your system using a package manager.
Download the binary from https://github.com/rudof-project/rudof/releases
and install the .deb package running the following commands after replacing X.X.X by the latest version:
wget https://github.com/rudof-project/rudof/releases/download/vX.X.X/rudof_vX.X.X_amd64.deb
sudo dpkg -i rudof_vX.X.X_amd64.debThe binary can be downloaded from https://github.com/rudof-project/rudof/releases.
The binary is available at: https://github.com/rudof-project/rudof/releases so you can download the corresponding binary to your machine.
The usual way to run/install a binary in Mac is to download it in a folder, add that folder to your PATH and activating the binary using:
chmod +x <binary_file>After that, the processor may complain the first time about security and you have to agree to use it. Once you agree, it should work.
Compiling from source
rudof has been implemented in Rust
and is compiled using cargo.
The command cargo run can be used to compile and run locally the code.
For example:
cargo run -- validate examples/user.ttl --schema examples/user.shex --shapemap examples/user.smIf the example doesn’t work as expected, here are a few things you can try:
- Use the --release flag to compile in release mode, which can resolve some build issues and improve performance:
cargo run --release -- validate examples/user.ttl --schema examples/user.shex --shapemap examples/user.sm- Run the command inside WSL (Windows Subsystem for Linux). If you're using Windows, compiling the project in WSL can help resolve environment-related issues, as Rust tends to compile more reliably and efficiently in Linux-based systems.
Install cargo deb (only the first time)
cargo install cargo-debCreate the .deb package by:
cargo debAnd run:
sudo dpkg -i target/debian/rudof_0.0.11-1_amd64.debTo create a binary for Linux with debug information:
cargo build --target x86_64-unknown-linux-gnuThe binary will be created in: target/x86_64-unknown-linux-gnu/debug/rudof
If you want a release binary which is more optimized, you can run:
cargo build --target x86_64-unknown-linux-gnuIn this case, the binary will be target/x86_64-unknown-linux-gnu/release/rudof
The library is also published as a Docker image
(angelip2303/rudof:latest).
The folder examples contains several example files with ShEx schemas and RDF data.
rudof validate examples/user.ttl --schema examples/user.shex --shapemap examples/user.smWe maintain a Wiki page with some common Usage scenarios and How-to guides.
It is possible to change the debug level information with:
export RUST_LOG=valuewhere value can be debug to show more verbose information or info to show basic information.
A tool to process and validate RDF data using shapes, and convert between different RDF data models
Usage: rudof [OPTIONS] [COMMAND]
Commands:
shapemap Show information about ShEx ShapeMaps
shex Show information about ShEx schemas
validate Validate RDF data using ShEx or SHACL
shex-validate Validate RDF using ShEx schemas
shacl-validate Validate RDF data using SHACL shapes
data Show information about RDF data
node Show information about a node in an RDF Graph
shacl Show information about SHACL shapes
dctap Show information and process DCTAP files
convert Convert between different Data modeling technologies
service Show information about SPARQL service
query Run SPARQL queries
help Print this message or the help of the given subcommand(s)
Options:
-d, --debug...
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version$ rudof shex --help
Show information about ShEx schemas
Usage: rudof shex [OPTIONS] --schema <Schema file name>
Options:
-s, --schema <Schema file name>
-f, --format <Schema format>
[default: shexc] [possible values: internal, simple, shexc, shexj, turtle, ntriples, rdfxml, trig, n3, nquads]
-r, --result-format <Result schema format>
[default: shexj] [possible values: internal, simple, shexc, shexj, turtle, ntriples, rdfxml, trig, n3, nquads]
-t, --show elapsed time <SHOW_TIME>
[possible values: true, false]
--statistics <SHOW_STATISTICS>
[possible values: true, false]
-o, --output-file <Output file name, default = terminal>
--reader-mode <RDF Reader mode>
[default: strict] [possible values: lax, strict]
--force-overwrite
-c, --config-file <Config file name>
Config file path, if unset it assumes default config
-h, --help
Print help$ rudof data --help
Show information about RDF data
Usage: rudof data [OPTIONS] [DATA]...
Arguments:
[DATA]...
Options:
-t, --data-format <RDF Data format>
[default: turtle] [possible values: turtle, ntriples, rdfxml, trig, n3, nquads]
--reader-mode <RDF Reader mode>
RDF Reader mode [default: strict] [possible values: lax, strict]
-o, --output-file <Output file name, default = terminal>
-r, --result-format <Ouput result format>
[default: turtle] [possible values: turtle, ntriples, rdfxml, trig, n3, nquads]
-c, --config-file <Config file name>
Config file path, if unset it assumes default config
--force-overwrite
-h, --help
Print helpThis command can be useful to obtain the neighbourhood of a node.
$ rudof node --help
Show information about a node in an RDF Graph
Usage: rudof node [OPTIONS] --node <NODE> [DATA]...
Arguments:
[DATA]...
Options:
-n, --node <NODE>
-t, --data-format <RDF Data format>
[default: turtle] [possible values: turtle, ntriples, rdfxml, trig, n3, nquads]
-e, --endpoint <Endpoint with RDF data>
--reader-mode <RDF Reader mode>
RDF Reader mode [default: strict] [possible values: lax, strict]
-m, --show-node-mode <Show Node Mode>
[default: outgoing] [possible values: outgoing, incoming, both]
--show hyperlinks
-p, --predicates <PREDICATES>
-o, --output-file <Output file name, default = terminal>
-c, --config <Path to config file>
--force-overwrite
-h, --help
Print helpFor example, the following command shows the neighbourhood of node wd:Q80 in the Wikidata endpoint.
rudof node -e wikidata -n wd:Q80$ rudof validate --help
Validate RDF data using ShEx or SHACL
Usage: rudof validate [OPTIONS] [DATA]...
Arguments:
[DATA]...
Options:
-M, --mode <Validation mode>
[default: shex]
[possible values: shex, shacl]
-s, --schema <Schema file name>
-f, --schema-format <Schema format>
[possible values: internal, simple, shexc, shexj, turtle, ntriples, rdfxml, trig, n3, nquads]
-m, --shapemap <ShapeMap>
--shapemap-format <ShapeMap format>
[default: compact]
[possible values: compact, internal]
-n, --node <NODE>
-l, --shape-label <shape label (default = START)>
-t, --data-format <RDF Data format>
[default: turtle]
[possible values: turtle, ntriples, rdfxml, trig, n3, nquads]
-e, --endpoint <Endpoint with RDF data>
--max-steps <max steps to run>
[default: 100]
-S, --shacl-mode <SHACL validation mode>
Execution mode
[default: native]
Possible values:
- native: We use a Rust native engine in an imperative manner (performance)
- sparql: We use a SPARQL-based engine, which is declarative
--reader-mode <RDF Reader mode>
RDF Reader mode
[default: strict]
[possible values: lax, strict]
-o, --output-file <Output file name, default = terminal>
--force-overwrite
-c, --config-file <Config file name>
Config file path, if unset it assumes default config
-h, --help
Print help (see a summary with '-h')Example: Assuming there a ShEx file in examples/user.shex and an RDF turtle file in examples/user.ttl we can ask to validate node :a with shape label :User using:
rudof validate -s examples/user.shex -d examples/user.ttl -n :a -l :UserIf there is a shapemap in examples/user.sm, we can validate using:
rudof validate -s examples/user.shex -d examples/user.ttl -m examples/user.smrudof shacl-validate --shapes examples/simple_shacl.ttl examples/simple.ttl$ rudof convert --help
Convert between different Data modeling technologies
Usage: rudof convert [OPTIONS] --input-mode <Input mode> --source-file <Source file name> --export-mode <Result mode>
Options:
-c, --config <Path to config file>
-m, --input-mode <Input mode>
[possible values: shacl, shex, dctap]
--force-overwrite
-s, --source-file <Source file name>
-f, --format <Input file format>
[default: shexc] [possible values: csv, shexc, shexj, turtle, xlsx]
-r, --result-format <Result format>
[default: default] [possible values: default, internal, json, shexc, shexj, turtle, plantuml, html, svg, png]
-o, --output-file <Output file name, default = terminal>
-t, --target-folder <Target folder>
-l, --shape-label <shape label (default = START)>
--reader-mode <RDF Reader mode>
RDF Reader mode [default: strict] [possible values: lax, strict]
-x, --export-mode <Result mode>
[possible valueS: QueryRDF, shex, uml, html]
-h, --help
Print helpThe repo is divided in the following modules:
- iri_s defines simple IRIs.
- srdf simple RDF model which will be used for validation.
- prefixmap Prefix maps implementation.
- shapemap ShapeMap implementation.
- shex_ast defines the ShEx Abstract syntax
- shex_compact contains the code required to handle ShEx compact syntax.
- shex_validation contains the code required to validate RDF using ShEx.
- shex_testsuite contains the code required to run the ShEx testsuite.
- shacl_ast defines the SHACL core Abstract syntax.
- shacl_validation contains the code required to validate RDF using SHACL.
- dctap contains the code required to do handle DCTAP files.
- shapes_converter contains the code required to do conversion between different shapes formalisms.
cargo workspaces publishThe project is using cargo workspaces wihch can be installed with:
cargo install cargo-workspacesIn order to test all the sub-projects
cargo test --allTesting one specific subproject:
cargo test -p shex_validationThe ShEx testsuite is included in a git submodule. In order to obtain it, it is necessary to do:
git submodule update --init --recursive
cargo run -p shex_testsuiteUsage: shex_testsuite [OPTIONS]
Options:
-m, --manifest <Manifest FILE (.jsonld)>
Name of Manifest file [default: shex_testsuite/shexTest/validation/manifest.jsonld]
-c, --config <Config file>
[default: shex_testsuite/config.toml]
-x, --run_mode <MANIFEST_RUN_MODE>
[default: collect-errors] [possible values: collect-errors, fail-first-error]
-f, --manifest_mode <MANIFEST_MODE>
[possible values: schemas, validation, negative-syntax, negative-structure]
-p, --print_result_mode <PRINT_RESULT_MODE>
[default: basic] [possible values: basic, failed, passed, not-implemented, all]
-e, --entry <Entry names>
-t, --trait <Trait names>
-h, --help
Print help
-V, --version
Print versioncargo run -p shex_testsuite -- -m shex_testsuite/shexTest/validation/manifest.jsonld validationcargo run -p shex_testsuite -- -m shex_testsuite/shexTest/schemas/manifest.jsonld -f schemas -p failedLicensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.