EKI04 - Wissensrepräsentation
Symbolische KI: Wie man Wissen als Wissensgraph mit RDF-Tripeln (Subjekt-Prädikat-Objekt) modelliert, über URIs benennt und mit SPARQL abfragt - am Beispiel des TMDB-Filmdatensatzes.
Überblick
Dieses Kapitel gehört zum Bereich der symbolischen KI (symbolic AI / knowledge-based AI). Auf der "KI-Landkarte" von B. Humm liegt das Thema im Feld Knowing - Knowledge representation, zusammen mit den verwandten Techniken Knowledge graphs, Semantic networks, Ontologies und Logic programming. Es steht damit dem Bereich Reasoning nahe und ist das Gegenstück zur nicht-symbolischen KI (Machine Learning).
Kernidee: Wissen über die reale Welt (hier: Wissen über Filme) wird so formal repräsentiert, dass ein Computer es speichern, verknüpfen und maschinell abfragen kann.
Aufbau des Foliensatzes (Kapitel 4):
- Überblick
- Wissensgraphen
- RDF
- Der TMDB Wissensgraph
- SPARQL
- Apache Fuseki
- RDF und SPARQL in Python verwenden
- Mini-Test
Die KI-Landkarte (Einordnung)
Die symbolische KI ("Symbolic AI / Knowledge-based AI") umfasst die Fähigkeiten Reasoning, Acting und Knowing. Wissensrepräsentation ("Knowing") stützt sich auf:
| Feld | Zugehörige Techniken |
|---|---|
| Knowing (Knowledge representation) | Knowledge graphs, Semantic networks, Ontologies, Logic programming |
| Reasoning | Logic programming, Probabilistic reasoning, Complex event processing |
| Acting | Planning, Agent technology, Robotics |
Demgegenüber steht die nicht-symbolische KI (Machine learning, Information retrieval, Data mining) mit Verfahren wie neuronalen Netzen, SVM, Random Forest, Bayes-Netzen usw.
Wissensgraphen (knowledge graphs)
Motivation: Wissen über Filme
Ausgangspunkt ist natürlichsprachliches Wissen, z.B. der Satz über den Film "A Beautiful Mind":
"A Beautiful Mind" ist ein Film, gedreht von dem Regisseur Ron Howard und gehört zu dem Genre Drama.
Um dieses Wissen maschinell zu repräsentieren, zerlegt man den Satz in drei Arten von Bausteinen:
| Baustein | Bedeutung (im Beispiel) | Beispiele aus dem Satz |
|---|---|---|
| Personen bzw. Objekte (Instanzen) | konkrete Individuen | "A Beautiful Mind", Ron Howard, Drama |
| Klassen (classes) | Typen/Kategorien von Objekten | Film, Regisseur, Genre |
| Beziehungen (relations) | Verknüpfungen zwischen Objekten | "ist ein", "gedreht von", "gehört zu" |
Definition Wissensgraph
Ein Wissensgraph (knowledge graph) stellt Wissen als gerichteten Graphen dar: Knoten sind Objekte, Klassen oder Werte; Kanten sind benannte Beziehungen. Das Filmbeispiel als Wissensgraph:
graph LR
M453["#quot;:Movie_453#quot;"] -->|a| MOVIE["#quot;:Movie#quot;"]
M453 -->|":title"| T["#quot;A Beautiful Mind#quot;"]
M453 -->|":genres"| G18["#quot;:Genre_18#quot;"]
G18 -->|a| GENRE["#quot;:Genre#quot;"]
G18 -->|":name"| D["#quot;Drama#quot;"]
Dabei ist :Movie_453 die Instanz (das Objekt), :Movie und :Genre sind Klassen, :title, :genres und :name sind Beziehungen (Prädikate), und die Kante a drückt die Instanz-Beziehung ("ist ein") aus.
Hinweis: Der Wert
"A Beautiful Mind"erscheint hier doppelt - einmal als natürlichsprachliches Objekt im Motivationssatz und einmal als String-Literal am Prädikat:title. Im Graphen ist der Titel ein reiner String-Wert (Literal), nicht selbst ein Objekt/Knoten mit eigener Identität. Das ist keine Fehldarstellung, nur ein Punkt, der leicht verwirrt.
Verwandte Begriffe: Semantisches Netzwerk (semantic network), Linked Data, Ontologie, Thesaurus.
Linked Data: Tausende von Wissensgraphen
Wissensgraphen existieren nicht nur einzeln, sondern als riesiges, vernetztes Ökosystem ("Linked Open Data Cloud"):
- Große Menge an Wissensgraphen
- Öffentlich verfügbar
- Tausende von Einträgen
- Standardisierte Formate
- Viele Domänen, z.B. Gesundheitswesen, Geographie, Medien, Soziale Netze
- Beispiele: Wikidata, dbpedia, YAGO, MeSH
RDF (Resource Description Framework)
Grundlagen
- RDF ist eine formale Sprache, um Wissensgraphen zu repräsentieren.
- Spezifiziert durch das World Wide Web Consortium (W3C) als Teil der Semantic Web Initiative.
- Die in diesem Kurs benutzte Notation ist Turtle (Terse RDF Triple Language).
Resourcen und URIs
RDF-Resourcen werden durch URIs (Uniform Resource Identifiers) repräsentiert. Um lange URIs abzukürzen, definiert man einen base namespace:
@base <https://www.themoviedb.org/kaggle-export/> .
:Movie_453
:Movie_453 ist eine Resource in RDF und eine Abkürzung für die volle URI:
<https://www.themoviedb.org/kaggle-export/Movie_453>
Tripel (triples): Die Notation für Aussagen
Ein RDF-Tripel besteht aus drei Teilen:
| Teil | Englisch | Was es sein kann |
|---|---|---|
| Subjekt | subject | eine Resource |
| Prädikat | predicate | eine weitere Resource |
| Objekt | object | eine Resource oder ein Wert (string, int, float, date, ...) |
Beispiel eines einzelnen Tripels (Subjekt = Resource, Prädikat = Resource, Objekt = Wert vom Typ String):
:Movie_453 :title "A Beautiful Mind" .
Der Punkt . beendet das Tripel. Grafisch entspricht das einer beschrifteten Kante:
graph LR
S["#quot;:Movie_453#quot;"] -->|":title"| O["#quot;A Beautiful Mind#quot;"]
Mehrere Tripel verknüpfen
Mit dem Semikolon ; kann man mehrere Tripel für dasselbe Subjekt verketten. Das a steht für eine Instanz-Beziehung (Abkürzung für rdf:type):
:Movie_453 a :Movie ;
:title "A Beautiful Mind" ;
:genres :Genre_18 .
:Genre_18 a :Genre ;
:name "Drama" .
Diese fünf Tripel bilden genau den weiter oben gezeigten Wissensgraphen ab.
Hinweis: Der Folientitel lautet im Original "RDF Tripel repäsentieren Wissensgraphen" - hier fehlt ein Buchstabe (Tippfehler für "repräsentieren"). Inhaltlich korrekt.
Der TMDB Wissensgraph
Datensatz
Als durchgehendes Beispiel dient ein Kaggle-Auszug der TMDB (The Movie Database), aus der Competition "TMDB Box Office Prediction". Der Datensatz enthält ca. 7398 Filme mit Metadaten (Cast, Crew, Keywords, Budget, Poster, Release-Daten, Sprachen, Produktionsfirmen und -länder).
Datenmodell (UML Klassendiagramm)
Im Zentrum steht die Klasse Movie, die über benannte Beziehungen mit den übrigen Klassen verbunden ist:
graph TB
MOVIE["Movie"]
LANG["Language"]
COUNTRY["Country"]
COMPANY["Company"]
CREW["Crew"]
CAST["Cast"]
GENRE["Genre"]
COLL["Collection"]
KEYWORD["Keyword"]
MOVIE ---|spoken_languages| LANG
MOVIE ---|production_countries| COUNTRY
MOVIE ---|production_companies| COMPANY
MOVIE ---|crew| CREW
MOVIE ---|cast| CAST
MOVIE ---|genres| GENRE
MOVIE ---|belongs_to_collection| COLL
MOVIE ---|keywords| KEYWORD
Die Klassen des TMDB Wissensgraph, die in diesem Kurs verwendet werden, und ihre wichtigsten Attribute:
| Klasse | Attribute (Auswahl) |
|---|---|
| Movie | id, imdb_id, title, original_title, original_language, release_date, status, runtime, overview, tagline, homepage, poster_path, popularity, budget, revenue |
| Genre | id, name |
| Collection | id, name, poster_path, backdrop_path |
| Company | id, name |
| Country | iso_3166_1, name |
| Language | iso_3166_1, name |
| Keyword | id, name |
| Cast | credit_id, cast_id, character, order, id, name, gender, profile_path |
| Crew | credit_id, department, job, id, name, gender, profile_path |
Hinweis: Im UML-Diagramm hat auch die Klasse Language das Attribut
iso_3166_1(eigentlich der Standard für Länder-Codes, während Sprachen üblicherweiseiso_639_1verwenden). Dies ist eine Eigenheit des Kaggle-Datensatzes und wird auf der Folie unverändert übernommen.
RDF-Umwandlung: TMDB.ttl
Der CSV-Datensatz wird mit speziellem Kurs-Code in eine Turtle-Datei TMDB.ttl umgewandelt. Ein Ausschnitt zeigt, wie ein Film als typisierte Resource mit Datentyp-Annotationen (^^xsd:integer, ^^xsd:float) und Verweisen auf andere Resourcen dargestellt wird:
# Movie
:Movie_1 a :Movie ;
:id "1"^^xsd:integer ;
:belongs_to_collection :Collection_313576 ;
:budget "14000000"^^xsd:integer ;
:genres :Genre_35 ;
:imdb_id "tt2637294" ;
:original_language "en" ;
:original_title "Hot Tub Time Machine 2" ;
:overview "When Lou, who has become the 'father of the Internet,' is shot by an unknown assailant, Jacob and Nick fire up the time machine again to save their friend." ;
:popularity "6.575392999999999"^^xsd:float ;
:poster_path "/tQtWuwvMf0hCc2QR2tkolwL7c3c.jpg" ;
:production_companies :Company_4 , :Company_60 , :Company_8411 ;
:production_countries :Country_US ;
:release_date "2/20/15" ;
:runtime "93.0"^^xsd:float ;
:spoken_languages :Language_en ;
:status "Released" ;
:tagline "The Laws of Space and Time are About to be Violated." ;
:title "Hot Tub Time Machine 2" ;
:Keywords :Keyword_4379 , :Keyword_9663 , :Keyword_11830 , :Keyword_179431 ;
:cast :Cast_52fe4ee7c3a36847f82afae7 , ... ;
:crew :Crew_59ac0b67c92514107af02c8c8 , ... .
Beim späteren Laden in Fuseki werden aus dieser Datei (ca. 44 MB) rund 1.329.040 Tripel importiert. Das Komma , verkettet dabei mehrere Objekte für dasselbe Subjekt-Prädikat-Paar.
SPARQL
Was ist SPARQL?
SPARQL (SPARQL Protocol And RDF Query Language) ist die Abfragesprache für RDF-Wissensgraphen:
- Standardisiert durch das W3C
- Aktuelle Version 1.1
Einfache SELECT Query
Eine SPARQL-Query besteht typischerweise aus einem PREFIX (base namespace), einem SELECT-Teil mit Query-Variablen (beginnen mit ?) und einem WHERE-Teil mit einem Muster aus RDF-Tripeln:
PREFIX : <https://www.themoviedb.org/kaggle-export/>
SELECT ?t
WHERE {
?m a :Movie ;
:title ?t .
}
Prinzip: Die Tripel im WHERE-Teil legen ein Muster fest. Alle Zuweisungen an die Variablen im Wissensgraph, die genau auf das Muster passen, werden als Ergebnis zurückgeliefert. Diese Query liefert also die Titel aller Filme (z.B. "Cabin in the Sky", "The Women", "The Lost City of Z", ...) - im Beispiel 3000 Ergebnisse.
SELECT * - alle Variablen selektieren
Mit SELECT * werden alle Query-Variablen selektiert:
PREFIX : <https://www.themoviedb.org/kaggle-export/>
SELECT *
WHERE {
?s a :Movie ;
:title ?t .
}
Ergebnisstruktur einer Query: Das Ergebnis ist eine Tabelle mit einer Spalte für jede Query-Variable (hier ?s und ?t) und einer Zeile für jede Zuweisung, die auf das Muster passt. In der Spalte ?s erscheinen die vollen Movie-URIs, in ?t die Titel.
Mehrere Query-Variablen
PREFIX : <https://www.themoviedb.org/kaggle-export/>
SELECT ?t ?o
WHERE {
?s a :Movie ;
:title ?t ;
:overview ?o .
}
Ergebnis: Tabelle mit den Spalten ?t (Titel) und ?o (overview / Handlung) - im Beispiel 2992 Ergebnisse.
Queries mit Bedingungen
Konkrete Werte als Prädikate oder Objekte schränken das Ergebnis ein. Hier wird nur der Film mit dem Titel "A Beautiful Mind" gesucht:
PREFIX : <https://www.themoviedb.org/kaggle-export/>
SELECT ?o
WHERE {
?s a :Movie ;
:title "A Beautiful Mind" ;
:overview ?o .
}
Ergebnis: genau 1 Zeile - die overview (Handlungsbeschreibung) von "A Beautiful Mind".
Joins
Wird dieselbe Variable (hier ?g) an verschiedenen Stellen der WHERE-Bedingung benutzt, so erzwingt sie jedesmal denselben Wert - das entspricht einem Join:
PREFIX : <https://www.themoviedb.org/kaggle-export/>
SELECT ?m ?t ?g ?n
WHERE {
?m a :Movie ;
:title ?t ;
:genres ?g .
?g :name ?n .
}
Die Variable ?g verbindet die Film-Tripel (:genres ?g) mit den Genre-Tripeln (?g :name ?n). Ergebnis: Filme mit ihren Genre-Namen, z.B. ("Cabin in the Sky", Fantasy), ("Cabin in the Sky", Music), ("The Women", Drama) - im Beispiel 7511 Ergebnisse.
DISTINCT Queries
DISTINCT vermeidet Duplikate in den Ergebnissen. Dieselbe Query ohne und mit DISTINCT:
Ohne DISTINCT (7511 Ergebnisse, "Drama" erscheint mehrfach):
PREFIX : <https://www.themoviedb.org/kaggle-export/>
SELECT ?n
WHERE {
?m a :Movie ;
:title ?t ;
:genres ?g .
?g :name ?n .
}
Mit DISTINCT (nur 20 Ergebnisse - die eindeutigen Genre-Namen):
PREFIX : <https://www.themoviedb.org/kaggle-export/>
SELECT DISTINCT ?n
WHERE {
?m a :Movie ;
:title ?t ;
:genres ?g .
?g :name ?n .
}
Weitere SPARQL-Konzepte
| Konzept | Funktion |
|---|---|
| ASK Queries | Prüft eine Bedingung und liefert einen Wahrheitswert zurück |
| COUNT Queries | Zählt die Anzahl der Ergebnisse |
| FILTER | Ermöglicht zusätzliche Bedingungen, z.B. für Datentypen |
| OPTIONAL | Spezifiziert optionale Werte |
| EXISTS / NOT EXISTS | Negation |
| GROUP BY, HAVING | Aggregation |
| ORDER BY | Sortierung |
| Subqueries | verschachtelte Abfragen |
| CONSTRUCT Queries | Erzeugt neue RDF-Statements als Produktionsregeln |
Vollständige Details in der W3C-Spezifikation zu SPARQL 1.1.
Apache Fuseki
Apache Jena und Fuseki
Apache Jena ist ein freies, quelloffenes Java-Framework für Semantic Web und Linked Data. Es bietet unter anderem:
| Bereich | Komponente | Zweck |
|---|---|---|
| RDF | RDF API | RDF-Graphen erzeugen/lesen, Serialisierung (RDF/XML, Turtle) |
| RDF | ARQ (SPARQL) | SPARQL-1.1-konforme Query-Engine, auch federated / free text search |
| Triple store | TDB | performanter nativer Triple Store |
| Triple store | Fuseki | stellt Tripel als SPARQL-Endpoint über HTTP bereit (REST-Style) |
| OWL | Ontology API | Modelle, RDFS und Web Ontology Language (OWL) |
| OWL | Inference API | Reasoning über die Daten, eingebaute OWL-/RDFS-Reasoner |
Apache Jena Fuseki ist ein SPARQL-Server. Er läuft als eigenständiger Server mit Web-UI, als Betriebssystemdienst, als Java-Webanwendung (WAR) oder eingebettet, und stellt die SPARQL-1.1-Protokolle für Query und Update bereit.
Workflow: Server starten und Datensatz laden
- Fuseki herunterladen und installieren; der Server läuft auf http://localhost:3030.
- New dataset anlegen: Dataset name
TMDB, Dataset type wahlweise "In-memory" (geht bei Neustart verloren) oder "Persistent (TDB2)". Dann create dataset. - Über add data / Upload files zuerst die Datei TMDB.ttl auswählen, anschließend upload now. Ergebnis: 1.329.040 Tripel hochgeladen (44,24 MB).
- Im query-Tab SPARQL-Queries schreiben und mit dem Play-Button ausführen. Das Ergebnis erscheint als Tabelle (Reiter "Table") oder als Rohdaten ("Response"), inklusive Angabe wie "7511 results in 0.195 seconds".
RDF und SPARQL in Python verwenden
rdflib
rdflib ist ein Python-Package für RDF/SPARQL. Installation:
pip install rdflib
python3 -m pip install --user rdflib
rdflib enthält Parser/Serializer (RDF/XML, N3, NTriples, Turtle, TriX, Trig, JSON-LD), eine Graph-Schnittstelle mit verschiedenen Store-Implementierungen (in-memory, on-disk, remote SPARQL endpoints) und eine SPARQL-1.1-Implementierung.
Wissensgraph laden
import rdflib
g = rdflib.Graph()
g.parse('data/TMDB.ttl', format='turtle')
Das Laden kann je nach Größe des Wissensgraphen etwas dauern.
SPARQL-Queries ausführen
Das Ergebnis von g.query(...) hat den Typ SPARQLResult und kann iteriert werden; pro Zeile greift man mit einem Index auf die Variablen zu (row[0] ist die erste Variable):
query_result = g.query(
"""
SELECT distinct ?gg
WHERE {
?m a :Movie ;
:genres ?g .
?g :name ?gg .
}
"""
)
for row in query_result:
print(row[0])
Ausgabe (die eindeutigen Genre-Namen): Comedy, Drama, Family, Romance, Thriller, Action, Animation, Adventure, Horror, Documentary, Music, Crime, Science Fiction, Mystery, Foreign, Fantasy, War, Western, History, TV Movie.
Hinweis: In diesem Python-Beispiel fehlt in der Query-String ein
PREFIX :-Statement, obwohl der leere Präfix:(in:Movie,:genres,:name) verwendet wird. Auf den Fuseki-Folien war derPREFIXstets angegeben. Damit dieses Beispiel lauffähig ist, muss der Default-Namespace zusätzlich (z.B. perinitNs/PREFIX) bekannt gemacht werden. Die Folie zeigt den Code so verkürzt.
Prüfungsrelevanz
- Symbolische vs. nicht-symbolische KI: Wissensrepräsentation gehört zur symbolischen KI, Feld "Knowing"; verwandt: Knowledge graphs, Semantic networks, Ontologies, Logic programming.
- Drei Bausteine von Wissen: Objekte/Personen (Instanzen), Klassen, Beziehungen - am Filmbeispiel sicher zuordnen können.
- Wissensgraph: gerichteter Graph aus Knoten (Objekte, Klassen, Werte) und benannten Kanten (Beziehungen); verwandte Begriffe kennen.
- RDF: formale Sprache zur Repräsentation von Wissensgraphen, vom W3C (Semantic Web); Kurs-Notation ist Turtle.
- Resource und URI: jede Resource hat eine URI;
@base/PREFIXerlaubt Abkürzungen (:Movie_453). - RDF-Tripel = Subjekt + Prädikat + Objekt: Subjekt und Prädikat sind Resourcen, Objekt ist Resource ODER Wert;
.beendet ein Tripel,;verkettet,a=rdf:type. - TMDB-Klassen: Movie, Genre, Collection, Company, Country, Language, Keyword, Cast, Crew.
- SPARQL-Grundgerüst:
PREFIX,SELECT ?var,WHERE { muster }; Variablen beginnen mit?. - Ergebnisformat: Tabelle mit einer Spalte pro Query-Variable und einer Zeile pro passender Zuweisung.
- Bedingungen durch konkrete Werte, Joins durch mehrfache Nutzung derselben Variable, DISTINCT gegen Duplikate.
- Weitere Konzepte: ASK, COUNT, FILTER, OPTIONAL, EXISTS/NOT EXISTS, GROUP BY/HAVING, ORDER BY, CONSTRUCT.
- Werkzeuge: Apache Jena / Fuseki (SPARQL-Server auf localhost:3030), rdflib (Python).
Mini-Test
Mini-Test "Wissensrepräsentation":
- Was ist ein Wissensgraph?
- Nennen Sie Beispiele für Objekte, Klassen und Beziehungen
- Was ist eine Resource in RDF?
- Aus welchen Teilen besteht ein RDF Tripel?
- Nennen Sie die Klassen des TMDB Wissensgraph, welche in diesem Kurs verwendet werden
- Was ist SPARQL?
- Wie sehen einfache Queries in SPARQL aus?
- Wie viele Zeilen und Spalten hat das Ergebnis einer Query?
- Wie drückt man in Queries Bedingungen aus?
- Wie funktioniert ein Join in SPARQL?
- Wie vermeidet man Duplikate in dem Ergebnis einer Query?