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:

FeldZugehörige Techniken
Knowing (Knowledge representation)Knowledge graphs, Semantic networks, Ontologies, Logic programming
ReasoningLogic programming, Probabilistic reasoning, Complex event processing
ActingPlanning, 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:

BausteinBedeutung (im Beispiel)Beispiele aus dem Satz
Personen bzw. Objekte (Instanzen)konkrete Individuen"A Beautiful Mind", Ron Howard, Drama
Klassen (classes)Typen/Kategorien von ObjektenFilm, 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:

TeilEnglischWas es sein kann
Subjektsubjecteine Resource
Prädikatpredicateeine weitere Resource
Objektobjecteine 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:

KlasseAttribute (Auswahl)
Movieid, imdb_id, title, original_title, original_language, release_date, status, runtime, overview, tagline, homepage, poster_path, popularity, budget, revenue
Genreid, name
Collectionid, name, poster_path, backdrop_path
Companyid, name
Countryiso_3166_1, name
Languageiso_3166_1, name
Keywordid, name
Castcredit_id, cast_id, character, order, id, name, gender, profile_path
Crewcredit_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 üblicherweise iso_639_1 verwenden). 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

KonzeptFunktion
ASK QueriesPrüft eine Bedingung und liefert einen Wahrheitswert zurück
COUNT QueriesZählt die Anzahl der Ergebnisse
FILTERErmöglicht zusätzliche Bedingungen, z.B. für Datentypen
OPTIONALSpezifiziert optionale Werte
EXISTS / NOT EXISTSNegation
GROUP BY, HAVINGAggregation
ORDER BYSortierung
Subqueriesverschachtelte Abfragen
CONSTRUCT QueriesErzeugt 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:

BereichKomponenteZweck
RDFRDF APIRDF-Graphen erzeugen/lesen, Serialisierung (RDF/XML, Turtle)
RDFARQ (SPARQL)SPARQL-1.1-konforme Query-Engine, auch federated / free text search
Triple storeTDBperformanter nativer Triple Store
Triple storeFusekistellt Tripel als SPARQL-Endpoint über HTTP bereit (REST-Style)
OWLOntology APIModelle, RDFS und Web Ontology Language (OWL)
OWLInference APIReasoning ü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

  1. Fuseki herunterladen und installieren; der Server läuft auf http://localhost:3030.
  2. New dataset anlegen: Dataset name TMDB, Dataset type wahlweise "In-memory" (geht bei Neustart verloren) oder "Persistent (TDB2)". Dann create dataset.
  3. Ü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).
  4. 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 der PREFIX stets angegeben. Damit dieses Beispiel lauffähig ist, muss der Default-Namespace zusätzlich (z.B. per initNs/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 / PREFIX erlaubt 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?