Skip to main content

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.

Download files

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

Source Distribution

sparqlib-0.5.0.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.

sparqlib-0.5.0-py3-none-any.whl (32.5 kB view details)

Uploaded Python 3

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

Hashes for sparqlib-0.5.0.tar.gz
Algorithm Hash digest
SHA256 824b48c889980fa4613f3c591422a2c9613843ad0d43d64f17be5f2bf984c2a3
MD5 311a2cec3183534ee92bf7e816f050f8
BLAKE2b-256 b44f53156a73916287a75795eec8e46c9ff3926748c6f05d0d7b06a28a0b39f3

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparqlib-0.5.0.tar.gz:

Publisher: pypi.yml on Kurrawong/sparqlib

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

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

Hashes for sparqlib-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4c6932c9ce7ef021f1db339216d38991e822dee3f12d05f7b40dd86c6776d401
MD5 7946e5fa73f36586d2dcfdd2e0719bc5
BLAKE2b-256 522e4d087ed8c62a340bf7e2ffba6f9ff9d6a0201c3b20086e1a1bd05c0964a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for sparqlib-0.5.0-py3-none-any.whl:

Publisher: pypi.yml on Kurrawong/sparqlib

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.5.0 This release

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