Skip to main content

No project description provided

Project description

RDFProxy

tests coverage docs License: GPL v3 Ruff uv

Functionality for mapping SPARQL result sets to Pydantic models.

SPARQLModelAdapter

The rdfproxy.SPARQLModelAdapter class allows to run a query against an endpoint and map a flat SPARQL query result set to a potentially nested Pydantic model. The result is returned as a Page object.

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,
)

The SPARQLModelAdapter.query 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.query(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.7.0.tar.gz (115.6 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.7.0-py3-none-any.whl (36.2 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for rdfproxy-0.7.0.tar.gz
Algorithm Hash digest
SHA256 519aafb7c289eebacd4980014c2af7499e680fcc86df56b06cfda890d0a70b97
MD5 d3e93a849f696ab666b722cffb9dec51
BLAKE2b-256 a0426d3b86586bb5c56ee8d2f268f14fb0a95b3d42b0d4acceebfa47decf2846

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for rdfproxy-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2a61a382e37455a472dd693e38e649aba564bfe742d39ab4e891aef891e5aa3b
MD5 178e4cb9a65b46bac1ab02d7022b4f0d
BLAKE2b-256 6049ded7d9485fec52550e1a17026377e8d52737a4773dae51aa1e6efb63422b

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