{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "eb856d0c-ba92-4be9-a0d4-1690abf2ed15",
   "metadata": {},
   "source": [
    "# SKOS Demo 2026-06-08\n",
    "\n",
    "Transfer von https://www.jbusse.de/logd/pplan_minimal/von-3-star-nach-5-star.html#turtle-erzeugen\n",
    "\n",
    "Wir fragen Google.AI:\n",
    "\n",
    "> skos, ttl. Ich will einen SKOS-Thesaurus bauen:\n",
    "> Pferd BT Mammal\n",
    "> Mammel BT Tier\n",
    "\n",
    "Google gibt folgende Bsp zurück:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e4e10cfa-380f-4c4f-be0d-5b6ef30686fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "turtlestring = \"\"\"\n",
    "@prefix ex: <http://example.org> .\n",
    "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
    "@prefix owl: <http://www.w3.org/2002/07/owl#> .\n",
    "@prefix skos: <http://www.w3.org/2004/02/skos/core#> .\n",
    "@prefix ex: <http://example.org> .\n",
    "\n",
    "# Definition des Begriffssystems\n",
    "ex:TierThesaurus a skos:ConceptScheme ;\n",
    "    skos:prefLabel \"Tier-Thesaurus\"@de .\n",
    "\n",
    "# Konzept: Tier\n",
    "ex:Tier a skos:Concept ;\n",
    "    skos:prefLabel \"Tier\"@de ;\n",
    "    skos:topConceptOf ex:TierThesaurus .\n",
    "\n",
    "# Konzept: Mammal (Säugetier)\n",
    "ex:Mammal a skos:Concept ;\n",
    "    skos:prefLabel \"Mammal\"@en ;\n",
    "    skos:altLabel \"Säugetier\"@de ;\n",
    "    skos:broader ex:Tier ;\n",
    "    skos:inScheme ex:TierThesaurus .\n",
    "\n",
    "# Konzept: Pferd\n",
    "ex:Pferd a skos:Concept ;\n",
    "    skos:prefLabel \"Pferd\"@de ;\n",
    "    skos:broader ex:Mammal ;\n",
    "    skos:inScheme ex:TierThesaurus .\n",
    "\"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "0cc982e3-5b83-42bd-9d76-820e436d4100",
   "metadata": {},
   "outputs": [],
   "source": [
    "def focus(focus_string_list, ttl):\n",
    "    return \"\\n\\n\".join( [ paragraph for paragraph in ttl.split(\"\\n\\n\") \\\n",
    "        if any( [ focus_string in paragraph for focus_string in focus_string_list ] ) ] )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70f862fd-a263-4c39-9be9-1f91e9f5adb2",
   "metadata": {},
   "source": [
    "## rdflib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c3f8ef03-ca30-4f56-8f36-b03d428b01e1",
   "metadata": {},
   "outputs": [],
   "source": [
    "import rdflib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3dbe0e55-552f-4d00-820a-7c7fd6b8e397",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "@prefix ex: <http://example.org> .\n",
      "@prefix skos: <http://www.w3.org/2004/02/skos/core#> .\n",
      "\n",
      "ex:Pferd a skos:Concept ;\n",
      "    skos:broader ex:Mammal ;\n",
      "    skos:inScheme ex:TierThesaurus ;\n",
      "    skos:prefLabel \"Pferd\"@de .\n",
      "\n",
      "ex:Mammal a skos:Concept ;\n",
      "    skos:altLabel \"Säugetier\"@de ;\n",
      "    skos:broader ex:Tier ;\n",
      "    skos:inScheme ex:TierThesaurus ;\n",
      "    skos:prefLabel \"Mammal\"@en .\n",
      "\n",
      "ex:Tier a skos:Concept ;\n",
      "    skos:prefLabel \"Tier\"@de ;\n",
      "    skos:topConceptOf ex:TierThesaurus .\n",
      "\n",
      "ex:TierThesaurus a skos:ConceptScheme ;\n",
      "    skos:prefLabel \"Tier-Thesaurus\"@de .\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# turtlestring als RDF Graph parsen\n",
    "g = rdflib.Graph().parse( data=turtlestring )\n",
    "\n",
    "# und die interne Repräsentation wieder serialisieren\n",
    "print( g.serialize(format=\"ttl\") )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b8855e8-875e-4bff-9770-d394144ea445",
   "metadata": {},
   "source": [
    "Wir wollen die SKOS-Ontologie importieren. In RDFlib liest man einfach weiteren Code in den bestehenden Graphen -- hier `g` --  ein."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "75095758-aab1-439a-87fe-6d9696575a2f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Graph identifier=N5f4f35c7647c455496f4cc839a08b9b0 (<class 'rdflib.graph.Graph'>)>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.parse(\"http://www.w3.org/2004/02/skos/core#\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "fb970e2d-6ba0-4dcf-9bbb-50cdfaffdaf1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ex:Pferd a skos:Concept ;\n",
      "    skos:broader ex:Mammal ;\n",
      "    skos:inScheme ex:TierThesaurus ;\n",
      "    skos:prefLabel \"Pferd\"@de .\n",
      "\n",
      "ex:Mammal a skos:Concept ;\n",
      "    skos:altLabel \"Säugetier\"@de ;\n",
      "    skos:broader ex:Tier ;\n",
      "    skos:inScheme ex:TierThesaurus ;\n",
      "    skos:prefLabel \"Mammal\"@en .\n",
      "\n",
      "skos:broadMatch a rdf:Property,\n",
      "        owl:ObjectProperty ;\n",
      "    rdfs:label \"has broader match\"@en ;\n",
      "    rdfs:isDefinedBy <http://www.w3.org/2004/02/skos/core> ;\n",
      "    rdfs:subPropertyOf skos:broader,\n",
      "        skos:mappingRelation ;\n",
      "    owl:inverseOf skos:narrowMatch ;\n",
      "    skos:definition \"skos:broadMatch is used to state a hierarchical mapping link between two conceptual resources in different concept schemes.\"@en .\n",
      "\n",
      "skos:hasTopConcept a rdf:Property,\n",
      "        owl:ObjectProperty ;\n",
      "    rdfs:label \"has top concept\"@en ;\n",
      "    rdfs:domain skos:ConceptScheme ;\n",
      "    rdfs:isDefinedBy <http://www.w3.org/2004/02/skos/core> ;\n",
      "    rdfs:range skos:Concept ;\n",
      "    owl:inverseOf skos:topConceptOf ;\n",
      "    skos:definition \"Relates, by convention, a concept scheme to a concept which is topmost in the broader/narrower concept hierarchies for that scheme, providing an entry point to these hierarchies.\"@en .\n",
      "\n",
      "skos:related a rdf:Property,\n",
      "        owl:ObjectProperty,\n",
      "        owl:SymmetricProperty ;\n",
      "    rdfs:label \"has related\"@en ;\n",
      "    rdfs:comment \"skos:related is disjoint with skos:broaderTransitive\"@en ;\n",
      "    rdfs:isDefinedBy <http://www.w3.org/2004/02/skos/core> ;\n",
      "    rdfs:subPropertyOf skos:semanticRelation ;\n",
      "    skos:definition \"Relates a concept to a concept with which there is an associative semantic relationship.\"@en .\n",
      "\n",
      "skos:broader a rdf:Property,\n",
      "        owl:ObjectProperty ;\n",
      "    rdfs:label \"has broader\"@en ;\n",
      "    rdfs:comment \"Broader concepts are typically rendered as parents in a concept hierarchy (tree).\"@en ;\n",
      "    rdfs:isDefinedBy <http://www.w3.org/2004/02/skos/core> ;\n",
      "    rdfs:subPropertyOf skos:broaderTransitive ;\n",
      "    owl:inverseOf skos:narrower ;\n",
      "    skos:definition \"Relates a concept to a concept that is more general in meaning.\"@en ;\n",
      "    skos:scopeNote \"By convention, skos:broader is only used to assert an immediate (i.e. direct) hierarchical link between two conceptual resources.\"@en .\n",
      "\n",
      "skos:broaderTransitive a rdf:Property,\n",
      "        owl:ObjectProperty,\n",
      "        owl:TransitiveProperty ;\n",
      "    rdfs:label \"has broader transitive\"@en ;\n",
      "    rdfs:isDefinedBy <http://www.w3.org/2004/02/skos/core> ;\n",
      "    rdfs:subPropertyOf skos:semanticRelation ;\n",
      "    owl:inverseOf skos:narrowerTransitive ;\n",
      "    skos:definition \"skos:broaderTransitive is a transitive superproperty of skos:broader.\" ;\n",
      "    skos:scopeNote \"By convention, skos:broaderTransitive is not used to make assertions. Rather, the properties can be used to draw inferences about the transitive closure of the hierarchical relation, which is useful e.g. when implementing a simple query expansion algorithm in a search application.\"@en .\n",
      "\n",
      "skos:narrower a rdf:Property,\n",
      "        owl:ObjectProperty ;\n",
      "    rdfs:label \"has narrower\"@en ;\n",
      "    rdfs:comment \"Narrower concepts are typically rendered as children in a concept hierarchy (tree).\"@en ;\n",
      "    rdfs:isDefinedBy <http://www.w3.org/2004/02/skos/core> ;\n",
      "    rdfs:subPropertyOf skos:narrowerTransitive ;\n",
      "    owl:inverseOf skos:broader ;\n",
      "    skos:definition \"Relates a concept to a concept that is more specific in meaning.\"@en ;\n",
      "    skos:scopeNote \"By convention, skos:broader is only used to assert an immediate (i.e. direct) hierarchical link between two conceptual resources.\"@en .\n",
      "\n",
      "skos:narrowerTransitive a rdf:Property,\n",
      "        owl:ObjectProperty,\n",
      "        owl:TransitiveProperty ;\n",
      "    rdfs:label \"has narrower transitive\"@en ;\n",
      "    rdfs:isDefinedBy <http://www.w3.org/2004/02/skos/core> ;\n",
      "    rdfs:subPropertyOf skos:semanticRelation ;\n",
      "    owl:inverseOf skos:broaderTransitive ;\n",
      "    skos:definition \"skos:narrowerTransitive is a transitive superproperty of skos:narrower.\" ;\n",
      "    skos:scopeNote \"By convention, skos:narrowerTransitive is not used to make assertions. Rather, the properties can be used to draw inferences about the transitive closure of the hierarchical relation, which is useful e.g. when implementing a simple query expansion algorithm in a search application.\"@en .\n"
     ]
    }
   ],
   "source": [
    "# und die intererne Repräsentation wieder ausgeben\n",
    "# alles:\n",
    "# print( g.serialize(format=\"ttl\") )\n",
    "\n",
    "# nur alle \"Absätze\" die ein paar bestimmte Strings enthalten:\n",
    "print( focus( [\"Pferd\", \"broader\" ], g.serialize(format=\"ttl\") ) )"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5abe1acd-4cec-45af-a4b7-43eb2a0ee0af",
   "metadata": {},
   "source": [
    "# owlrl\n",
    "\n",
    "Transfer von <https://www.jbusse.de/semweb/demo_2026-03-31.html>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "16f1b7cd-e43c-45b8-aba5-6b9806b9219f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import owlrl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f4252735-7e2a-46dd-9824-3f6ffa8069df",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "df9278e1-efc8-4c77-85b3-3b36a0dac2ff",
   "metadata": {},
   "outputs": [],
   "source": [
    "g2 = rdflib.Graph().parse( data=turtlestring )\n",
    "g2.parse(\"http://www.w3.org/2004/02/skos/core#\")\n",
    "owlrl.DeductiveClosure(owlrl.OWLRL_Semantics,\n",
    "    axiomatic_triples = False).expand(g2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "09bca4f9-05f8-4305-8fff-126852bcc9b8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"Pferd\"@de owl:sameAs \"Pferd\"@de .\n",
      "\n",
      "ex:Pferd a _:Nc400757f0c5a43fca97566493bd6b097,\n",
      "        owl:Thing,\n",
      "        skos:Concept ;\n",
      "    rdfs:label \"Pferd\"@de ;\n",
      "    owl:sameAs ex:Pferd ;\n",
      "    skos:broader ex:Mammal ;\n",
      "    skos:broaderTransitive ex:Mammal,\n",
      "        ex:Tier ;\n",
      "    skos:inScheme ex:TierThesaurus ;\n",
      "    skos:prefLabel \"Pferd\"@de ;\n",
      "    skos:semanticRelation ex:Mammal,\n",
      "        ex:Tier .\n",
      "\n",
      "ex:Mammal a _:Nc400757f0c5a43fca97566493bd6b097,\n",
      "        owl:Thing,\n",
      "        skos:Concept ;\n",
      "    rdfs:label \"Säugetier\"@de,\n",
      "        \"Mammal\"@en ;\n",
      "    owl:sameAs ex:Mammal ;\n",
      "    skos:altLabel \"Säugetier\"@de ;\n",
      "    skos:broader ex:Tier ;\n",
      "    skos:broaderTransitive ex:Tier ;\n",
      "    skos:inScheme ex:TierThesaurus ;\n",
      "    skos:narrower ex:Pferd ;\n",
      "    skos:narrowerTransitive ex:Pferd ;\n",
      "    skos:prefLabel \"Mammal\"@en ;\n",
      "    skos:semanticRelation ex:Pferd,\n",
      "        ex:Tier .\n",
      "\n",
      "ex:Tier a _:Nc400757f0c5a43fca97566493bd6b097,\n",
      "        owl:Thing,\n",
      "        skos:Concept ;\n",
      "    rdfs:label \"Tier\"@de ;\n",
      "    owl:sameAs ex:Tier ;\n",
      "    skos:inScheme ex:TierThesaurus ;\n",
      "    skos:narrower ex:Mammal ;\n",
      "    skos:narrowerTransitive ex:Mammal,\n",
      "        ex:Pferd ;\n",
      "    skos:prefLabel \"Tier\"@de ;\n",
      "    skos:semanticRelation ex:Mammal,\n",
      "        ex:Pferd ;\n",
      "    skos:topConceptOf ex:TierThesaurus .\n"
     ]
    }
   ],
   "source": [
    "#print( g2.serialize(format=\"ttl\") )\n",
    "print( focus( [\"Pferd\" ], g2.serialize(format=\"ttl\") ) )"
   ]
  }
 ],
 "metadata": {
  "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
}
