Kohlekraftwerk#

Bei einer Übung zum Thema Text 2 Ontology haben Kollegen folgende Aussage zur Analyse vorgelegt:

Ein Kohlekraftwerk ist ein Dampfkraftwerk, in dem Kohle verbrannt wird, um elektrischen Strom zu erzeugen. Es gibt Kraftwerke für Braunkohle und für Steinkohle. https://de.wikipedia.org/wiki/Kohlekraftwerk

Wir wollen mit GenDifS eine Taxonomie konstruieren.

Analyse der Domäne#

Unsere Methode besteht darin,

  • (a) zuerst allgemein – und eher problemunabhängig – einige (aber nicht alle) mögliche Unterschiede zu identifizieren,

  • (b) um dann festzustellen, welche Unterschiede einen Unterschied machen – und zwar idealerweise in einem bestimten Kontext.

Ein Unterschied ist schon explizit im Text benannt:

  • Es gibt Kraftwerke für Braunkohle und für Steinkohle.

Um einen anderen Unterschied zu sehen, müssen ziehen wir Weltwissen hinzuziehen:

  • Es gibt Kraftwerke, die thermische Energie wie z.B. Kohle, Gas, Sonne umsetzen

  • Es gibt Kraftwerke, die kinetische Energie wie z.B. Wasser, Wind umsetzen

Die Seite Wikipedia -> Wärmekraftwerk klärt uns auf, dass nicht alle Kraftwerke zur Stromerzeugung mit Dampf arbeiten, insbesondere z.B. Dieselgeneratoren eben keinen „thermodynamischen Kreislauf des Arbeitsmittels“ aufweisen.

Ein anderer Unterschied betrifft den Zweck des Kraftwerks:

  • maßgeblich zur Stromerzeugung

  • oder auch zur Erzeugung Kraft (Kraft-Wärme-Kopplung).

Es gibt also viele mögliche Unterschiede. In unserem Satz sind genannt:

  • Kohle als Energieqelle

  • Dampf als Arbeitsmittel

  • Stromerzeugeugung als maßgeblicher Zweck.

_images/kohlekraftwerk.png

Übersetzen nach OWL und SKOS#

Download dieser Mindmap: ../mm/kohlekraftwerk.mm.

import sys
sys.path.append('../py/')
from gd06 import GenDifS_Map
import pandas as pd
mindmap = "kohlekraftwerk" # filename without .mm extension
o = GenDifS_Map(f"../mm/{mindmap}.mm", verbose = 1)
__init__: GenDifS 0.63 (2023-08-01, 2023-09-08)

Do you plan to write back the current mindmap? Then it might be wise to create a backup.

backup_mindmap = True

import time
if backup_mindmap:
    mindmap_backup_filename = f"../mm/{mindmap}_backup_{time.strftime('%Y-%m-%dT%H-%M-%S')}" 
    o.mindmap.write(mindmap_backup_filename, pretty_print=True)
    print(f"wrote  backup to {mindmap_backup_filename}")
wrote  backup to ../mm/kohlekraftwerk_backup_2023-11-06T19-32-31

Compile the mindmap into a ttl representation#

o.compile()
lexer: Lexer: found #1 start nodes: ['TAXONOMY 2023-04-05']
codegen: codegen: generated 4 entries in `ttl_records`
get_code: Collected 113 code lines, pattern: ['ALL' 'owl-test' 'skos' 'docu' 'owl' 'owl-classify']
rdflib_parse: rdflib: 215 triples.

o.compile() generates all necessary class attributes, but does not perform inferencing. To get all instances which can be inferred call the method o.owlrl().

o.owlrl()
owlrl: owlrl: 839 triples.

SPARQL#

Feel free to query the graph with SPARQL. Some useful default namespaces are contained in the attribute o.sparql_namespaces.

Q = o.sparql_namespaces + """
SELECT ?sub ?super
WHERE { ?sub skos:broader ?super }
"""

qres = o.rdflib_graph.query(Q)

for row in qres:
    print(row)
(rdflib.term.URIRef('http://example.net/namespace/cpt#Kraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#topConcept'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle'), rdflib.term.URIRef('http://example.net/namespace/cpt#topConcept'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle-Dampf-Kraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#topConcept'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Dampfkraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kraftwerk'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Stromerzeugung'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kraftwerk'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Wärmeerzeugung'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kraftwerk'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle-Kraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kraftwerk'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Gas-Kraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kraftwerk'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Windkraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kraftwerk'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Braunkohle'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Steinkohle'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle-Dampf-Kraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle-Kraftwerk'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle-Dampf-Kraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#Dampfkraftwerk'))
(rdflib.term.URIRef('http://example.net/namespace/cpt#Kohle-Dampf-Kraftwerk'), rdflib.term.URIRef('http://example.net/namespace/cpt#Stromerzeugung'))

Save the ontologies#

We recommend saving the generated taxonomy in Turtle format in a separate directory, e.g. ../ttl/.

raw ttl, generated by GenDifS#

This is what the ttl code looks like, generated directly by GenDifS:

with open(f"../ttl/{mindmap}_mm.ttl", "w") as file:
    file.write(o.ttl_code)

Download: ../ttl/kohlekraftwerk_mm.ttl

ttl generated by rdflib#

Export of all triples through rdflib, without inferencing:

len(o.rdflib_graph.serialize(destination=f"../ttl/{mindmap}_rdflib.ttl"))
215

Download: ../ttl/kohlekraftwerk_rdflib.ttl

ttl after inferencing, generated by owlrl#

Export of all triples through rdflib, after inferencing:

Download: len(o.owlrl_graph.serialize(destination=f"../ttl/{mindmap}_owlrl.ttl"))

../ttl/kohlekraftwerk_owlrl.ttl

Write back the mindmap#

update_mindmap = True

if update_mindmap:
    update_mindmap_filename = f"../mm/{mindmap}.mm"
    o.mindmap.write(update_mindmap_filename,pretty_print=True)
    print(f"updated mindmap {update_mindmap_filename}")
updated mindmap ../mm/kohlekraftwerk.mm