Skip to main content

SPARQLKit

This package provides parsers and serializers for the SPARQL 1.1 Query Language.

Note: This is not a SPARQL processing engine.

Install

pip install sparqlkit

For CLI support:

pip install sparqlkit[cli]

CLI

SPARQLKit provides a command-line interface for formatting SPARQL files.

sparql --help
sparql -h

Commands

format

Format SPARQL files in-place:

sparql format path/to/query.rq
sparql format path/to/directory/

Check if files are formatted without making changes:

sparql format --check path/to/query.rq

Usage

import sparqlkit

query = r'''
PREFIX : <http://www.example.org/>
SELECT * WHERE { ?s ?p ?o }
'''

# Use the convenience function
formatted = sparqlkit.format_string(query)
print(formatted)

Statement type detection

Determine the type and sub-type of a SPARQL statement:

import sparqlkit

# From a statement string
result = sparqlkit.statement_type_from_string("SELECT * WHERE { ?s ?p ?o }")
print(result.type)     # SparqlType.QUERY
print(result.subtype)  # QuerySubType.SELECT

# From a parsed tree
tree = sparqlkit.parse("INSERT DATA { <s> <p> <o> }")
result = sparqlkit.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 sparqlkit

query = "SELECT * WHERE { # comment\n  ?s ?p ?o }\n"
formatted = sparqlkit.format_string(query)
print(formatted)

tree = sparqlkit.parse(query)
print(sparqlkit.serialize(tree))

no_comments = sparqlkit.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 sparqlkit.parser import sparql_query_parser
from sparqlkit.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 sparqlkit.parser import sparql_query_parser
from sparqlkit.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 sparqlkit.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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sparqlkit-0.4.1.tar.gz (142.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sparqlkit-0.4.1-py3-none-any.whl (32.6 kB view details)

Uploaded Python 3

File details

Details for the file sparqlkit-0.4.1.tar.gz.

File metadata

  • Download URL: sparqlkit-0.4.1.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

Hashes for sparqlkit-0.4.1.tar.gz
Algorithm Hash digest
SHA256 0018e4c200348c6a4f28a60ad8bb6fdc18db985b7f762cf4280904c18ba210be
MD5 fa43e8405b269e742ae55375a72c00b3
BLAKE2b-256 bb8f48475950a74a6188affc3449d7b3d3a554a53838280f702349cd4e803618

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparqlkit-0.4.1.tar.gz:

Publisher: pypi.yml on Kurrawong/sparqlkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sparqlkit-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: sparqlkit-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 32.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sparqlkit-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 680820029dbe39edf0f099b01580e78819d6cbabf09a7fc2ac81e88b2af6ae62
MD5 f506a27260cb3915372ef096d21ac749
BLAKE2b-256 53964bc511a564db0797ddb7fb06b80d8e0c9d9f5bc4daaca0c56fb377064d2a

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparqlkit-0.4.1-py3-none-any.whl:

Publisher: pypi.yml on Kurrawong/sparqlkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.4.1 This release

2 files

0.4.0

2 files

0.3.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page