Skip to main content

No project description provided

Project description

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
}

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

rdfproxy-0.10.0.tar.gz (114.0 kB view details)

Uploaded Source

Built Distribution

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

rdfproxy-0.10.0-py3-none-any.whl (37.4 kB view details)

Uploaded Python 3

File details

Details for the file rdfproxy-0.10.0.tar.gz.

File metadata

  • Download URL: rdfproxy-0.10.0.tar.gz
  • Upload date:
  • Size: 114.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.22

File hashes

Hashes for rdfproxy-0.10.0.tar.gz
Algorithm Hash digest
SHA256 cb615171ca72219fe45a9fa095f3409d600130d14c99943bdf0b8f7f9b3cff29
MD5 48872a4559d949f6bd51f8977353a8ce
BLAKE2b-256 4170316c45ac4c2a70c020dd96a90cb8362816f068322a4f0ecd698f262145a8

See more details on using hashes here.

File details

Details for the file rdfproxy-0.10.0-py3-none-any.whl.

File metadata

  • Download URL: rdfproxy-0.10.0-py3-none-any.whl
  • Upload date:
  • Size: 37.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.22

File hashes

Hashes for rdfproxy-0.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a8ae110e66db9efc73e4eddb3a473e259baffa0af6249e445bbfb74149924d55
MD5 88ec7f0dc904d0ab866a0c623d159bb8
BLAKE2b-256 570860c42223ddc38b94f68ae075e57f7f28caee1af440bace7b1ceadf4e3fe4

See more details on using hashes here.

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