Skip to content

Commit

Permalink
XLSX to OFN support draft
Browse files Browse the repository at this point in the history
  • Loading branch information
bindeali committed Nov 6, 2024
1 parent a15a9b5 commit 7937908
Show file tree
Hide file tree
Showing 3 changed files with 306 additions and 21 deletions.
72 changes: 52 additions & 20 deletions outputToRDF.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
from rdflib.namespace import RDF, OWL, RDFS, SKOS, DCTERMS, TIME
from ofnClasses import ClassType, RPPType, Relationship, Term, TermClass, Trope, VocabularyType, Vocabulary
from datetime import datetime
from urllib.parse import urlparse

# TODO: Better IRI generation (PN_LOCAL)
# TODO: Code lists
# TODO: Error handling
# TODO: Input validation

# TODO: check for duplicate values
# TODO: search for terms within file is IRI is not provided
# TODO: Write to file


Expand All @@ -17,6 +19,19 @@ def getRDFoutput(graph: Graph, outputLocation: str):
outputFile.write(graph.serialize(format=format))


def testInputString(string: str) -> bool:
return string is not None and string.strip() != ""


def getURIRefOrLiteral(string: str):
result = URIRef(string)
try:
result.n3()
return result
except Exception:
return Literal(string)


def convertToRDF(vocabulary: Vocabulary, defaultLanguage: str, outputFile: str):
graph = Graph()

Expand Down Expand Up @@ -50,22 +65,30 @@ def convertToRDF(vocabulary: Vocabulary, defaultLanguage: str, outputFile: str):
graph.add((termIRI, SKOS.inScheme, vocabularyIRI))
# prefLabel
for lang, name in term.name.items():
graph.add((termIRI, SKOS.prefLabel, Literal(name, lang)))
if testInputString(name):
graph.add((termIRI, SKOS.prefLabel, Literal(name, lang)))
# description
for lang, name in term.description.items():
graph.add((termIRI, DCTERMS.description, Literal(name, lang)))
if testInputString(name):
graph.add((termIRI, DCTERMS.description, Literal(name, lang)))
# definition
for lang, name in term.definition.items():
graph.add((termIRI, DCTERMS.definition, Literal(name, lang)))
if testInputString(name):
graph.add((termIRI, SKOS.definition, Literal(name, lang)))
# relation
for relation in term.related:
graph.add((termIRI, DCTERMS.relation, URIRef(relation)))
if testInputString(relation):
graph.add((termIRI, DCTERMS.relation,
getURIRefOrLiteral(relation)))
# conformsTo
if term.source is not None:
graph.add((termIRI, DCTERMS.conformsTo, URIRef(term.source)))
if testInputString(term.source):
graph.add((termIRI, DCTERMS.conformsTo,
getURIRefOrLiteral(term.source)))
# exactMatch
for equivalent in term.equivalent:
graph.add((termIRI, SKOS.exactMatch, URIRef(equivalent)))
if testInputString(equivalent):
graph.add((termIRI, SKOS.exactMatch,
getURIRefOrLiteral(equivalent)))
# shared in PPDF
if term.sharedInPPDF is not None:
graph.add((termIRI, URIRef("https://slovník.gov.cz/agendový/104/pojem/je-sdílen-v-propojeném-datovém-fondu"), Literal(
Expand All @@ -74,17 +97,21 @@ def convertToRDF(vocabulary: Vocabulary, defaultLanguage: str, outputFile: str):
# term types (& broader)
if isinstance(term, Term):
for broader in term.subClassOf:
graph.add((termIRI, SKOS.broader, URIRef(broader)))
if testInputString(broader):
graph.add((termIRI, SKOS.broader,
getURIRefOrLiteral(broader)))
if isinstance(term, TermClass):
graph.add((termIRI, RDF.type, OWL.Class))
if term.ais is not None:
if testInputString(term.ais):
graph.add((termIRI, URIRef(
"https://slovník.gov.cz/agendový/104/pojem/údaje-jsou-v-ais"), URIRef(term.ais)))
if term.agenda is not None:
"https://slovník.gov.cz/agendový/104/pojem/údaje-jsou-v-ais"), getURIRefOrLiteral(term.ais)))
if testInputString(term.agenda):
graph.add((termIRI, URIRef(
"https://slovník.gov.cz/agendový/104/pojem/sdružuje-údaje-vedené-nebo-vytvářené-v-rámci-agendy"), URIRef(term.agenda)))
"https://slovník.gov.cz/agendový/104/pojem/sdružuje-údaje-vedené-nebo-vytvářené-v-rámci-agendy"), getURIRefOrLiteral(term.agenda)))
for broader in term.subClassOf:
graph.add((termIRI, RDFS.subClassOf, URIRef(broader)))
if testInputString(broader):
graph.add((termIRI, RDFS.subClassOf,
getURIRefOrLiteral(broader)))
if isinstance(term, TermClass) and term.type is ClassType.OBJECT:
graph.add((termIRI, RDF.type, URIRef(
"https://slovník.gov.cz/veřejný-sektor/pojem/typ-objektu-práva")))
Expand All @@ -93,19 +120,24 @@ def convertToRDF(vocabulary: Vocabulary, defaultLanguage: str, outputFile: str):
"https://slovník.gov.cz/veřejný-sektor/pojem/typ-subjektu-práva")))
if isinstance(term, Trope) or isinstance(term, Relationship):
for broader in term.subClassOf:
graph.add((termIRI, RDFS.subPropertyOf, URIRef(broader)))
if testInputString(broader):
graph.add((termIRI, RDFS.subPropertyOf,
getURIRefOrLiteral(broader)))
if isinstance(term, Trope):
graph.add((termIRI, RDF.type, OWL.DatatypeProperty))
if term.target is not None:
graph.add((termIRI, RDFS.domain, URIRef(term.target)))
graph.add(
(termIRI, RDFS.domain, getURIRefOrLiteral(term.target)))
if term.datatype is not None:
graph.add((termIRI, RDFS.range, URIRef(term.datatype)))
graph.add(
(termIRI, RDFS.range, getURIRefOrLiteral(term.datatype)))
if isinstance(term, Relationship):
graph.add((termIRI, RDF.type, OWL.ObjectProperty))
if term.domain is not None:
graph.add((termIRI, RDFS.domain, URIRef(term.domain)))
graph.add(
(termIRI, RDFS.domain, getURIRefOrLiteral(term.domain)))
if term.range is not None:
graph.add((termIRI, RDFS.range, URIRef(term.range)))
graph.add((termIRI, RDFS.range, getURIRefOrLiteral(term.range)))

# RPP public/private types
if term.rppType is not None:
Expand All @@ -118,4 +150,4 @@ def convertToRDF(vocabulary: Vocabulary, defaultLanguage: str, outputFile: str):
graph.add((termIRI, RDF.type, URIRef(
term.rppPrivateTypeSource)))

getRDFoutput(graph, outputFile)
getRDFoutput(graph, outputFile)
5 changes: 4 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
blinker==1.8.2
click==8.1.7
colorama==0.4.6
et_xmlfile==2.0.0
Flask==3.0.3
Flask-Cors==4.0.1
gunicorn==22.0.0
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.5
openpyxl==3.1.5
packaging==24.0
setuptools==69.2.0
pyparsing==3.2.0
rdflib==7.1.1
Werkzeug==3.0.3
Loading

0 comments on commit 7937908

Please sign in to comment.