A command-line tool for managing Eclipse RDF4J repositories via the REST API.
- Repository management -- create, list, delete, and inspect repositories
- SPARQL queries -- SELECT, ASK, CONSTRUCT, DESCRIBE with table, JSON, or CSV output
- SPARQL updates -- INSERT, DELETE, and other update operations
- Statement operations -- get, add, and delete RDF statements with pattern filters
- Namespace management -- list, get, set, delete, and clear namespace prefixes
- File upload -- upload RDF files (Turtle, N-Triples, N-Quads, RDF/XML, JSON-LD, TriG, N3) with automatic format detection
- Multiple output formats --
--format table(default),json, orcsv
| Crate | Description |
|---|---|
| rdf4j-cli | CLI for managing RDF4J repositories via the REST API |
| rdf4j-rs | Rust SDK for the RDF4J REST API |
cargo install rdf4j-clicargo install --path rdf4j-cligit clone https://github.com/odysa/rdf4j-cli.git
cd rdf4j-cli
cargo build --release
# Binary at target/release/rdf4j-cliStart an RDF4J server (e.g. with Docker):
docker run -d -p 8080:8080 eclipse/rdf4j-workbenchThen:
# Create a repository
rdf4j-cli repo create --id my-repo --repo-type memory
# Insert data
rdf4j-cli update my-repo 'INSERT DATA {
<http://example.org/alice> <http://example.org/name> "Alice" .
<http://example.org/bob> <http://example.org/name> "Bob" .
}'
# Query
rdf4j-cli query my-repo 'SELECT ?s ?name WHERE { ?s <http://example.org/name> ?name }'
# Output:
# ╭──────────────────────────────┬─────────╮
# │ s │ name │
# ├──────────────────────────────┼─────────┤
# │ <http://example.org/alice> │ "Alice" │
# │ <http://example.org/bob> │ "Bob" │
# ╰──────────────────────────────┴─────────╯
# Delete the repository
rdf4j-cli repo delete my-repo--server <URL> RDF4J server URL (or set RDF4J_SERVER env var)
[default: http://localhost:8080/rdf4j-server]
--format <FMT> Output format: table, json, csv [default: table]
rdf4j-cli server health # Check if server is reachable
rdf4j-cli server protocol # Get protocol versionrdf4j-cli repo list # List all repositories
rdf4j-cli repo create --id my-repo --repo-type memory # Create (memory or native)
rdf4j-cli repo create --id my-repo --title "My Repo" # With a title
rdf4j-cli repo size my-repo # Statement count
rdf4j-cli repo delete my-repo # Delete# Inline query
rdf4j-cli query my-repo 'SELECT * WHERE { ?s ?p ?o } LIMIT 10'
# From file
rdf4j-cli query my-repo --file query.rq
# JSON output
rdf4j-cli --format json query my-repo 'SELECT * WHERE { ?s ?p ?o }'
# Disable inference
rdf4j-cli query my-repo --no-infer 'SELECT * WHERE { ?s ?p ?o }'# Inline update
rdf4j-cli update my-repo 'INSERT DATA { <http://example.org/s> <http://example.org/p> "value" . }'
# From file
rdf4j-cli update my-repo --file update.rurdf4j-cli namespace my-repo list # List all
rdf4j-cli namespace my-repo get ex # Get URI for prefix
rdf4j-cli namespace my-repo set ex http://example.org/ # Set prefix
rdf4j-cli namespace my-repo delete ex # Delete prefix
rdf4j-cli namespace my-repo clear # Clear all# Get all statements
rdf4j-cli statement my-repo get
# Filter by subject
rdf4j-cli statement my-repo get --subj '<http://example.org/alice>'
# Add from file
rdf4j-cli statement my-repo add --file data.nt
# Delete by pattern
rdf4j-cli statement my-repo delete --subj '<http://example.org/alice>'# Auto-detect format from extension
rdf4j-cli upload my-repo data.ttl
# Explicit format
rdf4j-cli upload my-repo data.txt --rdf-format ntriples
# Upload into a named graph
rdf4j-cli upload my-repo data.ttl --context http://example.org/graph
# With base URI
rdf4j-cli upload my-repo data.ttl --base-uri http://example.org/Supported formats: Turtle (.ttl), N-Triples (.nt), N-Quads (.nq), RDF/XML (.rdf, .xml), JSON-LD (.jsonld), TriG (.trig), N3 (.n3).
The server URL can be set three ways (in order of precedence):
--serverflagRDF4J_SERVERenvironment variable- Default:
http://localhost:8080/rdf4j-server
# Using env var
export RDF4J_SERVER=http://my-server:8080/rdf4j-server
rdf4j-cli repo list
# Using flag
rdf4j-cli --server http://my-server:8080/rdf4j-server repo listcargo buildcargo clippy --all-targetsUnit tests (no Docker required):
cargo test -- --skip test_health --skip test_protocol --skip test_create \
--skip test_sparql --skip test_add --skip test_namespace --skip test_upload --skip test_e2eIntegration + e2e tests (requires Docker):
cargo test --test integration -- --test-threads=1Or with an external RDF4J server:
RDF4J_TEST_URL=http://localhost:8080/rdf4j-server cargo test --test integration -- --test-threads=1See the examples/ folder for runnable shell scripts:
- complete_workflow.sh -- Full lifecycle: create, insert, query (table/JSON/CSV), delete
- query_formats.sh -- Table, JSON, and CSV output side by side
- upload_file.sh -- Upload Turtle files and query with PREFIX
- statements.sh -- Add, filter, and delete statements
- namespaces.sh -- Namespace prefix management
rdf4j-rs/ Library crate (Rust SDK)
src/
lib.rs Public module exports
client.rs RDF4J HTTP client
error.rs Error types
repo.rs Repository configuration types
rdf4j-cli/ Binary crate (CLI)
src/
main.rs Entry point
lib.rs Public module exports
cli.rs Clap command definitions
output.rs Table/JSON/CSV formatting
commands/
server.rs health, protocol
repo.rs list, create, delete, size
query.rs SPARQL query
update.rs SPARQL update
namespace.rs namespace CRUD
statement.rs statement get/add/delete
upload.rs RDF file upload
- clap -- CLI argument parsing
- reqwest -- HTTP client (blocking)
- oxrdf + oxrdfio -- RDF types and serialization
- sparesults -- SPARQL results parsing
- tabled -- Table output formatting
- rdf4j-python -- Python client library for RDF4J (the reference implementation this CLI is based on)
- Eclipse RDF4J -- The RDF4J framework
MIT