SPARQL-Dokumentation

Welche Endpunkte, Properties und Queries PoliSPARQL nutzt

Stand: 2026-07-23 · Quelle im Code: web/app.js, web/person-search.html. Alle Browser-Requests gehen direkt an öffentliche Wikidata-APIs (kein eigenes SPARQL-Backend).

1. Architektur & Abruf

ZweckURLMethode
SPARQL-Abfragen https://query.wikidata.org/sparql?query=…&format=json GET + Header Accept: application/sparql-results+json
Personendetail https://www.wikidata.org/wiki/Special:EntityData/{QID}.json GET (JSON)
Portrait https://commons.wikimedia.org/wiki/Special:FilePath/{Datei}?width=280 Bild-URL aus Claim P18
Die Query-Zeichenkette wird mit encodeURIComponent in die URL gesetzt. Labels kommen über den Wikibase-Label-Service (SERVICE wikibase:label, Sprachen de,en).

Hilfsfunktionen (Client)

2. Genutzte Wikidata-Properties & Klassen

IDBedeutungWo
P31ist ein(e)Länder, Parlaments-Typen
P194Vertretungskörperschaft / LegislativeLand → Parlament (auch: Gliederungseinheit → Landesparlament)
P150enthält VerwaltungseinheitLand → Bundesland/Kanton/US-Bundesstaat (für untergeordnete Parlamente)
P527hat TeilKammern eines Parlaments
P1001gilt für JurisdiktionParlament ↔ Land
P361ist Teil vonAmts-Position ↔ Parlament
P279Unterklasse vonPosition → „Mitglied eines Parlaments“
P39Position innegehabt / AmtPerson → Mandat (p:/ps:/pq:)
P580 / P582Beginn / Ende (Qualifikator)am P39-Statement
P4100Fraktion (Qualifikator)am P39-Statement
P768Wahlkreis (Qualifikator)am P39-Statement
P102ParteiFallback wenn keine Fraktion
P18 / P569 / P570 / P19 / P106Bild, Geburt, Tod, Geburtsort, BerufDetailseite (EntityData)
Q3624078souveräner StaatLänderliste
Q486839Mitglied eines ParlamentsFilter für Abgeordneten-Ämter
Q35749 / Q10553309 / Q110315425 / Q2145275 / Q257000Parlament / Oberhaus / Unterhaus / Legislativkammer / VolksvertretungParlaments-Typen
Q5MenschNamenssuche

3. Query Q1 – Länder

Wird beim App-Start geladen. Nur Staaten mit gesetzter Legislative (P194).

SELECT DISTINCT ?country ?countryLabel WHERE {
  ?country wdt:P31 wd:Q3624078 .
  ?country wdt:P194 ?legislature .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "de,en". }
}
ORDER BY ?countryLabel

Ergebnis-Mapping: { qid, label } aus ?country / ?countryLabel.

In Wikidata Query Service öffnen

4. Query Q2 – Parlamente eines Landes

Parameter: countryQid (z. B. Q183 für Deutschland), per BIND(wd:${countryQid} AS ?country) eingesetzt.

Vier UNION-Zweige:

  1. Direkt P194 am Land (z. B. Bundestag, Bundesrat)
  2. Untergeordnete Parlamente: P150 (enthält Verwaltungseinheit) vom Land zur Gliederungseinheit (Bundesland/Kanton/US-Bundesstaat …), dort wieder P194 — findet Landtage, State Legislatures, Kantonsparlamente etc., ohne Land-für-Land Sonderfälle
  3. Teile (P527) der Legislative, gefiltert auf Parlaments-/Kammer-Typen
  4. Items mit Jurisdiktion P1001 = Land und Parlaments-Typ
SELECT DISTINCT ?parliament ?parliamentLabel WHERE {
  BIND(wd:Q183 AS ?country)   # Beispiel: Deutschland
  {
    ?country wdt:P194 ?parliament .
  } UNION {
    ?country wdt:P150 ?subdivision .
    ?subdivision wdt:P194 ?parliament .
  } UNION {
    ?country wdt:P194 ?body .
    ?body wdt:P527 ?parliament .
    ?parliament wdt:P31/wdt:P279* ?t .
    VALUES ?t { wd:Q35749 wd:Q10553309 wd:Q110315425 wd:Q2145275 wd:Q257000 }
  } UNION {
    ?parliament wdt:P1001 ?country .
    ?parliament wdt:P31/wdt:P279* ?t .
    VALUES ?t { wd:Q35749 wd:Q10553309 wd:Q110315425 wd:Q2145275 }
  }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "de,en". }
}
ORDER BY ?parliamentLabel

Nachbearbeitung: Deduplizierung nach QID im Client.

