SPARQLib
This package provides parsers and serializers for the SPARQL 1.1 Query Language.
Note: This is not a SPARQL processing engine.
Install
pip install sparqlib
For CLI support:
pip install sparqlib[cli]
CLI
SPARQLib provides a command-line interface for formatting SPARQL files.
sparqlib --help
sparqlib -h
Commands
format
Format SPARQL files in-place:
sparqlib format path/to/query.rq
sparqlib format path/to/directory/
Check if files are formatted without making changes:
sparqlib format --check path/to/query.rq
Usage
import sparqlib
query = r'''
PREFIX : <http://www.example.org/>
SELECT * WHERE { ?s ?p ?o }
'''
# Use the convenience function
formatted = sparqlib.format_string(query)
print(formatted)
Statement type detection
Determine the type and sub-type of a SPARQL statement:
import sparqlib
# From a statement string
result = sparqlib.statement_type_from_string("SELECT * WHERE { ?s ?p ?o }")
print(result.type) # SparqlType.QUERY
print(result.subtype) # QuerySubType.SELECT
# From a parsed tree
tree = sparqlib.parse("INSERT DATA { <s> <p> <o> }")
result = sparqlib.statement_type(tree)
print(result.type) # SparqlType.UPDATE
print(result.subtype) # UpdateSubType.INSERT_DATA
Supported query sub-types: SELECT, CONSTRUCT, DESCRIBE, ASK
Supported update sub-types: INSERT_WHERE, INSERT_DATA, DELETE_WHERE, DELETE_DATA, MODIFY, DROP, CLEAR, LOAD, CREATE, ADD, MOVE, COPY
Note: MODIFY includes both INSERT and DELETE operations. E.g., DELETE {…} INSERT {…} WHERE {…}
Preserving comments
Comments are preserved end-to-end through format_string and parse/serialize by default.
To disable comment preservation, use preserve_comments=False:
import sparqlib
query = "SELECT * WHERE { # comment\n ?s ?p ?o }\n"
formatted = sparqlib.format_string(query)
print(formatted)
tree = sparqlib.parse(query)
print(sparqlib.serialize(tree))
no_comments = sparqlib.format_string(query, preserve_comments=False)
print(no_comments)
Notes:
- Comments are preserved using stable anchoring (nearby-token association), not exact original spacing.
- Comments are emitted as standalone lines by default for safety, but common inline forms are preserved:
SELECT ?x # comment(inline after a token)WHERE { # comment(inline after{)FILTER(... ) # comment(inline after))
For advanced usage with the AST:
from sparqlib.parser import sparql_query_parser
from sparqlib.serializer import SparqlSerializer
tree = sparql_query_parser.parse(query)
serializer = SparqlSerializer()
result = serializer.visit_topdown(tree)
print(result)
Features
Iterative Stack-Based Serializer
The SPARQL serializer uses an iterative stack-based approach, allowing serialization of queries with arbitrary complexity and nesting depth (e.g., 1500+ nested OPTIONALs) without triggering Python's RecursionError.
Deep Nesting Example
from sparqlib.parser import sparql_query_parser
from sparqlib.serializer import SparqlSerializer
# Create a deeply nested query string
depth = 2000
query = "SELECT * WHERE { " + ("OPTIONAL { " * depth) + "?s ?p ?o" + (" }" * depth) + " }"
# Parse and serialize (no RecursionError)
tree = sparql_query_parser.parse(query)
serializer = SparqlSerializer()
result = serializer.visit_topdown(tree)
print(f"Successfully serialized query with nesting depth {depth}")
Extensibility
The serializer can be extended through subclassing to customize output:
from sparqlib.serializer import SparqlSerializer
from lark import Tree
class CustomSerializer(SparqlSerializer):
def _build_handler_map(self):
handlers = super()._build_handler_map()
handlers["var"] = {"enter": CustomSerializer._custom_var_enter, "exit": None}
return handlers
def _custom_var_enter(self, tree: Tree, context: dict) -> bool:
self._parts.append(tree.children[0].value.upper())
self._parts.append(" ")
return True
Conformance
The parser and serializer passes all 1,070+ tests including those from the https://github.com/w3c/rdf-tests repository.
Metadata
Release files for sparqlib 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sparqlib-0.5.0.tar.gz | 142.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sparqlib-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 175.5 kB
Release files / sparqlib-0.5.0.tar.gz
| Download URL | sparqlib-0.5.0.tar.gz |
|---|---|
| Size | 142.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
824b48c889980fa4613f3c591422a2c9613843ad0d43d64f17be5f2bf984c2a3
|
|
BLAKE2b-256 checksum How to use checksums |
b44f53156a73916287a75795eec8e46c9ff3926748c6f05d0d7b06a28a0b39f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 9, 2026.
Transparency logRelease files / sparqlib-0.5.0-py3-none-any.whl
| Download URL | sparqlib-0.5.0-py3-none-any.whl |
|---|---|
| Size | 32.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4c6932c9ce7ef021f1db339216d38991e822dee3f12d05f7b40dd86c6776d401
|
|
BLAKE2b-256 checksum How to use checksums |
522e4d087ed8c62a340bf7e2ffba6f9ff9d6a0201c3b20086e1a1bd05c0964a0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 9, 2026.
Transparency log