Skip to main content

RDFProxy

tests coverage docs License: GPL v3 Ruff uv

RDFProxy is a Python library for building REST APIs on top of SPARQL endpoints.

SPARQLModelAdapter

The rdfproxy.SPARQLModelAdapter class allows to run a SPARQL query against an endpoint and map the query result set to a potentially nested Pydantic model.

The following example query

select *
where {
    values (?gnd ?authorName ?educatedAt ?workName ?work ?viaf) {
        ("119359464" 'Schindel' UNDEF 'Gebürtig' <http://www.wikidata.org/entity/Q1497409> UNDEF)
        ("115612815" 'Geiger' 'University of Vienna' 'Der alte König in seinem Exil' <http://www.wikidata.org/entity/Q15805238> "299260555")
        ("115612815" 'Geiger' 'University of Vienna' 'Der alte König in seinem Exil' <http://www.wikidata.org/entity/Q15805238> "6762154387354230970008")
        ("115612815" 'Geiger' 'University of Vienna' 'Unter der Drachenwand' <http://www.wikidata.org/entity/Q58038819> "2277151717053313900002")
        ("1136992030" 'Edelbauer' 'University of Vienna' 'Das flüssige Land' <http://www.wikidata.org/entity/Q100266054> UNDEF)
        ("1136992030" 'Edelbauer' 'University of Applied Arts Vienna' 'Das flüssige Land' <http://www.wikidata.org/entity/Q100266054> UNDEF)
    }
}

retrieves the result set:

gnd nameLabel educated_atLabel work_name work viaf
"119359464" Schindel Gebürtig http://www.wikidata.org/entity/Q1497409
"115612815" Geiger University of Vienna Der alte König in seinem Exil http://www.wikidata.org/entity/Q15805238 "299260555"
"115612815" Geiger University of Vienna Der alte König in seinem Exil http://www.wikidata.org/entity/Q15805238 "6762154387354230970008"
"115612815" Geiger University of Vienna Unter der Drachenwand http://www.wikidata.org/entity/Q58038819 "2277151717053313900002"
"1136992030" Edelbauer University of Vienna Das flüssige Land http://www.wikidata.org/entity/Q100266054
"1136992030" Edelbauer University of Applied Arts Vienna Das flüssige Land http://www.wikidata.org/entity/Q100266054

The result set can be mapped to a nested Pydantic model like so:

from typing import Annotated

from fastapi import FastAPI, Query
from pydantic import BaseModel
from rdfproxy import ConfigDict, Page, QueryParameters, SPARQLBinding, SPARQLModelAdapter

class Work(BaseModel):
    model_config = ConfigDict(group_by="name")

    name: Annotated[str, SPARQLBinding("workName")]
    viafs: Annotated[list[str], SPARQLBinding("viaf")]


class Author(BaseModel):
    model_config = ConfigDict(group_by="surname")

    gnd: str
    surname: Annotated[str, SPARQLBinding("authorName")]
    works: list[Work]
    education: Annotated[list[str], SPARQLBinding("educatedAt")]


adapter = SPARQLModelAdapter(
    target="https://query.wikidata.org/bigdata/namespace/wdq/sparql",
    query=query,
    model=Author,
)

Note that grouping and aggregation of scalar values and nested models is supported by specifying a group_by entry in the rdfproxy.ConfigDict and indicating an aggregation target with a list-annotated field in the model.

The SPARQLModelAdapter.get_page method runs the query and constructs a Page object which can then be served over a FastAPI route:

app = FastAPI()

@app.get("/")
def base_route(query_parameters: Annotated[QueryParameters, Query()]) -> Page[Author]:
    return adapter.get_page(query_parameters)

This results in the following JSON output:

{
   "items":[
      {
         "gnd":"119359464",
         "surname":"Schindel",
         "works":[
            {
               "name":"Gebürtig",
               "viafs":[
                  
               ]
            }
         ],
         "education":[
            
         ]
      },
      {
         "gnd":"115612815",
         "surname":"Geiger",
         "works":[
            {
               "name":"Der alte König in seinem Exil",
               "viafs":[
                  "299260555",
                  "6762154387354230970008"
               ]
            },
            {
               "name":"Unter der Drachenwand",
               "viafs":[
                  "2277151717053313900002"
               ]
            }
         ],
         "education":[
            "University of Vienna"
         ]
      },
      {
         "gnd":"1136992030",
         "surname":"Edelbauer",
         "works":[
            {
               "name":"Das flüssige Land",
               "viafs":[
                  
               ]
            }
         ],
         "education":[
            "University of Vienna",
            "University of Applied Arts Vienna"
         ]
      }
   ],
   "page":1,
   "size":100,
   "total":3,
   "pages":1
}

Metadata

Release files for rdfproxy 0.10.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rdfproxy 0.10.1
File Size Uploaded
rdfproxy-0.10.1.tar.gz 114.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rdfproxy 0.10.1
File Interpreter ABI Platform
rdfproxy-0.10.1-py3-none-any.whl Python 3 none any Details

Total release size: 151.5 kB

Release files / rdfproxy-0.10.1.tar.gz

Download URL rdfproxy-0.10.1.tar.gz
Size 114.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a8ce0da79d39a8c55519a94234f732cd0b6718163d571177140bac096d661718
BLAKE2b-256 checksum
How to use checksums
5241f0cd6593018619cf8237d7db80d1c09f7dc7542e2fffef9e91b3357188d7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.5.22

Release files / rdfproxy-0.10.1-py3-none-any.whl

Download URL rdfproxy-0.10.1-py3-none-any.whl
Size 37.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cb889fe4d1b68717ff4a5dfee781d7d130458708d6b067332b24ea4aa7623a5a
BLAKE2b-256 checksum
How to use checksums
a4772db669eda75ca3d2fffbd3a4ffccecd900279e3fb208121b959dd59ee9bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.5.22

Release history Release notifications | RSS feed

This release

0.10.1 This release

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page