generate_owl.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/usr/bin/env python3
  2. # author: Harshvardhan Pandit
  3. # Creates the OWL ontology for GDPRtEXT
  4. # NOTE: EDIT LATER WITH PROTEGE
  5. ##############################################################################
  6. from rdflib import Graph, RDF, RDFS, XSD, OWL, Literal, URIRef, BNode
  7. from rdflib import Namespace
  8. graph = Graph()
  9. DC = Namespace('http://purl.org/dc/elements/1.1/')
  10. graph.namespace_manager.bind('dc', DC)
  11. graph.namespace_manager.bind('owl', OWL)
  12. GDPRtEXT_URI = URIRef('http://purl.org/adaptcentre/ontologies/GDPRtEXT#')
  13. GDPRtEXT = Namespace('http://purl.org/adaptcentre/ontologies/GDPRtEXT#')
  14. graph.namespace_manager.bind('GDPRtext', GDPRtEXT)
  15. graph.add((GDPRtEXT_URI, RDF.type, OWL.Ontology))
  16. graph.add((GDPRtEXT_URI, RDFS.label, Literal(
  17. 'GDPR text EXTensions', datatype=XSD.string)))
  18. graph.add((GDPRtEXT_URI, DC.title, Literal(
  19. 'GDPRtEXT', datatype=XSD.string)))
  20. graph.add((GDPRtEXT_URI, OWL.versionInfo, Literal(
  21. '0.1', datatype=XSD.string)))
  22. graph.add((GDPRtEXT_URI, DC.creator, Literal(
  23. 'Harshvardhan J. Pandit', datatype=XSD.string)))
  24. graph.add((GDPRtEXT_URI, DC.description, Literal((
  25. 'This ontology extends the canonical (official) GDPR text '
  26. 'with additional annotations'), datatype=XSD.string)))
  27. graph.add((GDPRtEXT_URI, RDFS.comment, Literal(
  28. 'This is an ontology to represent GDPR text as a set of RDF resources',
  29. datatype=XSD.string)))
  30. # This is the ELI namespace, used as the legal vocabulary for EU text
  31. ELI = Namespace("http://data.europa.eu/eli/ontology#")
  32. graph.namespace_manager.bind('eli', ELI)
  33. # bind ELI items to names that are easier to access (argumentative)
  34. LRS = ELI.LegalResourceSubdivision
  35. TITLE = ELI.title
  36. NOS = ELI.number
  37. TITLE_ALT = ELI.title_alternative
  38. PART_OF = ELI.is_part_of
  39. # graph.add((PART_OF, RDF.type, OWL.TransitiveProperty))
  40. DESC = ELI.description
  41. # declare chapters, etc. as subclasses of LRS
  42. class_Chapter = GDPRtEXT['Chapter']
  43. graph.add((class_Chapter, RDF.type, OWL.Class))
  44. graph.add((class_Chapter, RDFS.subClassOf, LRS))
  45. graph.add((class_Chapter, RDFS.label, Literal('Chapter', datatype=XSD.string)))
  46. graph.add((class_Chapter, RDFS.comment, Literal(
  47. 'Chapter in GDPR text', datatype=XSD.string)))
  48. # declare section, etc. as subclasses of LRS
  49. class_Section = GDPRtEXT['Section']
  50. graph.add((class_Section, RDF.type, OWL.Class))
  51. graph.add((class_Section, RDFS.subClassOf, LRS))
  52. graph.add((class_Section, RDFS.label, Literal('Section', datatype=XSD.string)))
  53. graph.add((class_Section, RDFS.comment, Literal(
  54. 'Section in GDPR text', datatype=XSD.string)))
  55. # declare article, etc. as subclasses of LRS
  56. class_Article = GDPRtEXT['Article']
  57. graph.add((class_Article, RDF.type, OWL.Class))
  58. graph.add((class_Article, RDFS.subClassOf, LRS))
  59. graph.add((class_Article, RDFS.label, Literal('Article', datatype=XSD.string)))
  60. graph.add((class_Article, RDFS.comment, Literal(
  61. 'Article in GDPR text', datatype=XSD.string)))
  62. # declare point, etc. as subclasses of LRS
  63. class_Point = GDPRtEXT['Point']
  64. graph.add((class_Point, RDF.type, OWL.Class))
  65. graph.add((class_Point, RDFS.subClassOf, LRS))
  66. graph.add((class_Point, RDFS.label, Literal('Point', datatype=XSD.string)))
  67. graph.add((class_Point, RDFS.comment, Literal(
  68. 'Point in GDPR text', datatype=XSD.string)))
  69. # declare subpoint, etc. as subclasses of LRS
  70. class_SubPoint = GDPRtEXT['SubPoint']
  71. graph.add((class_SubPoint, RDF.type, OWL.Class))
  72. graph.add((class_SubPoint, RDFS.subClassOf, LRS))
  73. graph.add((class_SubPoint, RDFS.label, Literal(
  74. 'SubPoint', datatype=XSD.string)))
  75. graph.add((class_SubPoint, RDFS.comment, Literal(
  76. 'SubPoint in GDPR text', datatype=XSD.string)))
  77. # Regulation
  78. class_Recital = GDPRtEXT['Recital']
  79. graph.add((class_Recital, RDF.type, OWL.Class))
  80. graph.add((class_Recital, RDFS.subClassOf, LRS))
  81. graph.add((class_Recital, RDFS.label, Literal(
  82. 'Regulation', datatype=XSD.string)))
  83. graph.add((class_Recital, RDFS.comment, Literal(
  84. 'Regulation in GDPR text', datatype=XSD.string)))
  85. # Citation
  86. class_Citation = GDPRtEXT['Citation']
  87. graph.add((class_Citation, RDF.type, OWL.Class))
  88. graph.add((class_Citation, RDFS.subClassOf, LRS))
  89. graph.add((class_Citation, RDFS.label, Literal(
  90. 'Citation', datatype=XSD.string)))
  91. graph.add((class_Citation, RDFS.comment, Literal(
  92. 'Citation in GDPR text', datatype=XSD.string)))
  93. # PROPERTIES
  94. property_partof_chapter = GDPRtEXT['isPartOfChapter']
  95. graph.add((property_partof_chapter, RDF.type, OWL.ObjectProperty))
  96. graph.add((property_partof_chapter, RDF.type, OWL.FunctionalProperty))
  97. graph.add((property_partof_chapter, RDFS.subPropertyOf, PART_OF))
  98. graph.add((property_partof_chapter, RDFS.domain, LRS))
  99. graph.add((property_partof_chapter, RDFS.range, class_Chapter))
  100. graph.add((property_partof_chapter, RDFS.label, Literal(
  101. 'is part of Chapter', datatype=XSD.string)))
  102. graph.add((property_partof_chapter, RDFS.comment, Literal(
  103. 'represents a legal resource subdivision to be part of a chapter',
  104. datatype=XSD.string)))
  105. property_partof_section = GDPRtEXT['isPartOfSection']
  106. graph.add((property_partof_section, RDF.type, OWL.ObjectProperty))
  107. graph.add((property_partof_section, RDF.type, OWL.FunctionalProperty))
  108. graph.add((property_partof_section, RDFS.subPropertyOf, PART_OF))
  109. graph.add((property_partof_section, RDFS.domain, LRS))
  110. graph.add((property_partof_section, RDFS.range, class_Section))
  111. graph.add((property_partof_section, RDFS.label, Literal(
  112. 'is part of Section', datatype=XSD.string)))
  113. graph.add((property_partof_section, RDFS.comment, Literal(
  114. 'represents a legal resource subdivision to be part of a section',
  115. datatype=XSD.string)))
  116. property_partof_article = GDPRtEXT['isPartOfArticle']
  117. graph.add((property_partof_article, RDF.type, OWL.ObjectProperty))
  118. graph.add((property_partof_article, RDF.type, OWL.FunctionalProperty))
  119. graph.add((property_partof_article, RDFS.subPropertyOf, PART_OF))
  120. graph.add((property_partof_article, RDFS.domain, LRS))
  121. graph.add((property_partof_article, RDFS.range, class_Article))
  122. graph.add((property_partof_article, RDFS.label, Literal(
  123. 'is part of Article', datatype=XSD.string)))
  124. graph.add((property_partof_article, RDFS.comment, Literal(
  125. 'represents a legal resource subdivision to be part of a article',
  126. datatype=XSD.string)))
  127. property_partof_point = GDPRtEXT['isPartOfPoint']
  128. graph.add((property_partof_point, RDF.type, OWL.ObjectProperty))
  129. graph.add((property_partof_point, RDF.type, OWL.FunctionalProperty))
  130. graph.add((property_partof_point, RDFS.subPropertyOf, PART_OF))
  131. graph.add((property_partof_point, RDFS.domain, LRS))
  132. graph.add((property_partof_point, RDFS.range, class_Point))
  133. graph.add((property_partof_point, RDFS.label, Literal(
  134. 'is part of Point', datatype=XSD.string)))
  135. graph.add((property_partof_point, RDFS.comment, Literal(
  136. 'represents a legal resource subdivision to be part of a point',
  137. datatype=XSD.string)))
  138. graph.serialize(destination='../deliverables/gdpr.owl', format='xml')