Getestet gegen Wikidata: Deutschland 2 → 19 Treffer (alle 16 Landtage/Bürgerschaften + Bundestag + Bundesrat), USA 178 → 60 (echte State Legislatures statt einzelner Kongress-Sitzungsperioden), Schweiz 32 Kantonsparlamente. Eine Variante mit P31/P279* gegen die generische Oberklasse „Legislative“ (Q11204) wurde verworfen, weil sie auch einzelne Wahlperioden/Sitzungen (z. B. „1. Deutscher Bundestag“) statt der Institution selbst zurückgab.

5. Query Q3 – Abgeordnete eines Parlaments

Parameter: parliamentQid (z. B. Q154797 Deutscher Bundestag). Findet Ämter, die Teil des Parlaments (oder einer Kammer) sind und Unterklasse von „Mitglied eines Parlaments“ (Q486839).

SELECT DISTINCT ?person ?personLabel ?position ?positionLabel
       ?start ?end ?partyLabel ?districtLabel WHERE {
  BIND(wd:Q154797 AS ?parliament)   # Beispiel: Bundestag
  {
    ?position wdt:P361 ?parliament .
    ?position wdt:P279* wd:Q486839 .
  } UNION {
    ?parliament wdt:P527 ?chamber .
    ?position wdt:P361 ?chamber .
    ?position wdt:P279* wd:Q486839 .
  }
  ?person p:P39 ?stmt .
  ?stmt ps:P39 ?position .
  OPTIONAL { ?stmt pq:P580 ?start }
  OPTIONAL { ?stmt pq:P582 ?end }
  OPTIONAL { ?stmt pq:P4100 ?group }
  OPTIONAL { ?person wdt:P102 ?partyEntity }
  BIND(COALESCE(?group, ?partyEntity) AS ?party)
  OPTIONAL { ?stmt pq:P768 ?district }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "de,en". }
}
ORDER BY ?personLabel DESC(?start)
Fraktion bevorzugt (P4100 am Statement), sonst Partei der Person (P102) — zusammengeführt über COALESCE → Label ?partyLabel.

Nachbearbeitung:

6. Query Q4 – Label-Auflösung

Für die Detailseite: QIDs aus EntityData (Ämter, Fraktionen, Wahlkreise, Parteien, Berufe, Geburtsort) in Chunks à max. 50 auflösen.

SELECT ?item ?itemLabel WHERE {
  VALUES ?item { wd:Q1939555 wd:Q1023134 /* … */ }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "de,en". }
}

7. Detailseite – EntityData (kein SPARQL für Kerndaten)

GET https://www.wikidata.org/wiki/Special:EntityData/{QID}.json

Feld in der UIQuelle
Name / Beschreibunglabels.de|en, descriptions.de|en
Bildclaims.P18 → Commons FilePath
Geburt / TodP569 / P570 (time → YYYY-MM-DD)
GeburtsortP19 → Label via Q4
ParteienP102 → Labels via Q4
BerufeP106 → Labels via Q4
Ämter-Tabellebis zu 40× claims.P39 inkl. Qualifikatoren P580/P582/P768/P4100

Darstellung ist lokal in PoliSPARQL — kein Pflicht-Deep-Link nach wikidata.org.

8. Namenssuche (person-search.html)

Separater Einstieg. Sucht Personen per MediaWiki EntitySearch, behält nur Menschen (Q5) mit mindestens einem P39-Amt. Limit 100.

SELECT ?person ?personLabel ?positionLabel ?start ?end
       ?partyLabel ?districtLabel WHERE {
  SERVICE wikibase:mwapi {
    bd:serviceParam wikibase:api "EntitySearch" .
    bd:serviceParam wikibase:endpoint "www.wikidata.org" .
    bd:serviceParam mwapi:search "Olaf Scholz" .   # User-Input, escaped
    bd:serviceParam mwapi:language "de" .
    ?person wikibase:apiOutputItem mwapi:item .
  }
  ?person wdt:P31 wd:Q5 .
  ?person p:P39 ?stmt .
  ?stmt ps:P39 ?position .
  OPTIONAL { ?stmt pq:P580 ?start }
  OPTIONAL { ?stmt pq:P582 ?end }
  OPTIONAL { ?stmt pq:P768 ?district }
  OPTIONAL { ?person wdt:P102 ?party }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "de,en". }
}
ORDER BY DESC(?start)
LIMIT 100

Sonderzeichen im Suchbegriff: \ und " werden vor dem Einbetten escaped.

9. Client-seitige Filter (kein SPARQL)

Nach Q3 filtert die UI lokal:

Länderliste: ebenfalls lokale Substring-Filterung auf dem Label.

10. Frontend-Features (2026-07-23)

Details & verworfene Alternativen: docs/SPARQL_QUERIES.md.

11. Fixes (2026-07-23, Abend)

12. Bekannte Grenzen

Canonical repo path: docs/SPARQL_QUERIES.md (gleiche Inhalte).