{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b257b1c9",
   "metadata": {},
   "source": [
    "# GenDifS Formal Semantics: Overview "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee429c31",
   "metadata": {},
   "source": [
    "![](../images/GenDifS_semantics_mm_Screenshot.png)\n",
    "\n",
    "## Files\n",
    "\n",
    "* source mindmap: {download}`../mm/GenDifS_semantics.mm`\n",
    "* generated turtle file: {download}`../ttl/GenDifS_semantics_mm.ttl`"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f3704cac",
   "metadata": {},
   "source": [
    "## Generate Ontology Code"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "85da8a8d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append('../py/')\n",
    "from gd06 import GenDifS_Map"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8ec6eb0f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GenDifS 0.63 (2023-06-06)\n",
      "cwd into input_dir: /home/dsci/a/l/LA_2023_ss/gendifs/mm\n",
      "reading /home/dsci/a/l/LA_2023_ss/gendifs/mm/GenDifS_semantics.mm: 13 nodes\n"
     ]
    }
   ],
   "source": [
    "mindmap = \"GenDifS_semantics\" # filename without .mm extension\n",
    "\n",
    "o = GenDifS_Map(f\"../mm/{mindmap}.mm\", \n",
    "                sheet = None,\n",
    "                \n",
    "                # restrict code generation to OWL, i.e. no SKOS, no example instances etc.\n",
    "                pattern = [ \"owl\", \"docu\" ], \n",
    "                \n",
    "                # use_rdflib = False, # default: true\n",
    "                # remove_attributes= False, # default: true\n",
    "                verbose = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "568a5467",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lexer: found #1 start nodes: TAXONOMY\n",
      "codegen: generated 51 entries in `t_and_a_box_records`\n",
      "Collected 25 code lines, pattern: ['owl', 'docu', 'ALL']\n",
      "rdflib: 28 triples.\n"
     ]
    }
   ],
   "source": [
    "o.compile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "33485c22",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "# __init__\n",
      "# ALL: \n",
      "@prefix ex: <http://example.net/namespace/ex#> .\n",
      "@prefix cpt: <http://example.net/namespace/cpt#> .\n",
      "@prefix sheet: <http://example.net/namespace/sheet#> .\n",
      "@prefix : <http://example.net/namespace/default#> .\n",
      "@prefix owl: <http://www.w3.org/2002/07/owl#> .\n",
      "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
      "@prefix xml: <http://www.w3.org/XML/1998/namespace> .\n",
      "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
      "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
      "@prefix skos: <http://www.w3.org/2004/02/skos/core#> .\n",
      "@prefix gendifs: <http://jbusse.de/gendifs#> .\n",
      "\n",
      "\n",
      "# __init__\n",
      "# ALL: \n",
      "[ rdf:type owl:Ontology ] .\n",
      "\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a.01 ----\n",
      "# docu: \n",
      "# TAXONOMY\n",
      "#   Class-A\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a\n",
      "# owl: declare class *Class-A* being a subclass of topConcept\n",
      ":Class-A\n",
      "   a owl:Class ;\n",
      "   rdfs:subClassOf :topConcept .\n",
      "\n",
      "\n",
      "# BY.0\n",
      "# docu: --------------------\n",
      "# Class-A\n",
      "#   BY property-a-b SOME Class-P\n",
      "\n",
      "\n",
      "# BY.a\n",
      "# owl: declare *property-a-b* as a object property.\n",
      ":property-a-b\n",
      "   rdf:type owl:ObjectProperty .\n",
      "\n",
      "\n",
      "# BY.b\n",
      "# owl: declare *Class-P* as a owl:Class .\n",
      ":Class-P\n",
      "   a owl:Class .\n",
      "\n",
      "\n",
      "# SUBTAXON.BY.a.03 ----\n",
      "# docu: \n",
      "# Class-A\n",
      "#   BY ... SOME ...\n",
      "#      Class-B\n",
      "\n",
      "\n",
      "# SUBTAXON.BY.a\n",
      "# owl: declare class *Class-B* being a subclass of Class-A\n",
      ":Class-B\n",
      "   a owl:Class ;\n",
      "   rdfs:subClassOf :Class-A .\n",
      "\n",
      "\n",
      "# SOME.0 ----\n",
      "# docu: \n",
      "# Class-A\n",
      "#   BY property-a-b SOME Class-P\n",
      "#       Class-B\n",
      "#         SOME Class-Q\n",
      "\n",
      "\n",
      "# SOME.b\n",
      "# owl: declare *Class-Q* as a owl:Class\n",
      ":Class-Q\n",
      "   a owl:Class ;\n",
      "   rdfs:subClassOf :Class-P .\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a.01 ----\n",
      "# docu: \n",
      "# TAXONOMY\n",
      "#   Subclass_CD\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a\n",
      "# owl: declare class *Subclass_CD* being a subclass of topConcept\n",
      ":Subclass_CD\n",
      "   a owl:Class ;\n",
      "   rdfs:subClassOf :topConcept .\n",
      "\n",
      "\n",
      "# SUP.a\n",
      "# owl: *INTERSECTION_1969000247*: intersection of superiors, i.e. *intersect(Superclass_C, Superclass_D)*\n",
      ":INTERSECTION_1969000247\n",
      "   a owl:Class ;\n",
      "   rdfs:label \"intersect(Superclass_C, Superclass_D)\" ;\n",
      "   owl:equivalentClass [ a owl:Class ;\n",
      "      owl:intersectionOf (\n",
      "          :Superclass_C :Superclass_D ) ] .\n",
      "\n",
      "\n",
      "\n",
      "# SUP.b\n",
      "# owl: *INTERSECTION_1969000247* is a subclass of *Subclass_CD*\n",
      ":INTERSECTION_1969000247\n",
      "   rdfs:subClassOf :Subclass_CD .\n",
      "\n",
      "\n",
      "\n",
      "# SUPERTAXON.SUP.a.0 ----\n",
      "# docu: \n",
      "# Subclass_CD\n",
      "#   SUP\n",
      "#      Superclass_C\n",
      "\n",
      "\n",
      "# SUPERTAXON.SUP.a\n",
      "# owl: declare class *Subclass_CD* being a subclass of Superclass_C\n",
      ":Subclass_CD\n",
      "   a owl:Class ;\n",
      "   rdfs:subClassOf :Superclass_C .\n",
      "\n",
      "\n",
      "# SUPERTAXON.SUP.a.0 ----\n",
      "# docu: \n",
      "# Subclass_CD\n",
      "#   SUP\n",
      "#      Superclass_D\n",
      "\n",
      "\n",
      "# SUPERTAXON.SUP.a\n",
      "# owl: declare class *Subclass_CD* being a subclass of Superclass_D\n",
      ":Subclass_CD\n",
      "   a owl:Class ;\n",
      "   rdfs:subClassOf :Superclass_D .\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a.01 ----\n",
      "# docu: \n",
      "# TAXONOMY\n",
      "#   Subject_R\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a\n",
      "# owl: declare class *Subject_R* being a subclass of topConcept\n",
      ":Subject_R\n",
      "   a owl:Class ;\n",
      "   rdfs:subClassOf :topConcept .\n",
      "\n",
      "\n",
      "# OP.0 ----\n",
      "# docu: \n",
      "# Subject_R\n",
      "#   OP object-property-r-s\n",
      "\n",
      "\n",
      "# OP.a\n",
      "# owl: declare *object-property-r-s* as a object property.\n",
      ":object-property-r-s\n",
      "   rdf:type owl:ObjectProperty ;\n",
      "   rdf:label \"object-property-r-s\" .\n",
      "\n",
      "\n",
      "# SUBTAXON.OP.a.0 ----\n",
      "# docu: \n",
      "# Subject_R\n",
      "#   OP object-property-r-s\n",
      "#      Object_S\n",
      "\n",
      "\n",
      "# SUBTAXON.OP.a\n",
      "# owl: declare class *Object_S* \n",
      ":Object_S\n",
      "   a owl:Class .\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(o.ttl_code)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "34180909",
   "metadata": {},
   "outputs": [],
   "source": [
    "# write ttl\n",
    "o.mindmap.write(f\"../mm/{mindmap}.mm\", pretty_print=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0b998e27",
   "metadata": {},
   "outputs": [],
   "source": [
    "# write back prettyfied mindmap\n",
    "# with open(f\"../ttl/{mindmap}_mm.ttl\", \"w\") as file:\n",
    "#    file.write(o.ttl_code)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b91da97f",
   "metadata": {},
   "source": [
    "## SKOS\n",
    "\n",
    "GenDifS also exports a SKOS terminology. Instances of the class `skos:Concept` are prefixed with `cpt`. (Do *not* prefix them i.e. with `skos`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1df3068f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GenDifS 0.63 (2023-06-06)\n",
      "cwd into input_dir: /home/dsci/a/l/LA_2023_ss/gendifs/mm\n",
      "reading /home/dsci/a/l/LA_2023_ss/gendifs/mm/GenDifS_semantics.mm: 13 nodes\n"
     ]
    }
   ],
   "source": [
    "o_skos = GenDifS_Map(f\"../mm/{mindmap}.mm\", \n",
    "                sheet = None,\n",
    "                pattern = [ \"skos\", \"docu\" ], \n",
    "                \n",
    "                # use_rdflib = False,\n",
    "                # remove_attributes= False, # default: true\n",
    "                verbose = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "67e4b432",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lexer: found #1 start nodes: TAXONOMY\n",
      "codegen: generated 51 entries in `t_and_a_box_records`\n",
      "Collected 22 code lines, pattern: ['skos', 'docu', 'ALL']\n",
      "rdflib: 20 triples.\n"
     ]
    }
   ],
   "source": [
    "o_skos.compile()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "949bdef1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "# __init__\n",
      "# ALL: \n",
      "@prefix ex: <http://example.net/namespace/ex#> .\n",
      "@prefix cpt: <http://example.net/namespace/cpt#> .\n",
      "@prefix sheet: <http://example.net/namespace/sheet#> .\n",
      "@prefix : <http://example.net/namespace/default#> .\n",
      "@prefix owl: <http://www.w3.org/2002/07/owl#> .\n",
      "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n",
      "@prefix xml: <http://www.w3.org/XML/1998/namespace> .\n",
      "@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .\n",
      "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n",
      "@prefix skos: <http://www.w3.org/2004/02/skos/core#> .\n",
      "@prefix gendifs: <http://jbusse.de/gendifs#> .\n",
      "\n",
      "\n",
      "# __init__\n",
      "# ALL: \n",
      "[ rdf:type owl:Ontology ] .\n",
      "\n",
      "\n",
      "\n",
      "# __init__\n",
      "# skos: \n",
      "[ owl:imports <http://www.w3.org/2004/02/skos/core> ] .\n",
      "\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a.01 ----\n",
      "# docu: \n",
      "# TAXONOMY\n",
      "#   Class-A\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.c\n",
      "# skos: \n",
      "cpt:Class-A\n",
      "   a skos:Concept ;\n",
      "   skos:broader cpt:topConcept .\n",
      "\n",
      "\n",
      "# BY.0\n",
      "# docu: --------------------\n",
      "# Class-A\n",
      "#   BY property-a-b SOME Class-P\n",
      "\n",
      "\n",
      "# BY.d\n",
      "# skos: define a skos:Collection\n",
      "cpt:Class-A_BY_property-a-b_SOME_Class-P \n",
      "   skos:prefLabel \"Class-A by property-a-b some Class-P\" ;\n",
      "   a skos:Collection .\n",
      "\n",
      "\n",
      "\n",
      "# SUBTAXON.BY.a.03 ----\n",
      "# docu: \n",
      "# Class-A\n",
      "#   BY ... SOME ...\n",
      "#      Class-B\n",
      "\n",
      "\n",
      "# SUBTAXON.BY.d\n",
      "# skos: \n",
      "cpt:Class-A_BY_property-a-b_SOME_Class-P\n",
      "   skos:member cpt:Class-B .\n",
      "\n",
      "\n",
      "# SUBTAXON.BY.c\n",
      "# skos: \n",
      "cpt:Class-B\n",
      "   a skos:Concept ;\n",
      "   skos:broader cpt:Class-A .\n",
      "\n",
      "\n",
      "# SOME.0 ----\n",
      "# docu: \n",
      "# Class-A\n",
      "#   BY property-a-b SOME Class-P\n",
      "#       Class-B\n",
      "#         SOME Class-Q\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a.01 ----\n",
      "# docu: \n",
      "# TAXONOMY\n",
      "#   Subclass_CD\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.c\n",
      "# skos: \n",
      "cpt:Subclass_CD\n",
      "   a skos:Concept ;\n",
      "   skos:broader cpt:topConcept .\n",
      "\n",
      "\n",
      "# SUPERTAXON.SUP.a.0 ----\n",
      "# docu: \n",
      "# Subclass_CD\n",
      "#   SUP\n",
      "#      Superclass_C\n",
      "\n",
      "\n",
      "# SUPERTAXON.SUP.c\n",
      "# skos: \n",
      "cpt:Superclass_C\n",
      "   a skos:Concept .\n",
      "cpt:Subclass_CD\n",
      "   a skos:Concept ;\n",
      "   skos:broader cpt:Superclass_C .\n",
      "\n",
      "\n",
      "# SUPERTAXON.SUP.a.0 ----\n",
      "# docu: \n",
      "# Subclass_CD\n",
      "#   SUP\n",
      "#      Superclass_D\n",
      "\n",
      "\n",
      "# SUPERTAXON.SUP.c\n",
      "# skos: \n",
      "cpt:Superclass_D\n",
      "   a skos:Concept .\n",
      "cpt:Subclass_CD\n",
      "   a skos:Concept ;\n",
      "   skos:broader cpt:Superclass_D .\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.a.01 ----\n",
      "# docu: \n",
      "# TAXONOMY\n",
      "#   Subject_R\n",
      "\n",
      "\n",
      "# SUBTAXON.TAXONOMY.c\n",
      "# skos: \n",
      "cpt:Subject_R\n",
      "   a skos:Concept ;\n",
      "   skos:broader cpt:topConcept .\n",
      "\n",
      "\n",
      "# OP.0 ----\n",
      "# docu: \n",
      "# Subject_R\n",
      "#   OP object-property-r-s\n",
      "\n",
      "\n",
      "# SUBTAXON.OP.a.0 ----\n",
      "# docu: \n",
      "# Subject_R\n",
      "#   OP object-property-r-s\n",
      "#      Object_S\n",
      "\n",
      "\n",
      "# SUBTAXON.OP.c\n",
      "# skos: \n",
      "cpt:Subject_R\n",
      "   a skos:Concept . \n",
      "cpt:Object_S\n",
      "   a skos:Concept .\n",
      "cpt:object-property-r-s\n",
      "   rdfs:subPropertyOf skos:related .\n",
      "cpt:Subject_R\n",
      "   cpt:object-property-r-s cpt:Object_S .\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(o_skos.ttl_code)"
   ]
  }
 ],
 "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.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
