{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9ec1a289-a9f1-438a-9b3f-f978391b3af4",
   "metadata": {},
   "source": [
    "# Von 3-Star nach 5-Star\n",
    "\n",
    "5-Star:\n",
    "* https://www.w3.org/DesignIssues/LinkedData.html\n",
    "\n",
    "Dieses Notebook: Wir haben CSV-Dateien (3 star), wollen nach 5 star gehen."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b5f22d1",
   "metadata": {},
   "source": [
    "## Testdaten erzeugen\n",
    "\n",
    "\n",
    "Anfrage an Google.AI\n",
    "\n",
    "```\n",
    "Ich benötige einige CSV-Dateien. Domäne: Prüfungsplanung Hochschule, Fakultät Informatik.\n",
    "\n",
    "Studiengänge: Wirtschaftsinformatik WIF, Digitales Verwaltungsmanagement DVM, Automobilinformatik AIF, Kerninformagtik IF, Künstliche Intelligenz KI.\n",
    "\n",
    "Dozenten: BUJ, NAZ, OSC, WUJ\n",
    "\n",
    "Insgesamt 10 Fächer.\n",
    "\n",
    "In jedem Studiengang gibt es ein eigenes Modul mit dem gleichen Titel \"Prog 1\"; sonst überschneiden sich die Fächer nicht.\n",
    "\n",
    "BUJ und WUJ unterrichten beide in den Studiengängen WIF und DVM.\n",
    "Studierende aus WIF und DVM melden sich nur für Prüfungen aus WIF oder DVM an (gemischt).\n",
    "\n",
    "NAZ unterrichtet in den Studiengängen IF und AIF.\n",
    "Studierende aus AIF und IF melden sich nur für Prüfungen aus diesen Studiengängen an. \n",
    "\n",
    "OSC unterrichtet in KI.\n",
    "KI-Studierende melden sich nur fü KI-Module an.\n",
    "\n",
    "\n",
    "Tabelle \"Dozent\"\n",
    "Dozent-ID;Name\n",
    "\n",
    "Tabelle \"Modul\"\n",
    "Modul_ID;Modultitel;Studiengang;Prüfungssemester\n",
    "\n",
    "Tabelle \"unterrichtet\"\n",
    "Dozent-ID;Modul_ID\n",
    "\n",
    "Tabelle \"Student\"\n",
    "MatNr;Studiengang_ID;Fachsemester\n",
    "\n",
    "Tabelle \"Pruefungsanmeldung\"\n",
    "MatNr;Pruefungs_ID\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa490ec5",
   "metadata": {},
   "source": [
    "## Kontext herstellen\n",
    "\n",
    "\n",
    "Wir werden mehrere CSV-Dateien benötigen. Wir halten den Code in einem Dict fest, die Schlüssel sind dann die Dateinamen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2fc61c97-e0e7-4467-87b9-3261dbae225e",
   "metadata": {},
   "outputs": [],
   "source": [
    "csv = {}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c29760de",
   "metadata": {},
   "source": [
    "## Antwort Google.AI, 2026-05-04 T 12:26\n",
    "\n",
    "\n",
    "Hier sind die gewünschten CSV-Daten, strukturiert nach deinen Vorgaben. Ich habe die 10 Fächer so verteilt, dass die Logik der Dozenten und Studiengänge gewahrt bleibt.\n",
    "\n",
    "\n",
    "### 1. Dozent.csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b8c2a890",
   "metadata": {},
   "outputs": [],
   "source": [
    "csv[\"Dozent\"] = \"\"\"Dozent-ID;Name\n",
    "BUJ;Prof. BUJ\n",
    "NAZ;Prof. NAZ\n",
    "OSC;Prof. OSC\n",
    "WUJ;Prof. WUJ\n",
    "\"\"\" "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5eb133e5-afaf-480c-8ada-b7329c4fc4bc",
   "metadata": {},
   "outputs": [],
   "source": [
    "#with open(\"Dozent.csv\",\"w\") as f:\n",
    "#    f.write(csv[\"Dozent\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82c83f3d-2d81-4c70-886f-23b3a9906822",
   "metadata": {},
   "source": [
    "with open(\"abc.html\", \"w\") as f:\n",
    "    f.write( \"\"\"\n",
    "    <html>\n",
    "       <head/>\n",
    "       <body>Hallo Welt!</body>\n",
    "    </html>\"\"\" )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "671a93a6",
   "metadata": {},
   "source": [
    "### 2. Modul.csv\n",
    "\n",
    "Hinweis: \"Prog 1\" existiert für jeden Studiengang als eigenes Modul."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "8579c116",
   "metadata": {},
   "outputs": [],
   "source": [
    "csv[\"Modul\"] = \"\"\"Modul_ID;Modultitel;Studiengang;Prüfungssemester\n",
    "MOD01;Prog 1;WIF;1\n",
    "MOD02;Prog 1;DVM;1\n",
    "MOD03;Prog 1;AIF;1\n",
    "MOD04;Prog 1;IF;1\n",
    "MOD05;Prog 1;KI;1\n",
    "MOD06;Datenbanken;WIF;2\n",
    "MOD07;E-Government;DVM;2\n",
    "MOD08;Bussysteme;AIF;2\n",
    "MOD09;Theoretische Informatik;IF;2\n",
    "MOD10;Machine Learning;KI;2\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "276c405d",
   "metadata": {},
   "source": [
    "### 3. unterrichtet.csv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "fc37d87b",
   "metadata": {},
   "outputs": [],
   "source": [
    "csv[\"unterrichtet\"] = \"\"\"Dozent-ID;Modul_ID\n",
    "BUJ;MOD01\n",
    "BUJ;MOD06\n",
    "WUJ;MOD02\n",
    "WUJ;MOD07\n",
    "NAZ;MOD03\n",
    "NAZ;MOD04\n",
    "NAZ;MOD08\n",
    "NAZ;MOD09\n",
    "OSC;MOD05\n",
    "OSC;MOD10\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6cedf77e",
   "metadata": {},
   "source": [
    "### 4. Student.csv\n",
    "\n",
    "Beispielhafte Matrikelnummern für die Gruppen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "422a87a0",
   "metadata": {},
   "outputs": [],
   "source": [
    "csv[\"Student\"] = \"\"\"MatNr;Studiengang_ID;Fachsemester\n",
    "1001;WIF;1\n",
    "1002;DVM;1\n",
    "1003;AIF;1\n",
    "1004;IF;1\n",
    "1005;KI;1\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db6be0f0",
   "metadata": {},
   "source": [
    "### 5. Pruefungsanmeldung.csv\n",
    "\n",
    "Berücksichtigt die gemischten Anmeldungen für WIF/DVM und AIF/IF sowie die Exklusivität von KI."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "f98f2851",
   "metadata": {},
   "outputs": [],
   "source": [
    "csv[\"Pruefungsanmeldung\"] = \"\"\"MatNr;Pruefungs_ID\n",
    "1001;MOD01\n",
    "1001;MOD02\n",
    "1002;MOD02\n",
    "1002;MOD06\n",
    "1003;MOD03\n",
    "1003;MOD09\n",
    "1004;MOD04\n",
    "1004;MOD08\n",
    "1005;MOD05\n",
    "1005;MOD10\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "19c3160f-1977-44f5-b541-b6d3c94bc2b9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Dozent': 'Dozent-ID;Name\\nBUJ;Prof. BUJ\\nNAZ;Prof. NAZ\\nOSC;Prof. OSC\\nWUJ;Prof. WUJ\\n',\n",
       " 'Modul': 'Modul_ID;Modultitel;Studiengang;Prüfungssemester\\nMOD01;Prog 1;WIF;1\\nMOD02;Prog 1;DVM;1\\nMOD03;Prog 1;AIF;1\\nMOD04;Prog 1;IF;1\\nMOD05;Prog 1;KI;1\\nMOD06;Datenbanken;WIF;2\\nMOD07;E-Government;DVM;2\\nMOD08;Bussysteme;AIF;2\\nMOD09;Theoretische Informatik;IF;2\\nMOD10;Machine Learning;KI;2\\n',\n",
       " 'unterrichtet': 'Dozent-ID;Modul_ID\\nBUJ;MOD01\\nBUJ;MOD06\\nWUJ;MOD02\\nWUJ;MOD07\\nNAZ;MOD03\\nNAZ;MOD04\\nNAZ;MOD08\\nNAZ;MOD09\\nOSC;MOD05\\nOSC;MOD10\\n',\n",
       " 'Student': 'MatNr;Studiengang_ID;Fachsemester\\n1001;WIF;1\\n1002;DVM;1\\n1003;AIF;1\\n1004;IF;1\\n1005;KI;1\\n',\n",
       " 'Pruefungsanmeldung': 'MatNr;Pruefungs_ID\\n1001;MOD01\\n1001;MOD02\\n1002;MOD02\\n1002;MOD06\\n1003;MOD03\\n1003;MOD09\\n1004;MOD04\\n1004;MOD08\\n1005;MOD05\\n1005;MOD10\\n'}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "csv"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af5ded55-8fb6-44c3-917a-393578cd5289",
   "metadata": {},
   "source": [
    "## CSV schreiben"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "16ff0146-0547-4dfe-a15b-aff19d3f2cf7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dozent\n",
      "Modul\n",
      "unterrichtet\n",
      "Student\n",
      "Pruefungsanmeldung\n"
     ]
    }
   ],
   "source": [
    "for datname in csv.keys():\n",
    "    print(datname)\n",
    "\n",
    "    with open( datname+\".csv\", \"w\") as f:\n",
    "        f.write( csv[ datname ] )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1e8ce268-7f29-49c1-9d99-b02b25df6757",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "039fa2ae-40a8-4259-8473-a569c0edb190",
   "metadata": {},
   "source": [
    "## CSV lesen\n",
    "\n",
    "Aus Python 101: siehe <https://www.jbusse.de/python-101/woche_07.html#csv-datei-mit-pandas-einlesen>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b7d772cb-7da2-4de4-a9e5-e165e6a7d584",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "module_df =  pd.read_csv( \"Modul.csv\", delimiter=\";\"  )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "33bd52ac-6a15-45d1-8cb9-9552270a4ef1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Modul_ID</th>\n",
       "      <th>Modultitel</th>\n",
       "      <th>Studiengang</th>\n",
       "      <th>Prüfungssemester</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>MOD01</td>\n",
       "      <td>Prog 1</td>\n",
       "      <td>WIF</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>MOD02</td>\n",
       "      <td>Prog 1</td>\n",
       "      <td>DVM</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>MOD03</td>\n",
       "      <td>Prog 1</td>\n",
       "      <td>AIF</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>MOD04</td>\n",
       "      <td>Prog 1</td>\n",
       "      <td>IF</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>MOD05</td>\n",
       "      <td>Prog 1</td>\n",
       "      <td>KI</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>MOD06</td>\n",
       "      <td>Datenbanken</td>\n",
       "      <td>WIF</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>MOD07</td>\n",
       "      <td>E-Government</td>\n",
       "      <td>DVM</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>MOD08</td>\n",
       "      <td>Bussysteme</td>\n",
       "      <td>AIF</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>MOD09</td>\n",
       "      <td>Theoretische Informatik</td>\n",
       "      <td>IF</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>MOD10</td>\n",
       "      <td>Machine Learning</td>\n",
       "      <td>KI</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  Modul_ID               Modultitel Studiengang  Prüfungssemester\n",
       "0    MOD01                   Prog 1         WIF                 1\n",
       "1    MOD02                   Prog 1         DVM                 1\n",
       "2    MOD03                   Prog 1         AIF                 1\n",
       "3    MOD04                   Prog 1          IF                 1\n",
       "4    MOD05                   Prog 1          KI                 1\n",
       "5    MOD06              Datenbanken         WIF                 2\n",
       "6    MOD07             E-Government         DVM                 2\n",
       "7    MOD08               Bussysteme         AIF                 2\n",
       "8    MOD09  Theoretische Informatik          IF                 2\n",
       "9    MOD10         Machine Learning          KI                 2"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "module_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "711c3d6a-5a23-4a9c-8f8a-ed283129bc5b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: {'Modul_ID': 'MOD01',\n",
       "  'Modultitel': 'Prog 1',\n",
       "  'Studiengang': 'WIF',\n",
       "  'Prüfungssemester': 1},\n",
       " 1: {'Modul_ID': 'MOD02',\n",
       "  'Modultitel': 'Prog 1',\n",
       "  'Studiengang': 'DVM',\n",
       "  'Prüfungssemester': 1},\n",
       " 2: {'Modul_ID': 'MOD03',\n",
       "  'Modultitel': 'Prog 1',\n",
       "  'Studiengang': 'AIF',\n",
       "  'Prüfungssemester': 1},\n",
       " 3: {'Modul_ID': 'MOD04',\n",
       "  'Modultitel': 'Prog 1',\n",
       "  'Studiengang': 'IF',\n",
       "  'Prüfungssemester': 1},\n",
       " 4: {'Modul_ID': 'MOD05',\n",
       "  'Modultitel': 'Prog 1',\n",
       "  'Studiengang': 'KI',\n",
       "  'Prüfungssemester': 1},\n",
       " 5: {'Modul_ID': 'MOD06',\n",
       "  'Modultitel': 'Datenbanken',\n",
       "  'Studiengang': 'WIF',\n",
       "  'Prüfungssemester': 2},\n",
       " 6: {'Modul_ID': 'MOD07',\n",
       "  'Modultitel': 'E-Government',\n",
       "  'Studiengang': 'DVM',\n",
       "  'Prüfungssemester': 2},\n",
       " 7: {'Modul_ID': 'MOD08',\n",
       "  'Modultitel': 'Bussysteme',\n",
       "  'Studiengang': 'AIF',\n",
       "  'Prüfungssemester': 2},\n",
       " 8: {'Modul_ID': 'MOD09',\n",
       "  'Modultitel': 'Theoretische Informatik',\n",
       "  'Studiengang': 'IF',\n",
       "  'Prüfungssemester': 2},\n",
       " 9: {'Modul_ID': 'MOD10',\n",
       "  'Modultitel': 'Machine Learning',\n",
       "  'Studiengang': 'KI',\n",
       "  'Prüfungssemester': 2}}"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_dict.html\n",
    "module_df.to_dict(orient=\"index\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "48d5bee7-78bb-44af-84cf-790ea5e706a5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# andere Darstellung z.B.\n",
    "# module_df.to_dict(orient=\"list\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0fec6c0f-a4a5-4c24-9a7d-10db1f9a9a8f",
   "metadata": {},
   "source": [
    "## Turtle erzeugen"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "e68d844c-b531-48cb-a4d9-5fa8ba77ace6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# so sieht ein einzelner Record aus \"Module\" aus:\n",
    "zeile = {'Modul_ID': 'MOD01',\n",
    "  'Modultitel': 'Prog 1',\n",
    "  'Studiengang': 'WIF',\n",
    "  'Prüfungssemester': 1}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "07f16efb-096e-4306-a999-db10e1f17581",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Welchen Typ haben die einzelnen Zeilen?\n",
    "Entity = [ \"Studiengang\" ]\n",
    "Number = [ \"Prüfungssemester\" ]\n",
    "\n",
    "ergebnis = []\n",
    "\n",
    "# wegen Übersichtlichkeit nur die ersten 3 Zeilen\n",
    "for zeilennummer, zeile in module_df[0:3].to_dict(orient=\"index\").items():\n",
    "\n",
    "    #print(f\"\\n# {zeilennummer=}, {zeile=}\")\n",
    "\n",
    "    # darüber wollen wir eine Aussage machen\n",
    "    subjekt = zeile[\"Modul_ID\"]\n",
    "    #print(f\"# Zeile {zeilennummer}: {subjekt=}\")\n",
    "    \n",
    "    for k, v in zeile.items():\n",
    "        #print(k, \":\" , v)\n",
    "\n",
    "        # haben wir eine ressource?\n",
    "        if k in Entity:\n",
    "            ttl = f\"ex:{subjekt} ex:hat_{k} ex:{v} .\"\n",
    "\n",
    "        # oder haben wir ein Liteal vom Typ Number?\n",
    "        elif k in Number:\n",
    "            ttl = f\"ex:{subjekt} ex:hat_{k} {v} .\"\n",
    "\n",
    "        # Wenn wir nicht wissen, was wir haben,\n",
    "        # bauen ein Literal vom Typ String\n",
    "        else:\n",
    "            ttl = f\"\"\"ex:{subjekt} ex:hat_{k} \"{v}\" .\"\"\"\n",
    "        #print(ttl)\n",
    "        ergebnis.append( ttl )        \n",
    "    \n",
    "    #print()\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "971632a8-36ac-4c2a-9c5c-212dd1ffbf5f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "@prefix ex: <https://www.example.com#> . \n",
      "ex:MOD01 ex:hat_Modul_ID \"MOD01\" .\n",
      "ex:MOD01 ex:hat_Modultitel \"Prog 1\" .\n",
      "ex:MOD01 ex:hat_Studiengang ex:WIF .\n",
      "ex:MOD01 ex:hat_Prüfungssemester 1 .\n",
      "ex:MOD02 ex:hat_Modul_ID \"MOD02\" .\n",
      "ex:MOD02 ex:hat_Modultitel \"Prog 1\" .\n",
      "ex:MOD02 ex:hat_Studiengang ex:DVM .\n",
      "ex:MOD02 ex:hat_Prüfungssemester 1 .\n",
      "ex:MOD03 ex:hat_Modul_ID \"MOD03\" .\n",
      "ex:MOD03 ex:hat_Modultitel \"Prog 1\" .\n",
      "ex:MOD03 ex:hat_Studiengang ex:AIF .\n",
      "ex:MOD03 ex:hat_Prüfungssemester 1 .\n"
     ]
    }
   ],
   "source": [
    "# das haben wir gebaut\n",
    "turtlestring = \"\\n\".join(ergebnis)\n",
    "\n",
    "# Präfix definieren\n",
    "turtlestring = \"\\n@prefix ex: <https://www.example.com#> . \\n\" + turtlestring \n",
    "print(turtlestring)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "81e0cf9e-2210-4b1b-9c54-c5c4ff39bcd0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ! pip install rdflib "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a09c5b8d-ea6f-4bde-a179-a3f6f021a685",
   "metadata": {},
   "outputs": [],
   "source": [
    "import rdflib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "c2a94826-6a7b-4dc4-b217-5f0dd7267267",
   "metadata": {},
   "outputs": [],
   "source": [
    "# turtlestring als RDF Graph parsen\n",
    "g = rdflib.Graph().parse( data=turtlestring )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "097f8764-b48f-4b8b-9112-dfcc244e8530",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "@prefix ex: <https://www.example.com#> .\n",
      "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
      "\n",
      "ex:MOD01 ex:hat_Modul_ID \"MOD01\" ;\n",
      "    ex:hat_Modultitel \"Prog 1\" ;\n",
      "    ex:hat_Prüfungssemester 1 ;\n",
      "    ex:hat_Studiengang ex:WIF .\n",
      "\n",
      "ex:MOD02 ex:hat_Modul_ID \"MOD02\" ;\n",
      "    ex:hat_Modultitel \"Prog 1\" ;\n",
      "    ex:hat_Prüfungssemester 1 ;\n",
      "    ex:hat_Studiengang ex:DVM .\n",
      "\n",
      "ex:MOD03 ex:hat_Modul_ID \"MOD03\" ;\n",
      "    ex:hat_Modultitel \"Prog 1\" ;\n",
      "    ex:hat_Prüfungssemester 1 ;\n",
      "    ex:hat_Studiengang ex:AIF .\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# und die intererne Repräsentation wieder ausgeben\n",
    "print( g.serialize(format=\"ttl\") )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4d0ab4f1-179f-495a-88bf-e49328ec6ecf",
   "metadata": {},
   "source": [
    "https://rdflib.readthedocs.io/en/7.1.1/intro_to_sparql.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "7dacfe5f-0084-42a8-882c-a7d8cd2a5c2f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Eine CONSTRUCT-Abfrage definiert das Muster des Ergebnis-Graphen\n",
    "query = \"\"\"\n",
    "CONSTRUCT {\n",
    "    ?s ?p ?o .\n",
    "}\n",
    "WHERE {\n",
    "    ?s ?p ?o .\n",
    "    FILTER(isLITERAL(?o)) # auch: isIRI(?o)\n",
    "}\n",
    "\"\"\"\n",
    "\n",
    "# Das Ergebnis von g.query() ist bei CONSTRUCT direkt ein rdflib.Graph\n",
    "neuer_graph = g.query(query).graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "efa7f576-5005-4327-8f0e-0c356c4b7952",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "@prefix ns1: <https://www.example.com#> .\n",
      "\n",
      "ns1:MOD01 ns1:hat_Studiengang ns1:WIF .\n",
      "\n",
      "ns1:MOD02 ns1:hat_Studiengang ns1:DVM .\n",
      "\n",
      "ns1:MOD03 ns1:hat_Studiengang ns1:AIF .\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print( neuer_graph.serialize(format=\"ttl\") )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7241429d-a3c6-492e-836d-3b79d19d32d1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "61cd08bb-8371-4010-905a-33e61757e5fc",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "jupytext": {
   "default_lexer": "ipython3",
   "formats": "ipynb,md:myst"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
