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.8.0.tar.gz (119.4 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.8.0-py3-none-any.whl (37.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for rdfproxy-0.8.0.tar.gz
Algorithm Hash digest
SHA256 defd0508b557bcbc00917b7eadb526c8725f21a58ad5005c253b3c8c0fc094c5
MD5 a6228951b639a72ee21a99fdd986e7df
BLAKE2b-256 9a5702b62ea454fb9d44a2512621abbd9d5ca41c97236bf6c470b668958f33c3

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for rdfproxy-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d8d4e6a16fe95e5beb1d0644465e3a2b6353d23244354f1e9dfe8e21bfe99bb6
MD5 04318db3935f7837e720049955f6fa3d
BLAKE2b-256 a460b5ed7ccdc484a25db3036a4db7f50f4da781225d488e427a2d7f00b90ad8

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