kgr/lego/paper/KGR_paper1_lego.tex

288 lines
13 KiB
TeX

\documentclass{article}
\usepackage{helvet}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{multicol}[]
\usepackage{blindtext}
\usepackage{tabularx}
\usepackage{float}
\usepackage{booktabs}
\usepackage{makecell}
\usepackage{enumitem}
\usepackage{fancyhdr}
\usepackage{geometry}
\usepackage{abstract}
\usepackage{graphicx}
\usepackage{acronym}
\usepackage{hyperref}
\usepackage{booktabs}
\usepackage{amsmath}
\usepackage[utf8]{inputenc}
\usepackage{biblatex}
\graphicspath{ {./bilder/} }
\geometry{
a4paper,margin=25mm
}
\title{\huge{Knowledge Graph - Lego}}
\date{\today}
\author{
\begin{tabular}{ccc}
\textbf{Roman Schöne} & \textbf{Falko Piwinger}\\
2211275 & 2112107\\
roman.schoene@stud.th-mannheim.de & falko.piwinger@stud.th-mannheim.de
\end{tabular}\\\\
Technische Hochschule Mannheim
}
\addbibresource{literatur/lego.bib}
\renewcommand\familydefault{\sfdefault} % Helvetica
\begin{document}
\pagestyle{fancy}
%... then configure it.
\fancyhead{} % clear all header fields
\fancyhead[L]{Lego}
\fancyhead[R]{KGR - Knowledgegraphen}
\fancyfoot{} % clear all footer fields
\fancyfoot[LE,RO]{\thepage}
\maketitle
\begin{abstract}
\end{abstract}
\begin{multicols}{2}
\tableofcontents
\section{Motivation}
\subsection{Einleitung}
Der bekannteste Hersteller von Klemmbausteinen ist Lego. Mittlerweile hat sich der Name des Klemmbausteins als Gattungsbegriff etabliert. Seit seiner Gründung brachte der Spielwarenhersteller mehr als 20000 Sets auf den Markt. Die Marke Lego prägte für viele die Kindheit. Auch Erwachsene (\ac{AFOL}) begeistern die Klemmbausteine noch heute. Neben Lego werden in dieser Arbeit die weiteren Marken: Bluebrixx, Pantasy, Cada, Mouldking und Cobi behandelt. Um die Klemmbausteine, besonders um Lego, hat sich ein umfangreiches Ökosystem an Webseiten und Werkzeugen entwickelt.
\subsection{Fragestellungen}
\begin{enumerate}
\item \label{item:min_set_count} Was ist die minimale Anzahl an Sets, die benötigt wird um ein anderes Set zusammenzubauen?
\item \label{item:min_set_price} Was ist der geringste Preis einer Auswahl an Sets um ein anderes Set zusammenzubauen?
\item Sind Sets von anderen Herstellern im Vergleich zu Lego Sets, auf den durchschnittlichen Teilepreis betrachtet billiger?
\item Haben neuere Sets im Vergleich zu älteren Sets eine geringere Teileanzahl, da auf eine grössere Anzahl an speziell angefertigten Teilen zugegriffen werden kann?
\item Haben Sets mit höherer Teileanzahl eine höhere Anzahl an Minifiguren?
\item \label{item:set_span} Welche anderen Sets, können mit Sets, die sich schon im eigenen Besitz befinden zusammengebaut werden?
\item \label{item:equivalent_part} Welche Lego-Teile besitzen äquivalente Teile von anderen Marken?
\end{enumerate}
\subsection{Nutzen}
Wird ein Set an Klemmbausteinen nicht mehr vertrieben und man möchte das Set dennoch haben, so ergeben sich mehrere Möglichkeiten:
\begin{itemize}
\item Man kauft das Set von einem Zweitanbieter
\item Man stellt sich die benötigten Teile des Sets selbst zusammen. Dies geschieht entweder indem die Teile einzeln von Zweitanbietern gekauft werden oder durch den Erwerb von anderen Sets, welche die benötigten Teile enthalten. Siehe Fragen: \ref{item:min_set_count} und \ref{item:min_set_price}.
\end{itemize}
Falls eine Teil eines Sets verloren geht, stellt sich die Frage von welcher Marke ein äquivalentes, billigstes Ersatzteil erworben werden kann \ref{item:equivalent_part}.
\section{Datenquellen}
\subsection{Rebrickable}
\textit{Rebrickable} ist eine Website, die es ermöglicht seine eigenen Sets zu registrieren, um herauszufinden welche \ac{MOC}, bzw. von Fans entworfenen Sets, mit der eigenen Auswahl an Teilen erstellt werden kann \ref{item:set_span} \cite{FreeLEGOCatalog}.\\
\textit{Rebrickable} wurde als Datenquelle ausgewählt aufgrund der einfachen Bereitstellung, guter Dokumentation des Datenmodells und der freien Verfügung über die Daten.\\
Der Datensatz von \textit{Rebrickable} gibt primär Auskunft über Sets, Themen und Inventaren von Sets, bestehend aus Minifiguren, Einzelteilen und Ersatzteilen.
\begin{table}[H]
\begin{tabularx}{\columnwidth}{@{}ll@{}}
\toprule
& Rebrickable \\ \midrule
URL & \url{https://rebrickable.com}\\
Beschaffung & Datenbankdownload als .csv \\
Lizenz & Freie Verfügung \\
Erhalt & 23.04.2026 \\ \bottomrule
\end{tabularx}
\end{table}
Der Aufbau des Datensatzes entspricht folgendem Schema:
\begin{figure}[H]
\includegraphics[width=\columnwidth]{bilder/downloads_schema_v3.png}
\caption{Datenbankschema \textit{Rebrickable} \cite{FreeLEGOCatalog}}
\label{fig:rebrickable_scheme}
\end{figure}
Der Datensatz konnte über die URL \url{https://rebrickable.com/downloads/} erhalten werden.
\subsection{Brickset}
\textit{Brickset} ist primär eine Datenbank von Lego-Sets. Dazu dient die Seite als News-Portal, Tracking-Möglichkeit und Review-Seite über Lego-Sets. \textit{Brickset} finanziert sich über Affiliate Marketing \cite{BricksetHomePage2026}. Die Seite wurde ausgewählt, um den von \textit{Rebrickable} erhaltenen Datensatz über Sets anzureichern, um bspw. Verpackungsdimensionen, Modelldimensionen, \ac{UVP} und die \ac{EAN}.
\begin{table}[H]
\begin{tabularx}{\columnwidth}{@{}ll@{}}
\toprule
& Brickset \\ \midrule
URL & \url{https://brickset.com/}\\
Beschaffung & CSV-Download \\
Lizenz & nicht spezifiziert \\
Erhalt & 23.04.2026 \\ \bottomrule
\end{tabularx}
\end{table}
Der Datensatz konnte mithilfe einer Export Funktion von Brickset erhalten werden.
\begin{itemize}
\item Die Daten über Lego-Teile konnten direkt über die URL \url{https://brickset.com/exportscripts/parts/list} abgerufen werden.
\item LEGO-Minifiguren über: \url{http://brickset.com/exportscripts/minifigs/list}
\item LEGO-Sets über: \url{http://brickset.com/exportscripts/sets/list}, jedoch muss in der selbigen Session die URL \url{https://brickset.com/sets/theme-{theme}} besucht werden
\end{itemize}
\subsection{Bricklink}
\textit{Bricklink} ist eine Website, die als Marktplatz zum Kauf und Verkauf von einzelnen Lego-Teilen fungiert. \textit{Bricklink} ist ebenso Anbieter der Software \textit{Bricklink Studio}, einer Anwendung zum Entwurf, Rendern und Erstellen von Anleitungen für Lego-Sets. Die Teileliste, eines in \textit{Bricklink Studio} kann zu \textit{Bricklink} übertragen werden, um Lego Sets in die Realität zu bringen \cite{BrickLinkBuySell}.\\ Der Datensatz enthält grundlegende Daten über Minifiguren, Einzelteile und Sets von Lego.
\begin{table}[H]
\begin{tabularx}{\columnwidth}{@{}ll@{}}
\toprule
& Bricklink \\ \midrule
URL & \url{https://www.bricklink.com/}\\
Beschaffung & Webscraping \\
Lizenz & nicht spezifiziert \\
Erhalt & 24.04.2026 \\ \bottomrule
\end{tabularx}
\end{table}
Der \textit{Bricklink}-Datensatz konnte über HTML-Scraping der Seite \url{https://www.bricklink.com/catalogSearch.asp?v=C} erhalten werden.
\subsection{Merlins Steine}
\textit{Merlins Steine} ist eine Website, die sich auf die Berichterstattung von Reviews zu Klemmbausteinen spezifiziert. Um auf entsprechende Sets zu referenzieren beinhaltet \textit{Merlins Steine} eine Datenbank an Klemmbausteinen, die über 30000 Sets unterschiedlicher Marken enthält. Merlins Steine finanziert sich über Affiliate Marketing. \cite{SetDatenbankSetDB}.\\
\textit{Merlins Steine} wurde ausgewählt, da Sets von anderen Marken im Vergleich zu vorherig genannten Quellen aufgelistet werden. Der Datensatz enthält Informationen zum \ac{UVP}, Teileanzahl, Release-Jahr, Thema Modelldimensionen und des Herstellers.
\begin{table}[H]
\begin{tabularx}{\columnwidth}{@{}ll@{}}
\toprule
& Merlins Steine \\ \midrule
URL & \url{https://www.merlinssteine.de/}\\
Beschaffung & Webscraping/JSON-Download \\
Lizenz & nicht spezifiziert \\
Erhalt & 24.04.2026-26.04.2026 \\ \bottomrule
\end{tabularx}
\end{table}
Die Indizierung der Sets nach ID konnte über die URL \url{https://www.merlinssteine.de/setdb/hersteller/{hersteller}/} erhalten werden. Für jedes einzelne Set wurde die Haupt-Seite des Sets \url{https://www.merlinssteine.de/sets/{set_id}/} aufgerufen um zusätzliche Daten zu erhalten. Da die Felder der Hauptseiten für Sets nicht einheitlich befüllt waren, mussten die Daten transformiert werden.
\section{Implementierung}
\subsection{Integrationsprozess}
Jedes von Lego veröffentlichte Teil besitzt der Form zugrunde eine eindeutige Teile-Nummer, auch Design-ID genannt. Die Teilenummer wird nur aufgrund der Form eines Legosteins vergeben und kann auf dem Lego-Stein abgelesen werden. Üblicherweise besitzt eine Design-ID 4-5 Stellen. Abhängig von der Form, Farbe und des Drucks besitzt jeder Lego-Stein eine 6-7 stellige Element-ID. Die Element-IDs von Teilen eines Lego-Sets befindet sich als Auflistung aller Teile in der Bauanleitung eines Lego-Sets.\\
Sets besitzen ebenfalls eine Set-Nummer. Allerdings gibt es spezielle Lego-Sets, welche in Teil-Sets aufgegliedert werden oder mehrere Bauvarianten besitzen \cite{FreeLEGOCatalog}. Diese Art von Sets wird mithilfe von Inventaren modelliert (Siehe \ref{fig:rebrickable_scheme}). Ein Inventar kann als übergeordnetes Set verstanden werden. Ein Inventar kann somit Set-, Minifiguren- und Teile-Inventare besitzen, die angeben in welcher Stückzahl ein Teil-Set, eine Minifigur oder ein Teil vorhanden ist\\
Lego-Minifiguren erhalten durch Lego keine eindeutige Identifikationsnummer. Zur eindeutigen Identifikation von Minifiguren wird die von \textit{Rebrickable} vergebene ID verwendet.\\
Da die einzige Quelle für andere Hersteller nur \textit{Merlins Steine} ist und diese nur Sets enthält, wird der Hersteller in der IRI miteinbezogen.
\begin{verbatim}
https://thm.de/set/{brand}/{id}
\end{verbatim}
Um die Dateigrösse des Graph zu reduzieren wurde \texttt{thm}, statt \texttt{th-mannheim} verwendet.
\begin{figure}[H]
\centering
\includegraphics[width=0.8\columnwidth]{bilder/example_part_number.png}
\caption{Lego Stein mit Teile-Nummer (Design-ID) 41769 \cite{cunninghamSellLEGOBricklink2018}}
\label{fig:lego_example_part_number}
\end{figure}
%Verwandte Objekte erkennen (Schema Alignment)
%Gleiche Entitäten erkennen (Entity Resolution)
%Integrationssstrategien (linking strategy)
\subsection{Pipeline}
Die Datensätze von \textit{Bricklink} und \textit{Merlins Steine} wurden durch Webscraping erhoben. Entstandene Fehler durch Ausnahmefälle mussten manuell bereinigt werden. Demnach ist dieser Teil nicht automatisierbar. Abbildung \ref{fig:pipeline} zeigt die Pipeline zur Erstellung des Knowledge Graph.
\begin{figure}[H]
\includegraphics[width=\columnwidth]{./bilder/kgr_pipeline1.drawio.png}
\caption{Pipeline Erstellung Knowledge Graph}
\label{fig:pipeline}
\end{figure}
\section{Evaluation}
\subsection{Ergebnis}
Das Projekt kann unter der URL: \url{https://gitty.informatik.hs-mannheim.de/2211275/kgr} betrachtet werden.
Der resultierende Knowledge-Graph ist über 300 MB gross.
\subsection{Beispiel-Queries}
Erhalten der Gesamtheit aller Lego Star Wars Minifiguren:
\begin{verbatim}
SELECT DISTINCT ?name
WHERE {
?set thmont:theme ?theme.
?theme rdf:type thmont:Theme.
?set rdf:type thmont:Set.
?theme rdfs:label "Star Wars"@en.
?inventory thmont:set ?set.
?inventory rdf:type thmont:Inventory.
?inventory thmont:contains ?minifig_inv.
?minifig_inv rdf:type thmont:MinifigInv.
?minifig thmont:belongs ?minifig_inv.
?minifig rdfs:label ?name.
}
\end{verbatim}
Welche Minifiguren kommen am häufigsten vor?
\begin{verbatim}
SELECT
(SUM(?quantity) as ?sum) ?minifig ?name
WHERE {
?minifig rdf:type thm:Minifig.
?minifig_inv rdf:type thm:MinifigInv.
?minifig thm:belongs ?minifig_inv.
?minifig_inv thm:quantity ?quantity.
?minifig rdfs:label ?name.
}
GROUP BY ?minifig ?name
ORDER BY DESC(?sum)
\end{verbatim}
Durchschnittliche Anzahl an Teilen je Set gruppiert nach Jahren
\begin{verbatim}
SELECT ?year (AVG(?part_count) as ?avgp)
WHERE {
?set thm:year ?year.
?set thm:num_parts ?part_count.
}
GROUP BY ?year
ORDER BY DESC(?avgp
)
\end{verbatim}
\subsection{Abdeckung}
\subsection{Konsistenz}
\subsection{Qualität}
\section{Ausblick}
\section*{Abkürzungsverzeichnis}
\begin{acronym}[Abkürzungsverzeichnis]
\acro{MOC}{My Own Creation}
\acro{UVP}{Unverbindliche Preisempfehlung}
\acro{EAN}{European Article Number}
\acro{AFOL}{Adult Fan of Lego}
\end{acronym}
\printbibliography
\end{multicols}
\end{document}