This package provides parsers and serializers for the SPARQL 1.1 Query and Update Language.
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sparqlib-0.5.0.tar.gz.
File metadata
- Download URL: sparqlib-0.5.0.tar.gz
- Upload date:
- Size: 142.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
824b48c889980fa4613f3c591422a2c9613843ad0d43d64f17be5f2bf984c2a3
|
|
| MD5 |
311a2cec3183534ee92bf7e816f050f8
|
|
| BLAKE2b-256 |
b44f53156a73916287a75795eec8e46c9ff3926748c6f05d0d7b06a28a0b39f3
|
Provenance
The following attestation bundles were made for sparqlib-0.5.0.tar.gz:
Publisher:
pypi.yml on Kurrawong/sparqlib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sparqlib-0.5.0.tar.gz -
Subject digest:
824b48c889980fa4613f3c591422a2c9613843ad0d43d64f17be5f2bf984c2a3 - Sigstore transparency entry: 929753382
- Sigstore integration time:
-
Permalink:
Kurrawong/sparqlib@d97a4d92bff250c09d355edde2e93f0b01ee5b77 -
Branch / Tag:
refs/tags/0.5.0 - Owner: https://github.com/Kurrawong
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@d97a4d92bff250c09d355edde2e93f0b01ee5b77 -
Trigger Event:
release
-
Statement type:
File details
Details for the file sparqlib-0.5.0-py3-none-any.whl.
File metadata
- Download URL: sparqlib-0.5.0-py3-none-any.whl
- Upload date:
- Size: 32.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c6932c9ce7ef021f1db339216d38991e822dee3f12d05f7b40dd86c6776d401
|
|
| MD5 |
7946e5fa73f36586d2dcfdd2e0719bc5
|
|
| BLAKE2b-256 |
522e4d087ed8c62a340bf7e2ffba6f9ff9d6a0201c3b20086e1a1bd05c0964a0
|
Provenance
The following attestation bundles were made for sparqlib-0.5.0-py3-none-any.whl:
Publisher:
pypi.yml on Kurrawong/sparqlib
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sparqlib-0.5.0-py3-none-any.whl -
Subject digest:
4c6932c9ce7ef021f1db339216d38991e822dee3f12d05f7b40dd86c6776d401 - Sigstore transparency entry: 929753384
- Sigstore integration time:
-
Permalink:
Kurrawong/sparqlib@d97a4d92bff250c09d355edde2e93f0b01ee5b77 -
Branch / Tag:
refs/tags/0.5.0 - Owner: https://github.com/Kurrawong
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@d97a4d92bff250c09d355edde2e93f0b01ee5b77 -
Trigger Event:
release
-
Statement type: