# omnigraph
[](https://pypi.org/project/pyomnigraph/)
[](https://github.com/WolfgangFahl/pyomnigraph/actions/workflows/build.yml)
[](https://pypi.python.org/pypi/pyomnigraph/)
[](https://github.com/WolfgangFahl/pyomnigraph/issues)
[](https://github.com/WolfgangFahl/pyomnigraph/issues/?q=is%3Aissue+is%3Aclosed)
[](https://WolfgangFahl.github.io/pyomnigraph/)
[](https://www.apache.org/licenses/LICENSE-2.0)
Unified Python interface for multiple graph databases
## Docs and Tutorials
[Wiki](https://wiki.bitplan.com/index.php/pyomnigraph)
## Motivation
The graph database landscape is fragmented, with each triple store having its own APIs, deployment methods, and operational quirks. Developers and researchers working with RDF data often need to:
- **Switch between different triple stores** for performance comparisons
- **Migrate data** from one system to another
- **Test the same queries** across multiple backends
- **Deploy applications** that work with various graph databases
This leads to:
- ❌ **Duplicated effort** writing database-specific code
- ❌ **Vendor lock-in** making migrations difficult
- ❌ **Inconsistent interfaces** slowing development
- ❌ **Manual deployment** processes for each database
**pyomnigraph solves this** by providing:
- ✅ **Unified API** - Same Python interface for all supported databases
- ✅ **Standardized deployment** - Consistent Docker-based setup
- ✅ **Easy switching** - Change backends with a single parameter
- ✅ **Comparative testing** - Run identical operations across multiple stores
- ✅ **Simplified management** - Start, stop, load data with simple commands
### Supported Triple Stores
| Database | Status | Strengths |
|----------|--------|-----------|
| **Blazegraph** | 🟢 Working | High performance, easy setup |
| **Apache Jena** | 🟢 Working | Robust, standards compliant |
| **QLever** | 🟢 Working | Extremely fast queries |
| **GraphDB** | 🛑 Planned | Enterprise features, reasoning |
| **Virtuoso** | 🛑 In Progress | Mature, SQL integration |
| **Stardog** | 🛑 Planned | Knowledge graphs, reasoning |
| **Oxigraph** | 🛑 Planned | Rust-based, embedded |
Whether you're building a semantic web application, conducting research, or evaluating different triple stores, pyomnigraph eliminates the complexity of working with multiple graph database systems.
## Examples
```bash
omnigraph omnigraph --list --include-inactive --doc-format github
```
| Active | Name | Container Name | Wikidata | Image | Port | Test Port | Dataset | User |
|----------|-------------------------------------|----------------------|--------------------------------------------------------|--------------------------------------------------------------------------------------------------|--------|-------------|-----------|--------|
| 🟢️ | [blazegraph](http://localhost:9898) | blazegraph-omnigraph | [Q20127748](https://www.wikidata.org/wiki/Q20127748) | [lyrasis/blazegraph:2.1.5](https://hub.docker.com/r/lyrasis/blazegraph) | 9898 | 7898 | kb | |
| 🛑 | [graphdb](http://localhost:7200) | graphdb-omnigraph | [Q58425577](https://www.wikidata.org/wiki/Q58425577) | [ontotext/graphdb:9.11.2-se](https://hub.docker.com/r/ontotext/graphdb) | 7200 | 7700 | repo1 | |
| 🟢️ | [jena](http://localhost:3030) | jena-omnigraph | [Q109376461](https://www.wikidata.org/wiki/Q109376461) | [stain/jena-fuseki:latest](https://hub.docker.com/r/stain/jena-fuseki) | 3030 | 7030 | ds | admin |
| 🛑 | [oxigraph](http://localhost:7878) | oxigraph-omnigraph | [Q118980507](https://www.wikidata.org/wiki/Q118980507) | [oxigraph/oxigraph:latest](https://hub.docker.com/r/oxigraph/oxigraph) | 7878 | 7378 | default | |
| 🟢️ | [qlever](http://localhost:7019) | qlever-omnigraph | [Q111016295](https://www.wikidata.org/wiki/Q111016295) | [adfreiburg/qlever:latest](https://hub.docker.com/r/adfreiburg/qlever) | 7019 | 7819 | olympics | |
| 🛑 | [stardog](http://localhost:5820) | stardog-omnigraph | [Q91147741](https://www.wikidata.org/wiki/Q91147741) | [stardog/stardog:latest](https://hub.docker.com/r/stardog/stardog) | 5820 | 5320 | mydb | admin |
| 🛑 | [virtuoso](http://localhost:8890) | virtuoso-omnigraph | [Q7935239](https://www.wikidata.org/wiki/Q7935239) | [openlink/virtuoso-opensource-7:latest](https://hub.docker.com/r/openlink/virtuoso-opensource-7) | 8890 | 8390 | KB | dba |
### Server Management
```bash
# Start specific servers
omnigraph -s jena --cmd start
# Restart sequence - stop remove and start
omnigraph -s jena --cmd stop rm start
# Start all configured servers
omnigraph -s all --cmd start
# Check server status
omnigraph -s blazegraph --cmd status
# Open web ui
omnigraph -s jena --cmd webui
```
### Data Operations
```bash
# Load datasets
omnigraph -s blazegraph --cmd load
# Get triple count
omnigraph -s blazegraph --cmd count
# Use test environment
omnigraph --test -s blazegraph --cmd start load
```
## Usage
### omnigraph command line
```bash
omnigraph -h
usage: omnigraph [-h] [-a] [-d] [-ds DATASETS [DATASETS ...]] [-dc DATASETS_CONFIG] [-f] [-r {turtle,rdf-xml,n3,json-ld}] [-q] [-V] [--apache APACHE]
[-c CONFIG] [--cmd CMD [CMD ...]] [-df DOC_FORMAT] [-l] [--test] [-s SERVERS [SERVERS ...]] [-v]
Unified Python interface for multiple graph databases
options:
-h, --help show this help message and exit
-a, --about show about info [default: False]
-d, --debug show debug info [default: False]
-ds DATASETS [DATASETS ...], --datasets DATASETS [DATASETS ...]
datasets to work with - all is an alias for all datasets [default: ['wikidata_triplestores']]
-dc DATASETS_CONFIG, --datasets-config DATASETS_CONFIG
Path to datasets configuration YAML file [default: /Users/wf/Library/Python/3.12/lib/python/site-
packages/omnigraph/resources/examples/datasets.yaml]
-f, --force force actions that would modify existing data [default: False]
-r {turtle,rdf-xml,n3,json-ld}, --rdf_format {turtle,rdf-xml,n3,json-ld}
RDF format to use [default: turtle]
-q, --quiet avoid any output [default: False]
-V, --version show program's version number and exit
--apache APACHE create apache configuration file for the given server(s)
-c CONFIG, --config CONFIG
Path to server configuration YAML file [default: /Users/wf/Library/Python/3.12/lib/python/site-
packages/omnigraph/resources/examples/servers.yaml]
--cmd CMD [CMD ...] commands to execute on servers: bash, clear, count, info, load, logs, needed, rm, start, status, stop, webui
-df DOC_FORMAT, --doc-format DOC_FORMAT
The document format to use [default: plain]
-l, --list-servers List available servers [default: False]
--test use test environment [default: False]
-s SERVERS [SERVERS ...], --servers SERVERS [SERVERS ...]
servers to work with - 'all' selects all configured servers [default: ['blazegraph']]
-v, --verbose show verbose output [default: False]
```
### rdfdump command line
```bash
rdfdump -h
usage: rdfdump [-h] [-a] [-d] [-ds DATASETS [DATASETS ...]] [-dc DATASETS_CONFIG] [-f] [-r {turtle,rdf-xml,n3,json-ld}] [-q] [-V] [--limit LIMIT] [-l]
[--count] [--dump] [-4o] [--max-count MAX_COUNT] [--no-progress] [--output-path OUTPUT_PATH] [--tryit]
Unified Python interface for multiple graph databases
options:
-h, --help show this help message and exit
-a, --about show about info [default: False]
-d, --debug show debug info [default: False]
-ds DATASETS [DATASETS ...], --datasets DATASETS [DATASETS ...]
datasets to work with - all is an alias for all datasets [default: ['wikidata_triplestores']]
-dc DATASETS_CONFIG, --datasets-config DATASETS_CONFIG
Path to datasets configuration YAML file [default: /Users/wf/Library/Python/3.12/lib/python/site-
packages/omnigraph/resources/examples/datasets.yaml]
-f, --force force actions that would modify existing data [default: False]
-r {turtle,rdf-xml,n3,json-ld}, --rdf_format {turtle,rdf-xml,n3,json-ld}
RDF format to use [default: turtle]
-q, --quiet avoid any output [default: False]
-V, --version show program's version number and exit
--limit LIMIT Number of triples per request [default: 10000]
-l, --list List available datasets [default: False]
--count List available datasets with triple counts[default: False]
--dump perform the dump [default: False]
-4o, --for-omnigraph store dump at default omnigraph location [default: False]
--max-count MAX_COUNT
Maximum number of solutions/triples to download (uses dataset expected_solutions if not specified)
--no-progress Disable progress bar
--output-path OUTPUT_PATH
Path for dump files
--tryit open the try it! URL [default: False]
```
Raw data
{
"_id": null,
"home_page": null,
"name": "pyomnigraph",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": "Wolfgang Fahl <wf@WolfgangFahl.com>",
"keywords": "SPARQL, blazegraph, database, graph, jena, neo4j, qlever, rdf, virtuoso, weaviate",
"author": null,
"author_email": "Wolfgang Fahl <wf@WolfgangFahl.com>",
"download_url": "https://files.pythonhosted.org/packages/16/a1/04e348b701e2346a5823e0998c04941a7c36fb921241b7b804e322483592/pyomnigraph-0.1.0.tar.gz",
"platform": null,
"description": "# omnigraph\n[](https://pypi.org/project/pyomnigraph/)\n[](https://github.com/WolfgangFahl/pyomnigraph/actions/workflows/build.yml)\n[](https://pypi.python.org/pypi/pyomnigraph/)\n[](https://github.com/WolfgangFahl/pyomnigraph/issues)\n[](https://github.com/WolfgangFahl/pyomnigraph/issues/?q=is%3Aissue+is%3Aclosed)\n[](https://WolfgangFahl.github.io/pyomnigraph/)\n[](https://www.apache.org/licenses/LICENSE-2.0)\n\n\nUnified Python interface for multiple graph databases\n\n## Docs and Tutorials\n[Wiki](https://wiki.bitplan.com/index.php/pyomnigraph)\n\n## Motivation\n\nThe graph database landscape is fragmented, with each triple store having its own APIs, deployment methods, and operational quirks. Developers and researchers working with RDF data often need to:\n\n- **Switch between different triple stores** for performance comparisons\n- **Migrate data** from one system to another\n- **Test the same queries** across multiple backends\n- **Deploy applications** that work with various graph databases\n\nThis leads to:\n- \u274c **Duplicated effort** writing database-specific code\n- \u274c **Vendor lock-in** making migrations difficult\n- \u274c **Inconsistent interfaces** slowing development\n- \u274c **Manual deployment** processes for each database\n\n**pyomnigraph solves this** by providing:\n- \u2705 **Unified API** - Same Python interface for all supported databases\n- \u2705 **Standardized deployment** - Consistent Docker-based setup\n- \u2705 **Easy switching** - Change backends with a single parameter\n- \u2705 **Comparative testing** - Run identical operations across multiple stores\n- \u2705 **Simplified management** - Start, stop, load data with simple commands\n\n### Supported Triple Stores\n\n| Database | Status | Strengths |\n|----------|--------|-----------|\n| **Blazegraph** | \ud83d\udfe2 Working | High performance, easy setup |\n| **Apache Jena** | \ud83d\udfe2 Working | Robust, standards compliant |\n| **QLever** | \ud83d\udfe2 Working | Extremely fast queries |\n| **GraphDB** | \ud83d\uded1 Planned | Enterprise features, reasoning |\n| **Virtuoso** | \ud83d\uded1 In Progress | Mature, SQL integration |\n| **Stardog** | \ud83d\uded1 Planned | Knowledge graphs, reasoning |\n| **Oxigraph** | \ud83d\uded1 Planned | Rust-based, embedded |\n\nWhether you're building a semantic web application, conducting research, or evaluating different triple stores, pyomnigraph eliminates the complexity of working with multiple graph database systems.\n\n## Examples\n```bash\nomnigraph omnigraph --list --include-inactive --doc-format github\n```\n| Active | Name | Container Name | Wikidata | Image | Port | Test Port | Dataset | User |\n|----------|-------------------------------------|----------------------|--------------------------------------------------------|--------------------------------------------------------------------------------------------------|--------|-------------|-----------|--------|\n| \ud83d\udfe2\ufe0f | [blazegraph](http://localhost:9898) | blazegraph-omnigraph | [Q20127748](https://www.wikidata.org/wiki/Q20127748) | [lyrasis/blazegraph:2.1.5](https://hub.docker.com/r/lyrasis/blazegraph) | 9898 | 7898 | kb | |\n| \ud83d\uded1 | [graphdb](http://localhost:7200) | graphdb-omnigraph | [Q58425577](https://www.wikidata.org/wiki/Q58425577) | [ontotext/graphdb:9.11.2-se](https://hub.docker.com/r/ontotext/graphdb) | 7200 | 7700 | repo1 | |\n| \ud83d\udfe2\ufe0f | [jena](http://localhost:3030) | jena-omnigraph | [Q109376461](https://www.wikidata.org/wiki/Q109376461) | [stain/jena-fuseki:latest](https://hub.docker.com/r/stain/jena-fuseki) | 3030 | 7030 | ds | admin |\n| \ud83d\uded1 | [oxigraph](http://localhost:7878) | oxigraph-omnigraph | [Q118980507](https://www.wikidata.org/wiki/Q118980507) | [oxigraph/oxigraph:latest](https://hub.docker.com/r/oxigraph/oxigraph) | 7878 | 7378 | default | |\n| \ud83d\udfe2\ufe0f | [qlever](http://localhost:7019) | qlever-omnigraph | [Q111016295](https://www.wikidata.org/wiki/Q111016295) | [adfreiburg/qlever:latest](https://hub.docker.com/r/adfreiburg/qlever) | 7019 | 7819 | olympics | |\n| \ud83d\uded1 | [stardog](http://localhost:5820) | stardog-omnigraph | [Q91147741](https://www.wikidata.org/wiki/Q91147741) | [stardog/stardog:latest](https://hub.docker.com/r/stardog/stardog) | 5820 | 5320 | mydb | admin |\n| \ud83d\uded1 | [virtuoso](http://localhost:8890) | virtuoso-omnigraph | [Q7935239](https://www.wikidata.org/wiki/Q7935239) | [openlink/virtuoso-opensource-7:latest](https://hub.docker.com/r/openlink/virtuoso-opensource-7) | 8890 | 8390 | KB | dba |\n\n### Server Management\n\n```bash\n# Start specific servers\nomnigraph -s jena --cmd start\n\n# Restart sequence - stop remove and start\nomnigraph -s jena --cmd stop rm start\n\n# Start all configured servers\nomnigraph -s all --cmd start\n\n# Check server status\nomnigraph -s blazegraph --cmd status\n\n# Open web ui\nomnigraph -s jena --cmd webui\n```\n\n### Data Operations\n\n```bash\n# Load datasets\nomnigraph -s blazegraph --cmd load\n\n# Get triple count\nomnigraph -s blazegraph --cmd count\n\n# Use test environment\nomnigraph --test -s blazegraph --cmd start load\n```\n\n## Usage\n### omnigraph command line\n```bash\nomnigraph -h\nusage: omnigraph [-h] [-a] [-d] [-ds DATASETS [DATASETS ...]] [-dc DATASETS_CONFIG] [-f] [-r {turtle,rdf-xml,n3,json-ld}] [-q] [-V] [--apache APACHE]\n [-c CONFIG] [--cmd CMD [CMD ...]] [-df DOC_FORMAT] [-l] [--test] [-s SERVERS [SERVERS ...]] [-v]\n\nUnified Python interface for multiple graph databases\n\noptions:\n -h, --help show this help message and exit\n -a, --about show about info [default: False]\n -d, --debug show debug info [default: False]\n -ds DATASETS [DATASETS ...], --datasets DATASETS [DATASETS ...]\n datasets to work with - all is an alias for all datasets [default: ['wikidata_triplestores']]\n -dc DATASETS_CONFIG, --datasets-config DATASETS_CONFIG\n Path to datasets configuration YAML file [default: /Users/wf/Library/Python/3.12/lib/python/site-\n packages/omnigraph/resources/examples/datasets.yaml]\n -f, --force force actions that would modify existing data [default: False]\n -r {turtle,rdf-xml,n3,json-ld}, --rdf_format {turtle,rdf-xml,n3,json-ld}\n RDF format to use [default: turtle]\n -q, --quiet avoid any output [default: False]\n -V, --version show program's version number and exit\n --apache APACHE create apache configuration file for the given server(s)\n -c CONFIG, --config CONFIG\n Path to server configuration YAML file [default: /Users/wf/Library/Python/3.12/lib/python/site-\n packages/omnigraph/resources/examples/servers.yaml]\n --cmd CMD [CMD ...] commands to execute on servers: bash, clear, count, info, load, logs, needed, rm, start, status, stop, webui\n -df DOC_FORMAT, --doc-format DOC_FORMAT\n The document format to use [default: plain]\n -l, --list-servers List available servers [default: False]\n --test use test environment [default: False]\n -s SERVERS [SERVERS ...], --servers SERVERS [SERVERS ...]\n servers to work with - 'all' selects all configured servers [default: ['blazegraph']]\n -v, --verbose show verbose output [default: False]\n```\n\n### rdfdump command line\n```bash\nrdfdump -h\nusage: rdfdump [-h] [-a] [-d] [-ds DATASETS [DATASETS ...]] [-dc DATASETS_CONFIG] [-f] [-r {turtle,rdf-xml,n3,json-ld}] [-q] [-V] [--limit LIMIT] [-l]\n [--count] [--dump] [-4o] [--max-count MAX_COUNT] [--no-progress] [--output-path OUTPUT_PATH] [--tryit]\n\nUnified Python interface for multiple graph databases\n\noptions:\n -h, --help show this help message and exit\n -a, --about show about info [default: False]\n -d, --debug show debug info [default: False]\n -ds DATASETS [DATASETS ...], --datasets DATASETS [DATASETS ...]\n datasets to work with - all is an alias for all datasets [default: ['wikidata_triplestores']]\n -dc DATASETS_CONFIG, --datasets-config DATASETS_CONFIG\n Path to datasets configuration YAML file [default: /Users/wf/Library/Python/3.12/lib/python/site-\n packages/omnigraph/resources/examples/datasets.yaml]\n -f, --force force actions that would modify existing data [default: False]\n -r {turtle,rdf-xml,n3,json-ld}, --rdf_format {turtle,rdf-xml,n3,json-ld}\n RDF format to use [default: turtle]\n -q, --quiet avoid any output [default: False]\n -V, --version show program's version number and exit\n --limit LIMIT Number of triples per request [default: 10000]\n -l, --list List available datasets [default: False]\n --count List available datasets with triple counts[default: False]\n --dump perform the dump [default: False]\n -4o, --for-omnigraph store dump at default omnigraph location [default: False]\n --max-count MAX_COUNT\n Maximum number of solutions/triples to download (uses dataset expected_solutions if not specified)\n --no-progress Disable progress bar\n --output-path OUTPUT_PATH\n Path for dump files\n --tryit open the try it! URL [default: False]\n```",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "pyomnigraph: Unified Python interface for multiple graph databases (SPARQL, Neo4j, Weaviate)",
"version": "0.1.0",
"project_urls": {
"Documentation": "https://wiki.bitplan.com/index.php/omnigraph",
"Home": "https://github.com/WolfgangFahl/omnigraph",
"Source": "https://github.com/WolfgangFahl/omnigraph"
},
"split_keywords": [
"sparql",
" blazegraph",
" database",
" graph",
" jena",
" neo4j",
" qlever",
" rdf",
" virtuoso",
" weaviate"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "8b5195dcb813c7f5b5d4ce4516ef5f507ce0606d41e03019f09d0dca64d0935e",
"md5": "3975c89912480cf75c2f927bbdc61fef",
"sha256": "e1248daf2933db33c4321ad9326b3f239ec8df32f8d8ed1f1e0c1745e97bf827"
},
"downloads": -1,
"filename": "pyomnigraph-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3975c89912480cf75c2f927bbdc61fef",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 47339,
"upload_time": "2025-08-03T06:07:11",
"upload_time_iso_8601": "2025-08-03T06:07:11.050455Z",
"url": "https://files.pythonhosted.org/packages/8b/51/95dcb813c7f5b5d4ce4516ef5f507ce0606d41e03019f09d0dca64d0935e/pyomnigraph-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "16a104e348b701e2346a5823e0998c04941a7c36fb921241b7b804e322483592",
"md5": "a7c7366f94844608e623476d1e01ed9b",
"sha256": "3f607e3b19d61703a37914b9cce1bc6ae46a9b3bd1427896853987858816d2b7"
},
"downloads": -1,
"filename": "pyomnigraph-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "a7c7366f94844608e623476d1e01ed9b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 41997,
"upload_time": "2025-08-03T06:07:13",
"upload_time_iso_8601": "2025-08-03T06:07:13.060974Z",
"url": "https://files.pythonhosted.org/packages/16/a1/04e348b701e2346a5823e0998c04941a7c36fb921241b7b804e322483592/pyomnigraph-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-03 06:07:13",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "WolfgangFahl",
"github_project": "omnigraph",
"github_not_found": true,
"lcname": "pyomnigraph"
}