Skip to main content

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


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.

Supported by

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