---
jupytext:
  formats: md:myst
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
    jupytext_version: 1.14.1
kernelspec:
  display_name: Python 3 (ipykernel)
  language: python
  name: python3
---

# 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](https://de.wikipedia.org/wiki/W%C3%A4rmekraftwerk) 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.

```{figure} ../../images/kohlekraftwerk.png
---
width: 90%
---
```


## Übersetzen nach OWL und SKOS

Download dieser Mindmap: {download}`../mm/kohlekraftwerk.mm`.

```{code-cell} ipython3
import sys
sys.path.append('../py/')
```

```{code-cell} ipython3
from gd06 import GenDifS_Map
import pandas as pd
```

```{code-cell} ipython3
mindmap = "kohlekraftwerk" # filename without .mm extension
o = GenDifS_Map(f"../mm/{mindmap}.mm", verbose = 1)
```

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

```{code-cell} ipython3
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}")
```

## Compile the mindmap into a ttl representation

```{code-cell} ipython3
o.compile()
```

`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()`.

* <https://owl-rl.readthedocs.io/en/latest/> | <https://pypi.org/project/owlrl/>

```{code-cell} ipython3
o.owlrl()
```

### SPARQL

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

```{code-cell} ipython3
Q = o.sparql_namespaces + """
SELECT ?sub ?super
WHERE { ?sub skos:broader ?super }
"""

qres = o.rdflib_graph.query(Q)

for row in qres:
    print(row)
```

### 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:

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

Download: {download}`../ttl/kohlekraftwerk_mm.ttl`

+++

#### ttl generated by rdflib

Export of all triples through rdflib, *without* inferencing:

```{code-cell} ipython3
len(o.rdflib_graph.serialize(destination=f"../ttl/{mindmap}_rdflib.ttl"))
```

Download: {download}`../ttl/kohlekraftwerk_rdflib.ttl`

+++

#### ttl after inferencing, generated by owlrl

Export of all triples through rdflib, *after* inferencing:

```{code-cell} ipython3
Download: len(o.owlrl_graph.serialize(destination=f"../ttl/{mindmap}_owlrl.ttl"))
```

{download}`../ttl/kohlekraftwerk_owlrl.ttl`

+++

### Write back the mindmap

```{code-cell} ipython3
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}")
```
