fuzzy-dl-owl2 1.0.5__py3-none-any.whl → 1.0.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -64,6 +64,7 @@ from fuzzy_dl_owl2.fuzzydl.util import constants
64
64
  from fuzzy_dl_owl2.fuzzydl.util.constants import ConceptType, ConcreteFeatureType
65
65
  from fuzzy_dl_owl2.fuzzydl.util.util import Util
66
66
  from fuzzy_dl_owl2.fuzzyowl2.util.constants import FuzzyOWL2Keyword
67
+ from fuzzy_dl_owl2.fuzzyowl2.util.fuzzy_xml import FuzzyXML
67
68
  from pyowl2.abstracts.axiom import OWLAxiom
68
69
  from pyowl2.abstracts.class_expression import OWLClassExpression
69
70
  from pyowl2.abstracts.data_range import OWLDataRange
@@ -276,11 +277,24 @@ class FuzzydlToOwl2:
276
277
  c4: OWLClassExpression = self.get_new_atomic_class(str(c))
277
278
  c3: OWLClassExpression = self.get_base(c.c1)
278
279
  self.concepts[str(c)] = c3
279
- annotation: str = (
280
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
281
- f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.MODIFIED.get_str_value()}" {FuzzyOWL2Keyword.MODIFIER.get_str_value()}="{self.modifiers[str(c)]}" {FuzzyOWL2Keyword.BASE.get_str_value()}="{c3}"/>\n',
282
- f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>",
280
+
281
+ main_xml = FuzzyXML.build_main_xml(FuzzyOWL2Keyword.CONCEPT.get_str_value())
282
+ concept_xml = FuzzyXML.build_concept_xml(
283
+ FuzzyOWL2Keyword.MODIFIED.get_str_value(),
284
+ {
285
+ FuzzyOWL2Keyword.MODIFIER.get_str_value(): str(
286
+ self.modifiers[str(c)]
287
+ ),
288
+ FuzzyOWL2Keyword.BASE.get_str_value(): str(c3),
289
+ },
283
290
  )
291
+ main_xml.append(concept_xml)
292
+ annotation: str = FuzzyXML.to_str(main_xml)
293
+ # annotation: str = (
294
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
295
+ # f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.MODIFIED.get_str_value()}" {FuzzyOWL2Keyword.MODIFIER.get_str_value()}="{self.modifiers[str(c)]}" {FuzzyOWL2Keyword.BASE.get_str_value()}="{c3}"/>\n',
296
+ # f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>",
297
+ # )
284
298
  self.add_entity_annotation(annotation, c4)
285
299
  return c4
286
300
  elif c_type == ConceptType.SELF:
@@ -331,11 +345,22 @@ class FuzzydlToOwl2:
331
345
  c: WeightedConcept = typing.cast(WeightedConcept, c)
332
346
  c4: OWLClassExpression = self.get_new_atomic_class(str(c))
333
347
  c3: OWLClassExpression = self.get_base(c.c1)
334
- annotation: str = (
335
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
336
- f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.WEIGHTED.get_str_value()}" {FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value()}="{c.weight}" {FuzzyOWL2Keyword.BASE.get_str_value()}="{c3}"/>\n',
337
- f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>",
348
+
349
+ main_xml = FuzzyXML.build_main_xml(FuzzyOWL2Keyword.CONCEPT.get_str_value())
350
+ concept_xml = FuzzyXML.build_concept_xml(
351
+ FuzzyOWL2Keyword.WEIGHTED.get_str_value(),
352
+ {
353
+ FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value(): str(c.weight),
354
+ FuzzyOWL2Keyword.BASE.get_str_value(): str(c3),
355
+ },
338
356
  )
357
+ main_xml.append(concept_xml)
358
+ annotation: str = FuzzyXML.to_str(main_xml)
359
+ # annotation: str = (
360
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
361
+ # f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.WEIGHTED.get_str_value()}" {FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value()}="{c.weight}" {FuzzyOWL2Keyword.BASE.get_str_value()}="{c3}"/>\n',
362
+ # f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>",
363
+ # )
339
364
  self.add_entity_annotation(annotation, c3)
340
365
  return c4
341
366
  elif c_type in (
@@ -378,16 +403,33 @@ class FuzzydlToOwl2:
378
403
  curr_concept: HasWeightedConceptsInterface = type_cast[c.type](c)
379
404
  c3: OWLClassExpression = self.get_new_atomic_class(str(curr_concept))
380
405
 
381
- annotation: str = (
382
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
383
- f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{type_dict[c.type]}">\n ',
384
- )
406
+ main_xml = FuzzyXML.build_main_xml(FuzzyOWL2Keyword.CONCEPT.get_str_value())
407
+ concept_xml = FuzzyXML.build_concept_xml(type_dict[c.type])
385
408
  for i in range(len(curr_concept.concepts)):
386
409
  c5: OWLClassExpression = self.get_base(curr_concept.concepts[i])
387
- annotation += f'\t\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.WEIGHTED.get_str_value()}" {FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value()}="{curr_concept.weights[i]}" {FuzzyOWL2Keyword.BASE.get_str_value()}="{c5}" />\n'
388
- annotation: str = (
389
- f"\t</{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} >\n</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} >"
390
- )
410
+ sub_concept_xml = FuzzyXML.build_concept_xml(
411
+ FuzzyOWL2Keyword.WEIGHTED.get_str_value(),
412
+ {
413
+ FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value(): str(
414
+ curr_concept.weights[i]
415
+ ),
416
+ FuzzyOWL2Keyword.BASE.get_str_value(): str(c5),
417
+ },
418
+ )
419
+ concept_xml.append(sub_concept_xml)
420
+ main_xml.append(concept_xml)
421
+ annotation: str = FuzzyXML.to_str(main_xml)
422
+
423
+ # annotation: str = (
424
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
425
+ # f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{type_dict[c.type]}">\n ',
426
+ # )
427
+ # for i in range(len(curr_concept.concepts)):
428
+ # c5: OWLClassExpression = self.get_base(curr_concept.concepts[i])
429
+ # annotation += f'\t\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.WEIGHTED.get_str_value()}" {FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value()}="{curr_concept.weights[i]}" {FuzzyOWL2Keyword.BASE.get_str_value()}="{c5}" />\n'
430
+ # annotation: str = (
431
+ # f"\t</{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} >\n</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} >"
432
+ # )
391
433
  self.add_entity_annotation(annotation, c3)
392
434
  return c3
393
435
 
@@ -411,18 +453,31 @@ class FuzzydlToOwl2:
411
453
  return None
412
454
  curr_concept: HasWeightedConceptsInterface = type_cast[c.type](c)
413
455
  c4: OWLClassExpression = self.get_new_atomic_class(str(c))
414
- annotation: str = (
415
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
416
- f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{type_dict[c.type]}">\n',
417
- f"\t\t<{FuzzyOWL2Keyword.WEIGHTS.get_tag_name()}>\n",
456
+
457
+ main_xml = FuzzyXML.build_main_xml(FuzzyOWL2Keyword.CONCEPT.get_str_value())
458
+ concept_xml = FuzzyXML.build_concept_xml(type_dict[c.type])
459
+ weights_xml = FuzzyXML.build_weights_xml(curr_concept.weights)
460
+ names_xml = FuzzyXML.build_names_xml(
461
+ [self.get_base(ci) for ci in curr_concept.concepts]
418
462
  )
419
- for d in curr_concept.weights:
420
- annotation += f"\t\t\t<{FuzzyOWL2Keyword.WEIGHT.get_tag_name()}>{d}</{FuzzyOWL2Keyword.WEIGHT.get_tag_name()}>\n"
421
- annotation += f"\t\t</{FuzzyOWL2Keyword.WEIGHTS.get_tag_name()}>\n\t\t<{FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()}>\n"
422
- for ci in curr_concept.concepts:
423
- c5: OWLClassExpression = self.get_base(ci)
424
- annotation += f"\t\t\t<{FuzzyOWL2Keyword.NAME.get_tag_name()}>{c5}</{FuzzyOWL2Keyword.NAME.get_tag_name()}>\n"
425
- annotation += f"\t\t</{FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()}>\n\t</{FuzzyOWL2Keyword.CONCEPT.get_tag_name()}>\n</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
463
+ concept_xml.append(weights_xml)
464
+ concept_xml.append(names_xml)
465
+ main_xml.append(concept_xml)
466
+ annotation: str = FuzzyXML.to_str(main_xml)
467
+
468
+ # annotation: str = (
469
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
470
+ # f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{type_dict[c.type]}">\n',
471
+ # f"\t\t<{FuzzyOWL2Keyword.WEIGHTS.get_tag_name()}>\n",
472
+ # )
473
+ # for d in curr_concept.weights:
474
+ # annotation += f"\t\t\t<{FuzzyOWL2Keyword.WEIGHT.get_tag_name()}>{d}</{FuzzyOWL2Keyword.WEIGHT.get_tag_name()}>\n"
475
+ # annotation += f"\t\t</{FuzzyOWL2Keyword.WEIGHTS.get_tag_name()}>\n\t\t<{FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()}>\n"
476
+ # for ci in curr_concept.concepts:
477
+ # c5: OWLClassExpression = self.get_base(ci)
478
+ # annotation += f"\t\t\t<{FuzzyOWL2Keyword.NAME.get_tag_name()}>{c5}</{FuzzyOWL2Keyword.NAME.get_tag_name()}>\n"
479
+ # annotation += f"\t\t</{FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()}>\n\t</{FuzzyOWL2Keyword.CONCEPT.get_tag_name()}>\n</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
480
+
426
481
  self.add_entity_annotation(annotation, c4)
427
482
  return c4
428
483
 
@@ -438,15 +493,27 @@ class FuzzydlToOwl2:
438
493
  return None
439
494
  curr_concept: QowaConcept = type_cast[c.type](c)
440
495
  c4: OWLClassExpression = self.get_new_atomic_class(str(c))
441
- annotation: str = (
442
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
443
- f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{type_dict[c.type]}" {FuzzyOWL2Keyword.QUANTIFIER.get_tag_name()}="{curr_concept.quantifier}">\n',
444
- f"\t\t<{FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()}>\n",
496
+
497
+ main_xml = FuzzyXML.build_main_xml(FuzzyOWL2Keyword.CONCEPT.get_str_value())
498
+ concept_xml = FuzzyXML.build_concept_xml(
499
+ type_dict[c.type],
500
+ {FuzzyOWL2Keyword.QUANTIFIER.get_str_value(): str(curr_concept.quantifier)},
445
501
  )
446
- for ci in curr_concept.concepts:
447
- c5: OWLClassExpression = self.get_base(ci)
448
- annotation += f"\t\t\t<{FuzzyOWL2Keyword.NAME.get_tag_name()}>{c5}</{FuzzyOWL2Keyword.NAME.get_tag_name()}>\n"
449
- annotation += f"\t\t</{FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()}>\n\t</{FuzzyOWL2Keyword.CONCEPT.get_tag_name()}>\n</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
502
+ names_xml = FuzzyXML.build_names_xml(
503
+ [self.get_base(ci) for ci in curr_concept.concepts]
504
+ )
505
+ concept_xml.append(names_xml)
506
+ main_xml.append(concept_xml)
507
+ annotation: str = FuzzyXML.to_str(main_xml)
508
+ # annotation: str = (
509
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.CONCEPT.get_str_value()}">\n',
510
+ # f'\t<{FuzzyOWL2Keyword.CONCEPT.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{type_dict[c.type]}" {FuzzyOWL2Keyword.QUANTIFIER.get_str_value()}="{curr_concept.quantifier}">\n',
511
+ # f"\t\t<{FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()}>\n",
512
+ # )
513
+ # for ci in curr_concept.concepts:
514
+ # c5: OWLClassExpression = self.get_base(ci)
515
+ # annotation += f"\t\t\t<{FuzzyOWL2Keyword.NAME.get_tag_name()}>{c5}</{FuzzyOWL2Keyword.NAME.get_tag_name()}>\n"
516
+ # annotation += f"\t\t</{FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()}>\n\t</{FuzzyOWL2Keyword.CONCEPT.get_tag_name()}>\n</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
450
517
  self.add_entity_annotation(annotation, c4)
451
518
  return c4
452
519
 
@@ -549,11 +616,16 @@ class FuzzydlToOwl2:
549
616
  elif isinstance(value, DegreeNumeric): # Degree object
550
617
  n = value.get_numerical_value()
551
618
 
552
- annotation_text: str = (
553
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.AXIOM.get_str_value()}">\n'
554
- f'\t<{FuzzyOWL2Keyword.DEGREE_DEF.get_tag_name()} {FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value()}="{n}"/>\n'
555
- f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
556
- )
619
+ main_xml = FuzzyXML.build_main_xml(FuzzyOWL2Keyword.AXIOM.get_str_value())
620
+ degree_xml = FuzzyXML.build_degree_xml(n)
621
+ main_xml.append(degree_xml)
622
+ annotation_text: str = FuzzyXML.to_str(main_xml)
623
+
624
+ # annotation_text: str = (
625
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.AXIOM.get_str_value()}">\n'
626
+ # f'\t<{FuzzyOWL2Keyword.DEGREE_DEF.get_tag_name()} {FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value()}="{n}"/>\n'
627
+ # f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
628
+ # )
557
629
  annotation: OWLAnnotation = self.to_owl_annotation(annotation_text)
558
630
  return set([annotation])
559
631
 
@@ -590,11 +662,17 @@ class FuzzydlToOwl2:
590
662
  logic = str(constants.KNOWLEDGE_BASE_SEMANTICS)
591
663
 
592
664
  if logic:
593
- annotation: str = (
594
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.ONTOLOGY.get_str_value()}">\n'
595
- f'\t<{FuzzyOWL2Keyword.FUZZY_LOGIC.get_tag_name()} {FuzzyOWL2Keyword.LOGIC.get_str_value()}="{logic}" />\n'
596
- f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
665
+ main_xml = FuzzyXML.build_main_xml(
666
+ FuzzyOWL2Keyword.ONTOLOGY.get_str_value()
597
667
  )
668
+ logic_xml = FuzzyXML.build_logic_xml(logic)
669
+ main_xml.append(logic_xml)
670
+ annotation: str = FuzzyXML.to_str(main_xml)
671
+ # annotation: str = (
672
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.ONTOLOGY.get_str_value()}">\n'
673
+ # f'\t<{FuzzyOWL2Keyword.FUZZY_LOGIC.get_tag_name()} {FuzzyOWL2Keyword.LOGIC.get_str_value()}="{logic}" />\n'
674
+ # f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
675
+ # )
598
676
  self.add_ontology_annotation(annotation)
599
677
 
600
678
  # Process concrete concepts
@@ -813,7 +891,8 @@ class FuzzydlToOwl2:
813
891
  current_datatype: OWLDatatype = OWLDatatype(self.iri(c))
814
892
  self.datatypes[str(c)] = current_datatype
815
893
 
816
- specific: str = self._get_concrete_concept_specifics(c)
894
+ # specific: str = self._get_concrete_concept_specifics(c)
895
+ specific: tuple[str, dict[str, str]] = self._get_concrete_concept_specifics(c)
817
896
 
818
897
  int_datatype: OWLDatatype = OWLDatatype(XSD.integer)
819
898
  greater_than: OWLDatatypeRestriction = OWLDatatypeRestriction(
@@ -843,45 +922,102 @@ class FuzzydlToOwl2:
843
922
  self.ontology.add_axiom(OWLDeclaration(current_datatype))
844
923
  self.ontology.add_axiom(definition)
845
924
 
846
- annotation: str = (
847
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.DATATYPE.get_str_value()}">\n'
848
- f'\t<{FuzzyOWL2Keyword.DATATYPE.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{specific}"/>\n'
849
- f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
850
- )
925
+ main_xml = FuzzyXML.build_main_xml(FuzzyOWL2Keyword.DATATYPE.get_str_value())
926
+ datatype_xml = FuzzyXML.build_datatype_xml(specific[0], specific[1])
927
+ main_xml.append(datatype_xml)
928
+ annotation: str = FuzzyXML.to_str(main_xml)
929
+
930
+ # annotation: str = (
931
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.DATATYPE.get_str_value()}">\n'
932
+ # f'\t<{FuzzyOWL2Keyword.DATATYPE.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{specific}"/>\n'
933
+ # f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
934
+ # )
851
935
  self.add_entity_annotation(annotation, current_datatype)
852
936
 
853
- def _get_concrete_concept_specifics(self, c: FuzzyConcreteConcept) -> str:
937
+ def _get_concrete_concept_specifics(
938
+ self, c: FuzzyConcreteConcept
939
+ ) -> tuple[str, dict[str, str]]:
854
940
  """Get concrete concept specific parameters"""
855
941
  if isinstance(c, CrispConcreteConcept):
856
- return f'{FuzzyOWL2Keyword.CRISP.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}'
942
+ return FuzzyOWL2Keyword.CRISP.get_str_value(), {
943
+ FuzzyOWL2Keyword.A.get_str_value(): str(c.a),
944
+ FuzzyOWL2Keyword.B.get_str_value(): str(c.b),
945
+ }
857
946
  elif isinstance(c, LeftConcreteConcept):
858
- return f'{FuzzyOWL2Keyword.LEFT_SHOULDER.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}'
947
+ return FuzzyOWL2Keyword.LEFT_SHOULDER.get_str_value(), {
948
+ FuzzyOWL2Keyword.A.get_str_value(): str(c.a),
949
+ FuzzyOWL2Keyword.B.get_str_value(): str(c.b),
950
+ }
859
951
  elif isinstance(c, RightConcreteConcept):
860
- return f'{FuzzyOWL2Keyword.RIGHT_SHOULDER.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}'
952
+ return FuzzyOWL2Keyword.RIGHT_SHOULDER.get_str_value(), {
953
+ FuzzyOWL2Keyword.A.get_str_value(): str(c.a),
954
+ FuzzyOWL2Keyword.B.get_str_value(): str(c.b),
955
+ }
861
956
  elif isinstance(c, TriangularConcreteConcept):
862
- return f'{FuzzyOWL2Keyword.TRIANGULAR.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}" {FuzzyOWL2Keyword.C.get_str_value()}="{c.c}'
957
+ return FuzzyOWL2Keyword.TRIANGULAR.get_str_value(), {
958
+ FuzzyOWL2Keyword.A.get_str_value(): str(c.a),
959
+ FuzzyOWL2Keyword.B.get_str_value(): str(c.b),
960
+ FuzzyOWL2Keyword.C.get_str_value(): str(c.c),
961
+ }
863
962
  elif isinstance(c, TrapezoidalConcreteConcept):
864
- return f'{FuzzyOWL2Keyword.TRAPEZOIDAL.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}" {FuzzyOWL2Keyword.C.get_str_value()}="{c.c}" {FuzzyOWL2Keyword.D.get_str_value()}="{c.d}'
865
- return ""
963
+ return FuzzyOWL2Keyword.TRAPEZOIDAL.get_str_value(), {
964
+ FuzzyOWL2Keyword.A.get_str_value(): str(c.a),
965
+ FuzzyOWL2Keyword.B.get_str_value(): str(c.b),
966
+ FuzzyOWL2Keyword.C.get_str_value(): str(c.c),
967
+ FuzzyOWL2Keyword.D.get_str_value(): str(c.d),
968
+ }
969
+ return "", dict()
970
+
971
+ # def _get_concrete_concept_specifics(self, c: FuzzyConcreteConcept) -> str:
972
+ # """Get concrete concept specific parameters"""
973
+ # if isinstance(c, CrispConcreteConcept):
974
+ # return f'{FuzzyOWL2Keyword.CRISP.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}'
975
+ # elif isinstance(c, LeftConcreteConcept):
976
+ # return f'{FuzzyOWL2Keyword.LEFT_SHOULDER.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}'
977
+ # elif isinstance(c, RightConcreteConcept):
978
+ # return f'{FuzzyOWL2Keyword.RIGHT_SHOULDER.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}'
979
+ # elif isinstance(c, TriangularConcreteConcept):
980
+ # return f'{FuzzyOWL2Keyword.TRIANGULAR.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}" {FuzzyOWL2Keyword.C.get_str_value()}="{c.c}'
981
+ # elif isinstance(c, TrapezoidalConcreteConcept):
982
+ # return f'{FuzzyOWL2Keyword.TRAPEZOIDAL.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{c.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{c.b}" {FuzzyOWL2Keyword.C.get_str_value()}="{c.c}" {FuzzyOWL2Keyword.D.get_str_value()}="{c.d}'
983
+ # return ""
866
984
 
867
985
  def _process_modifier(self, mod: Modifier) -> None:
868
986
  """Process a modifier"""
869
987
  Util.debug(f"Process modifier -> {mod}")
988
+
989
+ main_xml = FuzzyXML.build_main_xml(FuzzyOWL2Keyword.MODIFIER.get_str_value())
990
+
870
991
  if isinstance(mod, LinearModifier):
871
- annotation: str = (
872
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.MODIFIER.get_str_value()}">\n'
873
- f'\t<{FuzzyOWL2Keyword.MODIFIER.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.LINEAR.get_str_value()}" {FuzzyOWL2Keyword.C.get_str_value()}="{mod.c}"/>\n'
874
- f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
992
+ modifier_xml = FuzzyXML.build_modifier_xml(
993
+ FuzzyOWL2Keyword.LINEAR.get_str_value(),
994
+ {FuzzyOWL2Keyword.C.get_str_value(): str(mod.c)},
875
995
  )
996
+ # annotation: str = (
997
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.MODIFIER.get_str_value()}">\n'
998
+ # f'\t<{FuzzyOWL2Keyword.MODIFIER.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.LINEAR.get_str_value()}" {FuzzyOWL2Keyword.C.get_str_value()}="{mod.c}"/>\n'
999
+ # f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
1000
+ # )
876
1001
  elif isinstance(mod, TriangularModifier):
877
- annotation: str = (
878
- f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.MODIFIER.get_str_value()}">\n'
879
- f'\t<{FuzzyOWL2Keyword.MODIFIER.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.TRIANGULAR.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{mod.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{mod.b}" {FuzzyOWL2Keyword.C.get_str_value()}="{mod.c}"/>\n'
880
- f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
1002
+ modifier_xml = FuzzyXML.build_modifier_xml(
1003
+ FuzzyOWL2Keyword.TRIANGULAR.get_str_value(),
1004
+ {
1005
+ FuzzyOWL2Keyword.A.get_str_value(): str(mod.a),
1006
+ FuzzyOWL2Keyword.B.get_str_value(): str(mod.b),
1007
+ FuzzyOWL2Keyword.C.get_str_value(): str(mod.c),
1008
+ },
881
1009
  )
1010
+ # annotation: str = (
1011
+ # f'<{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()} {FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()}="{FuzzyOWL2Keyword.MODIFIER.get_str_value()}">\n'
1012
+ # f'\t<{FuzzyOWL2Keyword.MODIFIER.get_tag_name()} {FuzzyOWL2Keyword.TYPE.get_str_value()}="{FuzzyOWL2Keyword.TRIANGULAR.get_str_value()}" {FuzzyOWL2Keyword.A.get_str_value()}="{mod.a}" {FuzzyOWL2Keyword.B.get_str_value()}="{mod.b}" {FuzzyOWL2Keyword.C.get_str_value()}="{mod.c}"/>\n'
1013
+ # f"</{FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value()}>"
1014
+ # )
882
1015
  else:
883
1016
  raise ValueError(f"Unknown modifier type: {type(mod)}")
884
1017
 
1018
+ main_xml.append(modifier_xml)
1019
+ annotation: str = FuzzyXML.to_str(main_xml)
1020
+
885
1021
  current_datatype: OWLDatatype = OWLDatatype(self.iri(mod))
886
1022
  self.modifiers[str(mod)] = current_datatype
887
1023
  self.ontology.add_axiom(OWLDeclaration(current_datatype))
@@ -1,3 +1,4 @@
1
1
  from .config_reader import ConfigReader
2
2
  from .util import Util
3
3
  from .utils import *
4
+ from .constants import *
@@ -35,7 +35,7 @@ from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_sum_concept import WeightedSumCo
35
35
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_sum_zero_concept import (
36
36
  WeightedSumZeroConcept,
37
37
  )
38
- from fuzzy_dl_owl2.fuzzyowl2.parser.owl2_parser import FuzzyOwl2Parser
38
+ from fuzzy_dl_owl2.fuzzyowl2.parser.owl2_xml_parser import FuzzyOwl2XMLParser
39
39
  from pyowl2.abstracts.annotation_value import OWLAnnotationValue
40
40
  from pyowl2.abstracts.axiom import OWLAxiom
41
41
  from pyowl2.abstracts.class_expression import OWLClassExpression
@@ -166,7 +166,7 @@ class FuzzyOwl2(object):
166
166
  self.processed_axioms: set[str] = set()
167
167
  self.ontologies: set[OWLOntology] = set()
168
168
 
169
- FuzzyOwl2Parser.load_config()
169
+ FuzzyOwl2XMLParser.load_config()
170
170
 
171
171
  self.ontology_path = input_file
172
172
  self.ontology_iri = IRI(Namespace(base_iri))
@@ -200,9 +200,13 @@ class FuzzyOwl2(object):
200
200
  if annotation.annotation_property != self.fuzzy_label:
201
201
  continue
202
202
  value: OWLAnnotationValue = annotation.annotation_value
203
- annotation_str: str = str(value).replace('"', "")
203
+ annotation_str: str = str(value)
204
204
  Util.debug(f"Annotation for ontology -> {annotation_str}")
205
- self.write_fuzzy_logic(FuzzyOwl2Parser.parse_string(annotation_str)[0])
205
+ logic: typing.Optional[str] = FuzzyOwl2XMLParser.parse_string(
206
+ annotation_str
207
+ )
208
+ Util.debug(f"Parsed annotation -> {logic}")
209
+ self.write_fuzzy_logic(logic)
206
210
 
207
211
  def __get_facets(self, name: str) -> list[float]:
208
212
  facets: list[float] = [float("-inf"), float("inf")]
@@ -282,13 +286,14 @@ class FuzzyOwl2(object):
282
286
  f"Error: There are {len(annotations)} datatype annotations for {datatype}"
283
287
  )
284
288
  annotation: OWLAnnotation = list(annotations)[0].annotation_value
285
- annotation_str: str = str(annotation).replace('"', "")
289
+ annotation_str: str = str(annotation)
286
290
  Util.debug(f"Annotation for {datatype} -> {annotation_str}")
287
291
  datatype_name: str = self.get_short_name(datatype)
288
292
  facets: list[OWLFacet] = self.__get_facets(datatype_name)
289
293
  c: typing.Union[ConceptDefinition, FuzzyModifier] = (
290
- FuzzyOwl2Parser.parse_string(annotation_str)[0]
294
+ FuzzyOwl2XMLParser.parse_string(annotation_str)
291
295
  )
296
+ Util.debug(f"Parsed annotation -> {c}")
292
297
  if isinstance(c, FuzzyDatatype):
293
298
  c.set_min_value(facets[0])
294
299
  c.set_max_value(facets[1])
@@ -330,12 +335,12 @@ class FuzzyOwl2(object):
330
335
  f"Error: There are {len(annotations)} class annotations for {cls}"
331
336
  )
332
337
  annotation: OWLAnnotation = list(annotations)[0].annotation_value
333
- annotation_str: str = str(annotation).replace('"', "")
338
+ annotation_str: str = str(annotation)
334
339
  Util.debug(f"Annotation for concept {cls} -> {annotation_str}")
335
- concept: ConceptDefinition = FuzzyOwl2Parser.parse_string(
340
+ concept: ConceptDefinition = FuzzyOwl2XMLParser.parse_string(
336
341
  annotation_str
337
- )[0]
338
- Util.debug(f"Concept -> {concept}")
342
+ )
343
+ Util.debug(f"Parsed annotation -> {concept}")
339
344
  name: str = self.get_short_name(cls)
340
345
  if isinstance(concept, ModifiedConcept):
341
346
  mod_name: str = concept.get_fuzzy_modifier()
@@ -401,11 +406,12 @@ class FuzzyOwl2(object):
401
406
  f"Error: There are {len(annotations)} property annotations for {property}"
402
407
  )
403
408
  annotation: OWLAnnotation = list(annotations)[0].annotation_value
404
- annotation_str: str = str(annotation).replace('"', "")
409
+ annotation_str: str = str(annotation)
405
410
  Util.debug(f"Annotation for property {property} -> {annotation_str}")
406
411
  prop: typing.Optional[ModifiedProperty] = (
407
- FuzzyOwl2Parser.parse_string(annotation_str)
408
- )[0]
412
+ FuzzyOwl2XMLParser.parse_string(annotation_str)
413
+ )
414
+ Util.debug(f"Parsed annotation -> {prop}")
409
415
  if prop is None:
410
416
  return
411
417
  if not isinstance(prop, ModifiedProperty):
@@ -428,10 +434,10 @@ class FuzzyOwl2(object):
428
434
  f"Error: There are {len(annotations)} annotations for axiom {axiom}."
429
435
  )
430
436
  annotation: OWLAnnotation = list(annotations)[0].annotation_value
431
- annotation_str: str = str(annotation).replace('"', "")
437
+ annotation_str: str = str(annotation)
432
438
  Util.debug(f"Annotation for degree -> {annotation_str}")
433
- deg: float = FuzzyOwl2Parser.parse_string(annotation_str)[0]
434
- Util.debug(f"Degree for axiom -> {deg}")
439
+ deg: float = FuzzyOwl2XMLParser.parse_string(annotation_str)
440
+ Util.debug(f"Parsed annotation -> {deg}")
435
441
  if not isinstance(deg, constants.NUMBER):
436
442
  raise ValueError
437
443
  return deg
@@ -4,7 +4,7 @@ from fuzzy_dl_owl2.fuzzyowl2.owl_types.fuzzy_property import FuzzyProperty
4
4
  class ModifiedProperty(FuzzyProperty):
5
5
 
6
6
  def __init__(self, mod: str, prop: str) -> None:
7
- super.__init__()
7
+ super().__init__()
8
8
  self._mod: str = mod
9
9
  self._prop: str = prop
10
10
 
@@ -13,3 +13,9 @@ class ModifiedProperty(FuzzyProperty):
13
13
 
14
14
  def get_property(self) -> str:
15
15
  return self._prop
16
+
17
+ def __repr__(self) -> str:
18
+ return str(self)
19
+
20
+ def __str__(self) -> str:
21
+ return f"({self.get_fuzzy_modifier()}, {self.get_property()})"
@@ -1 +1,2 @@
1
- from .owl2_parser import *
1
+ # from .owl2_parser import *
2
+ from .owl2_xml_parser import *
@@ -6,11 +6,7 @@ import typing
6
6
 
7
7
  import pyparsing as pp
8
8
 
9
- from fuzzy_dl_owl2.fuzzydl.concept.qowa_concept import QowaConcept
10
9
  from fuzzy_dl_owl2.fuzzydl.knowledge_base import KnowledgeBase
11
- from fuzzy_dl_owl2.fuzzydl.modifier.linear_modifier import LinearModifier
12
- from fuzzy_dl_owl2.fuzzydl.modifier.modifier import Modifier
13
- from fuzzy_dl_owl2.fuzzydl.modifier.triangular_modifier import TriangularModifier
14
10
  from fuzzy_dl_owl2.fuzzydl.query.query import Query
15
11
  from fuzzy_dl_owl2.fuzzydl.util import utils
16
12
  from fuzzy_dl_owl2.fuzzydl.util.config_reader import ConfigReader
@@ -18,14 +14,17 @@ from fuzzy_dl_owl2.fuzzydl.util.util import Util
18
14
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.choquet_concept import ChoquetConcept
19
15
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.concept_definition import ConceptDefinition
20
16
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.fuzzy_datatype import FuzzyDatatype
17
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.fuzzy_modifier import FuzzyModifier
21
18
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.fuzzy_nominal_concept import FuzzyNominalConcept
22
19
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.left_shoulder_function import (
23
20
  LeftShoulderFunction,
24
21
  )
25
22
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.linear_function import LinearFunction
23
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.linear_modifier import LinearModifier
26
24
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.modified_concept import ModifiedConcept
27
25
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.modified_property import ModifiedProperty
28
26
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.owa_concept import OwaConcept
27
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.qowa_concept import QowaConcept
29
28
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.quasi_sugeno_concept import QsugenoConcept
30
29
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.right_shoulder_function import (
31
30
  RightShoulderFunction,
@@ -33,6 +32,7 @@ from fuzzy_dl_owl2.fuzzyowl2.owl_types.right_shoulder_function import (
33
32
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.sugeno_concept import SugenoConcept
34
33
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.trapezoidal_function import TrapezoidalFunction
35
34
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.triangular_function import TriangularFunction
35
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.triangular_modifer import TriangularModifier
36
36
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_concept import WeightedConcept
37
37
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_max_concept import WeightedMaxConcept
38
38
  from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_min_concept import WeightedMinConcept
@@ -66,13 +66,13 @@ def _parse_fuzzy_datatype(tokens: pp.ParseResults) -> FuzzyDatatype:
66
66
  return tokens
67
67
 
68
68
 
69
- def _parse_modifier_function(tokens: pp.ParseResults) -> Modifier:
69
+ def _parse_modifier_function(tokens: pp.ParseResults) -> FuzzyModifier:
70
70
  Util.debug(f"_parse_modifier_function -> {tokens}")
71
71
  list_tokens: list = tokens.as_list()
72
72
  if list_tokens[0] == FuzzyOWL2Keyword.LINEAR:
73
- return LinearModifier(None, list_tokens[1])
73
+ return LinearModifier(list_tokens[1])
74
74
  elif list_tokens[0] == FuzzyOWL2Keyword.TRIANGULAR:
75
- return TriangularModifier(None, list_tokens[1], list_tokens[2], list_tokens[3])
75
+ return TriangularModifier(list_tokens[1], list_tokens[2], list_tokens[3])
76
76
  return tokens
77
77
 
78
78
 
@@ -0,0 +1,226 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import traceback
5
+ import typing
6
+ from xml.etree import ElementTree
7
+
8
+ import pyparsing as pp
9
+
10
+ from fuzzy_dl_owl2.fuzzydl.util.config_reader import ConfigReader
11
+ from fuzzy_dl_owl2.fuzzydl.util.util import Util
12
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.choquet_concept import ChoquetConcept
13
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.fuzzy_nominal_concept import FuzzyNominalConcept
14
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.left_shoulder_function import (
15
+ LeftShoulderFunction,
16
+ )
17
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.linear_function import LinearFunction
18
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.linear_modifier import LinearModifier
19
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.modified_concept import ModifiedConcept
20
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.modified_property import ModifiedProperty
21
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.owa_concept import OwaConcept
22
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.qowa_concept import QowaConcept
23
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.quasi_sugeno_concept import QsugenoConcept
24
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.right_shoulder_function import (
25
+ RightShoulderFunction,
26
+ )
27
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.sugeno_concept import SugenoConcept
28
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.trapezoidal_function import TrapezoidalFunction
29
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.triangular_function import TriangularFunction
30
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.triangular_modifer import TriangularModifier
31
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_concept import WeightedConcept
32
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_max_concept import WeightedMaxConcept
33
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_min_concept import WeightedMinConcept
34
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_sum_concept import WeightedSumConcept
35
+ from fuzzy_dl_owl2.fuzzyowl2.owl_types.weighted_sum_zero_concept import (
36
+ WeightedSumZeroConcept,
37
+ )
38
+ from fuzzy_dl_owl2.fuzzyowl2.util.constants import FuzzyOWL2Keyword
39
+ from fuzzy_dl_owl2.fuzzyowl2.util.fuzzy_xml import FuzzyXML
40
+
41
+
42
+ class FuzzyOwl2XMLParser(object):
43
+
44
+ @staticmethod
45
+ def get_caseless_attrib(attrib: dict[str, str], key: str) -> typing.Optional[str]:
46
+ keys = [k for k in attrib if k.lower() == key.lower()]
47
+ return attrib.get(keys[0]) if len(keys) > 0 else None
48
+
49
+ @staticmethod
50
+ def parse_string(
51
+ instring: str,
52
+ ) -> pp.ParseResults:
53
+ root: ElementTree.Element = ElementTree.fromstring(instring)
54
+ Util.debug(f"XML PARSER -> {FuzzyXML.to_str(root)}")
55
+ assert root.tag == FuzzyOWL2Keyword.FUZZY_OWL_2
56
+
57
+ annotation_type: str = root.attrib.get(
58
+ FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value()
59
+ )
60
+ if annotation_type == FuzzyOWL2Keyword.CONCEPT:
61
+ child = root.find(FuzzyOWL2Keyword.CONCEPT.get_tag_name())
62
+ concept_type = child.attrib.get(FuzzyOWL2Keyword.TYPE.get_str_value())
63
+ if concept_type == FuzzyOWL2Keyword.MODIFIED:
64
+ return ModifiedConcept(
65
+ child.attrib.get(FuzzyOWL2Keyword.MODIFIER.get_str_value()),
66
+ child.attrib.get(FuzzyOWL2Keyword.BASE.get_str_value()),
67
+ )
68
+ elif concept_type == FuzzyOWL2Keyword.WEIGHTED:
69
+ return WeightedConcept(
70
+ float(
71
+ child.attrib.get(FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value())
72
+ ),
73
+ child.attrib.get(FuzzyOWL2Keyword.BASE.get_str_value()),
74
+ )
75
+ elif concept_type in (
76
+ FuzzyOWL2Keyword.WEIGHTED_MINIMUM,
77
+ FuzzyOWL2Keyword.WEIGHTED_MAXIMUM,
78
+ FuzzyOWL2Keyword.WEIGHTED_SUM,
79
+ FuzzyOWL2Keyword.WEIGHTED_SUMZERO,
80
+ ):
81
+ wc: list[WeightedConcept] = [
82
+ WeightedConcept(
83
+ float(
84
+ inner_child.attrib.get(
85
+ FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value()
86
+ )
87
+ ),
88
+ inner_child.attrib.get(FuzzyOWL2Keyword.BASE.get_str_value()),
89
+ )
90
+ for inner_child in child
91
+ if inner_child.tag == FuzzyOWL2Keyword.CONCEPT.get_tag_name()
92
+ and inner_child.attrib.get(FuzzyOWL2Keyword.TYPE.get_str_value())
93
+ == FuzzyOWL2Keyword.WEIGHTED
94
+ ]
95
+ if concept_type == FuzzyOWL2Keyword.WEIGHTED_MAXIMUM:
96
+ return WeightedMaxConcept(wc)
97
+ elif concept_type == FuzzyOWL2Keyword.WEIGHTED_MINIMUM:
98
+ return WeightedMinConcept(wc)
99
+ elif concept_type == FuzzyOWL2Keyword.WEIGHTED_SUM:
100
+ return WeightedSumConcept(wc)
101
+ elif concept_type == FuzzyOWL2Keyword.WEIGHTED_SUMZERO:
102
+ return WeightedSumZeroConcept(wc)
103
+ elif concept_type in (
104
+ FuzzyOWL2Keyword.OWA,
105
+ FuzzyOWL2Keyword.CHOQUET,
106
+ FuzzyOWL2Keyword.SUGENO,
107
+ FuzzyOWL2Keyword.QUASI_SUGENO,
108
+ ):
109
+ weights: list[float] = [
110
+ float(weight.text)
111
+ for weight in child.find(
112
+ FuzzyOWL2Keyword.WEIGHTS.get_tag_name()
113
+ ).findall(FuzzyOWL2Keyword.WEIGHT.get_tag_name())
114
+ ]
115
+ concepts: list[str] = [
116
+ name.text
117
+ for name in child.find(
118
+ FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()
119
+ ).findall(FuzzyOWL2Keyword.NAME.get_tag_name())
120
+ ]
121
+ if concept_type == FuzzyOWL2Keyword.OWA:
122
+ return OwaConcept(weights, concepts)
123
+ elif concept_type == FuzzyOWL2Keyword.CHOQUET:
124
+ return ChoquetConcept(weights, concepts)
125
+ elif concept_type == FuzzyOWL2Keyword.SUGENO:
126
+ return SugenoConcept(weights, concepts)
127
+ elif concept_type == FuzzyOWL2Keyword.QUASI_SUGENO:
128
+ return QsugenoConcept(weights, concepts)
129
+ elif concept_type == FuzzyOWL2Keyword.Q_OWA:
130
+ quantifier = child.attrib.get(
131
+ FuzzyOWL2Keyword.QUANTIFIER.get_str_value()
132
+ )
133
+ concepts: list[str] = [
134
+ name.text
135
+ for name in child.find(
136
+ FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name()
137
+ ).findall(FuzzyOWL2Keyword.NAME.get_tag_name())
138
+ ]
139
+ return QowaConcept(quantifier, concepts)
140
+ elif concept_type == FuzzyOWL2Keyword.NOMINAL:
141
+ return FuzzyNominalConcept(
142
+ float(
143
+ child.attrib.get(FuzzyOWL2Keyword.DEGREE_DEF.get_str_value())
144
+ ),
145
+ child.attrib.get(FuzzyOWL2Keyword.INDIVIDUAL.get_str_value()),
146
+ )
147
+ elif annotation_type == FuzzyOWL2Keyword.DATATYPE:
148
+ child = root.find(FuzzyOWL2Keyword.DATATYPE.get_tag_name())
149
+ datatype_type = child.attrib.get(FuzzyOWL2Keyword.TYPE.get_str_value())
150
+
151
+ if datatype_type == FuzzyOWL2Keyword.LEFT_SHOULDER:
152
+ return LeftShoulderFunction(
153
+ float(child.attrib.get(FuzzyOWL2Keyword.A.get_str_value())),
154
+ float(child.attrib.get(FuzzyOWL2Keyword.B.get_str_value())),
155
+ )
156
+ elif datatype_type == FuzzyOWL2Keyword.RIGHT_SHOULDER:
157
+ return RightShoulderFunction(
158
+ float(child.attrib.get(FuzzyOWL2Keyword.A.get_str_value())),
159
+ float(child.attrib.get(FuzzyOWL2Keyword.B.get_str_value())),
160
+ )
161
+ elif datatype_type == FuzzyOWL2Keyword.LINEAR:
162
+ return LinearFunction(
163
+ float(child.attrib.get(FuzzyOWL2Keyword.A.get_str_value())),
164
+ float(child.attrib.get(FuzzyOWL2Keyword.B.get_str_value())),
165
+ )
166
+ elif datatype_type == FuzzyOWL2Keyword.TRIANGULAR:
167
+ return TriangularFunction(
168
+ float(child.attrib.get(FuzzyOWL2Keyword.A.get_str_value())),
169
+ float(child.attrib.get(FuzzyOWL2Keyword.B.get_str_value())),
170
+ float(child.attrib.get(FuzzyOWL2Keyword.C.get_str_value())),
171
+ )
172
+ elif datatype_type == FuzzyOWL2Keyword.TRAPEZOIDAL:
173
+ return TrapezoidalFunction(
174
+ float(child.attrib.get(FuzzyOWL2Keyword.A.get_str_value())),
175
+ float(child.attrib.get(FuzzyOWL2Keyword.B.get_str_value())),
176
+ float(child.attrib.get(FuzzyOWL2Keyword.C.get_str_value())),
177
+ float(child.attrib.get(FuzzyOWL2Keyword.D.get_str_value())),
178
+ )
179
+ elif annotation_type == FuzzyOWL2Keyword.MODIFIER:
180
+ child = root.find(FuzzyOWL2Keyword.MODIFIER.get_tag_name())
181
+ mod_type = child.attrib.get(FuzzyOWL2Keyword.TYPE.get_str_value())
182
+ if mod_type == FuzzyOWL2Keyword.LINEAR:
183
+ return LinearModifier(
184
+ float(child.attrib.get(FuzzyOWL2Keyword.C.get_str_value())),
185
+ )
186
+ elif mod_type == FuzzyOWL2Keyword.TRIANGULAR:
187
+ return TriangularModifier(
188
+ float(child.attrib.get(FuzzyOWL2Keyword.A.get_str_value())),
189
+ float(child.attrib.get(FuzzyOWL2Keyword.B.get_str_value())),
190
+ float(child.attrib.get(FuzzyOWL2Keyword.C.get_str_value())),
191
+ )
192
+ elif annotation_type == FuzzyOWL2Keyword.AXIOM:
193
+ child = root.find(FuzzyOWL2Keyword.DEGREE_DEF.get_tag_name())
194
+ return float(
195
+ child.attrib.get(FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value())
196
+ )
197
+ elif annotation_type == FuzzyOWL2Keyword.ONTOLOGY:
198
+ child = root.find(FuzzyOWL2Keyword.FUZZY_LOGIC.get_tag_name())
199
+ return child.attrib.get(FuzzyOWL2Keyword.LOGIC.get_str_value())
200
+ elif annotation_type == FuzzyOWL2Keyword.ROLE:
201
+ child = root.find(FuzzyOWL2Keyword.ROLE.get_tag_name())
202
+ assert (
203
+ child.attrib.get(FuzzyOWL2Keyword.TYPE.get_str_value())
204
+ == FuzzyOWL2Keyword.MODIFIED
205
+ )
206
+ return ModifiedProperty(
207
+ child.attrib.get(FuzzyOWL2Keyword.MODIFIER.get_str_value()),
208
+ child.attrib.get(FuzzyOWL2Keyword.BASE.get_str_value()),
209
+ )
210
+ else:
211
+ raise ValueError
212
+
213
+ @staticmethod
214
+ def load_config(*args) -> None:
215
+ ConfigReader.load_parameters(os.path.join(os.getcwd(), "CONFIG.ini"), args)
216
+
217
+ @staticmethod
218
+ def main(annotation: str, *args) -> typing.Any:
219
+ try:
220
+ FuzzyOwl2XMLParser.load_config(*args)
221
+ return FuzzyOwl2XMLParser.parse_string(annotation)
222
+ except FileNotFoundError as e:
223
+ Util.error(f"Error: File {args[0]} not found.")
224
+ except Exception as e:
225
+ Util.error(e)
226
+ Util.error(traceback.format_exc())
@@ -1 +1,2 @@
1
+ from .fuzzy_xml import *
1
2
  from .constants import *
@@ -26,63 +26,149 @@ class ConceptType(enum.StrEnum):
26
26
  return self.name
27
27
 
28
28
 
29
+ # class FuzzyOWL2Keyword(enum.Enum):
30
+ # OPEN_TAG = pp.Word("<")
31
+ # CLOSE_TAG = pp.Word(">")
32
+ # SINGLE_CLOSE_TAG = pp.Word("/>")
33
+ # SLASH = pp.Word("/")
34
+ # ONTOLOGY = pp.CaselessKeyword("ontology")
35
+ # FUZZY_OWL_2 = pp.CaselessKeyword("fuzzyOwl2")
36
+ # FUZZY_LABEL = pp.CaselessKeyword("fuzzyLabel")
37
+ # FUZZY_TYPE = pp.CaselessKeyword("fuzzytype")
38
+ # FUZZY_LOGIC = pp.CaselessKeyword("FuzzyLogic")
39
+ # TYPE = pp.CaselessKeyword("type")
40
+ # LOGIC = pp.CaselessKeyword("logic")
41
+ # DATATYPE = pp.CaselessKeyword("datatype")
42
+ # CONCEPT = pp.CaselessKeyword("concept")
43
+ # ROLE = pp.CaselessKeyword("role")
44
+ # AXIOM = pp.CaselessKeyword("axiom")
45
+ # DEGREE_DEF = pp.CaselessKeyword("degree")
46
+ # DEGREE_VALUE = pp.CaselessKeyword("value")
47
+ # MODIFIED = pp.CaselessKeyword("modified")
48
+ # WEIGHTED = pp.CaselessKeyword("weighted")
49
+ # NOMINAL = pp.CaselessKeyword("nominal")
50
+ # INDIVIDUAL = pp.CaselessKeyword("individual")
51
+ # WEIGHTED_MAXIMUM = pp.CaselessKeyword("weightedMaximum")
52
+ # WEIGHTED_MINIMUM = pp.CaselessKeyword("weightedMinimum")
53
+ # WEIGHTED_SUM = pp.CaselessKeyword("weightedSum")
54
+ # WEIGHTED_SUMZERO = pp.CaselessKeyword("weightedSumZero")
55
+ # OWA = pp.CaselessKeyword("owa")
56
+ # Q_OWA = pp.CaselessKeyword("qowa")
57
+ # CHOQUET = pp.CaselessKeyword("choquet")
58
+ # SUGENO = pp.CaselessKeyword("sugeno")
59
+ # QUASI_SUGENO = pp.CaselessKeyword("quasisugeno")
60
+ # MODIFIER = pp.CaselessKeyword("modifier")
61
+ # BASE = pp.CaselessKeyword("base")
62
+ # CONCEPT_NAMES = pp.CaselessKeyword("names")
63
+ # NAME = pp.CaselessKeyword("name")
64
+ # WEIGHT = pp.CaselessKeyword("weight")
65
+ # WEIGHTS = pp.CaselessKeyword("weights")
66
+ # QUANTIFIER = pp.CaselessKeyword("quantifier")
67
+ # CRISP = pp.CaselessKeyword("crisp")
68
+ # LEFT_SHOULDER = pp.CaselessKeyword("leftshoulder")
69
+ # RIGHT_SHOULDER = pp.CaselessKeyword("rightshoulder")
70
+ # TRIANGULAR = pp.CaselessKeyword("triangular")
71
+ # TRAPEZOIDAL = pp.CaselessKeyword("trapezoidal")
72
+ # LINEAR = pp.CaselessKeyword("linear")
73
+ # A = pp.CaselessKeyword("a")
74
+ # B = pp.CaselessKeyword("b")
75
+ # C = pp.CaselessKeyword("c")
76
+ # D = pp.CaselessKeyword("d")
77
+ # LUKASIEWICZ = pp.CaselessKeyword("lukasiewicz")
78
+ # GOEDEL = pp.CaselessKeyword("goedel")
79
+ # ZADEH = pp.CaselessKeyword("zadeh")
80
+ # PRODUCT = pp.CaselessKeyword("product")
81
+ # EQUAL = pp.Word("=")
82
+ # LES = pp.CaselessKeyword("les")
83
+ # LEQ = pp.CaselessKeyword("leq")
84
+ # GEQ = pp.CaselessKeyword("geq")
85
+ # GRE = pp.CaselessKeyword("gre")
86
+
87
+ # def get_name(self) -> str:
88
+ # return re.sub(r"[\"\']+", "", self.value.name.lower())
89
+
90
+ # def get_value(self) -> typing.Union[pp.CaselessKeyword, pp.Word]:
91
+ # return self.value
92
+
93
+ # def get_str_value(self) -> str:
94
+ # return str(self.value).replace('"', "").replace("'", "")
95
+
96
+ # def get_tag_name(self) -> str:
97
+ # return self.get_str_value().capitalize()
98
+
99
+ # def __eq__(self, value: object) -> bool:
100
+ # if isinstance(value, str):
101
+ # return self.get_name() == value.lower()
102
+ # elif isinstance(value, pp.CaselessKeyword):
103
+ # return self.get_name() == value.name.lower()
104
+ # elif isinstance(value, FuzzyOWL2Keyword):
105
+ # return self.get_name() == value.get_name()
106
+ # raise NotImplementedError
107
+
108
+ # def __repr__(self) -> str:
109
+ # return self.name
110
+
111
+ # def __str__(self) -> str:
112
+ # return self.name
113
+
114
+
29
115
  class FuzzyOWL2Keyword(enum.Enum):
30
116
  OPEN_TAG = pp.Word("<")
31
117
  CLOSE_TAG = pp.Word(">")
32
118
  SINGLE_CLOSE_TAG = pp.Word("/>")
33
119
  SLASH = pp.Word("/")
34
- ONTOLOGY = pp.CaselessKeyword("ontology")
35
- FUZZY_OWL_2 = pp.CaselessKeyword("fuzzyOwl2")
36
- FUZZY_LABEL = pp.CaselessKeyword("fuzzyLabel")
37
- FUZZY_TYPE = pp.CaselessKeyword("fuzzytype")
38
- FUZZY_LOGIC = pp.CaselessKeyword("FuzzyLogic")
39
- TYPE = pp.CaselessKeyword("type")
40
- LOGIC = pp.CaselessKeyword("logic")
41
- DATATYPE = pp.CaselessKeyword("datatype")
42
- CONCEPT = pp.CaselessKeyword("concept")
43
- ROLE = pp.CaselessKeyword("role")
44
- AXIOM = pp.CaselessKeyword("axiom")
45
- DEGREE_DEF = pp.CaselessKeyword("degree")
46
- DEGREE_VALUE = pp.CaselessKeyword("value")
47
- MODIFIED = pp.CaselessKeyword("modified")
48
- WEIGHTED = pp.CaselessKeyword("weighted")
49
- NOMINAL = pp.CaselessKeyword("nominal")
50
- INDIVIDUAL = pp.CaselessKeyword("individual")
51
- WEIGHTED_MAXIMUM = pp.CaselessKeyword("weightedMaximum")
52
- WEIGHTED_MINIMUM = pp.CaselessKeyword("weightedMinimum")
53
- WEIGHTED_SUM = pp.CaselessKeyword("weightedSum")
54
- WEIGHTED_SUMZERO = pp.CaselessKeyword("weightedSumZero")
55
- OWA = pp.CaselessKeyword("owa")
56
- Q_OWA = pp.CaselessKeyword("qowa")
57
- CHOQUET = pp.CaselessKeyword("choquet")
58
- SUGENO = pp.CaselessKeyword("sugeno")
59
- QUASI_SUGENO = pp.CaselessKeyword("quasisugeno")
60
- MODIFIER = pp.CaselessKeyword("modifier")
61
- BASE = pp.CaselessKeyword("base")
62
- CONCEPT_NAMES = pp.CaselessKeyword("names")
63
- NAME = pp.CaselessKeyword("name")
64
- WEIGHT = pp.CaselessKeyword("weight")
65
- WEIGHTS = pp.CaselessKeyword("weights")
66
- QUANTIFIER = pp.CaselessKeyword("quantifier")
67
- CRISP = pp.CaselessKeyword("crisp")
68
- LEFT_SHOULDER = pp.CaselessKeyword("leftshoulder")
69
- RIGHT_SHOULDER = pp.CaselessKeyword("rightshoulder")
70
- TRIANGULAR = pp.CaselessKeyword("triangular")
71
- TRAPEZOIDAL = pp.CaselessKeyword("trapezoidal")
72
- LINEAR = pp.CaselessKeyword("linear")
73
- A = pp.CaselessKeyword("a")
74
- B = pp.CaselessKeyword("b")
75
- C = pp.CaselessKeyword("c")
76
- D = pp.CaselessKeyword("d")
77
- LUKASIEWICZ = pp.CaselessKeyword("lukasiewicz")
78
- GOEDEL = pp.CaselessKeyword("goedel")
79
- ZADEH = pp.CaselessKeyword("zadeh")
80
- PRODUCT = pp.CaselessKeyword("product")
120
+ ONTOLOGY = pp.Keyword("ontology")
121
+ FUZZY_OWL_2 = pp.Keyword("fuzzyOwl2")
122
+ FUZZY_LABEL = pp.Keyword("fuzzyLabel")
123
+ FUZZY_TYPE = pp.Keyword("fuzzyType")
124
+ FUZZY_LOGIC = pp.Keyword("FuzzyLogic")
125
+ TYPE = pp.Keyword("type")
126
+ LOGIC = pp.Keyword("logic")
127
+ DATATYPE = pp.Keyword("datatype")
128
+ CONCEPT = pp.Keyword("concept")
129
+ ROLE = pp.Keyword("role")
130
+ AXIOM = pp.Keyword("axiom")
131
+ DEGREE_DEF = pp.Keyword("degree")
132
+ DEGREE_VALUE = pp.Keyword("value")
133
+ MODIFIED = pp.Keyword("modified")
134
+ WEIGHTED = pp.Keyword("weighted")
135
+ NOMINAL = pp.Keyword("nominal")
136
+ INDIVIDUAL = pp.Keyword("individual")
137
+ WEIGHTED_MAXIMUM = pp.Keyword("weightedMaximum")
138
+ WEIGHTED_MINIMUM = pp.Keyword("weightedMinimum")
139
+ WEIGHTED_SUM = pp.Keyword("weightedSum")
140
+ WEIGHTED_SUMZERO = pp.Keyword("weightedSumZero")
141
+ OWA = pp.Keyword("owa")
142
+ Q_OWA = pp.Keyword("qowa")
143
+ CHOQUET = pp.Keyword("choquet")
144
+ SUGENO = pp.Keyword("sugeno")
145
+ QUASI_SUGENO = pp.Keyword("quasisugeno")
146
+ MODIFIER = pp.Keyword("modifier")
147
+ BASE = pp.Keyword("base")
148
+ CONCEPT_NAMES = pp.Keyword("names")
149
+ NAME = pp.Keyword("name")
150
+ WEIGHT = pp.Keyword("weight")
151
+ WEIGHTS = pp.Keyword("weights")
152
+ QUANTIFIER = pp.Keyword("quantifier")
153
+ CRISP = pp.Keyword("crisp")
154
+ LEFT_SHOULDER = pp.Keyword("leftshoulder")
155
+ RIGHT_SHOULDER = pp.Keyword("rightshoulder")
156
+ TRIANGULAR = pp.Keyword("triangular")
157
+ TRAPEZOIDAL = pp.Keyword("trapezoidal")
158
+ LINEAR = pp.Keyword("linear")
159
+ A = pp.Keyword("a")
160
+ B = pp.Keyword("b")
161
+ C = pp.Keyword("c")
162
+ D = pp.Keyword("d")
163
+ LUKASIEWICZ = pp.Keyword("lukasiewicz")
164
+ GOEDEL = pp.Keyword("goedel")
165
+ ZADEH = pp.Keyword("zadeh")
166
+ PRODUCT = pp.Keyword("product")
81
167
  EQUAL = pp.Word("=")
82
- LES = pp.CaselessKeyword("les")
83
- LEQ = pp.CaselessKeyword("leq")
84
- GEQ = pp.CaselessKeyword("geq")
85
- GRE = pp.CaselessKeyword("gre")
168
+ LES = pp.Keyword("les")
169
+ LEQ = pp.Keyword("leq")
170
+ GEQ = pp.Keyword("geq")
171
+ GRE = pp.Keyword("gre")
86
172
 
87
173
  def get_name(self) -> str:
88
174
  return re.sub(r"[\"\']+", "", self.value.name.lower())
@@ -99,7 +185,7 @@ class FuzzyOWL2Keyword(enum.Enum):
99
185
  def __eq__(self, value: object) -> bool:
100
186
  if isinstance(value, str):
101
187
  return self.get_name() == value.lower()
102
- elif isinstance(value, pp.CaselessKeyword):
188
+ elif isinstance(value, pp.Keyword):
103
189
  return self.get_name() == value.name.lower()
104
190
  elif isinstance(value, FuzzyOWL2Keyword):
105
191
  return self.get_name() == value.get_name()
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ import typing
5
+ from xml.dom import minidom
6
+ from xml.etree.ElementTree import Element, tostring
7
+
8
+ from fuzzy_dl_owl2.fuzzyowl2.util.constants import FuzzyOWL2Keyword
9
+ from pyowl2.abstracts.class_expression import OWLClassExpression
10
+
11
+
12
+ class FuzzyXML(object):
13
+
14
+ @staticmethod
15
+ def build_main_xml(fuzzy_type: str) -> Element:
16
+ return Element(
17
+ FuzzyOWL2Keyword.FUZZY_OWL_2.get_str_value(),
18
+ attrib={FuzzyOWL2Keyword.FUZZY_TYPE.get_str_value(): fuzzy_type},
19
+ )
20
+
21
+ @staticmethod
22
+ def build_logic_xml(logic: str, attrib: dict[str, str] = dict()) -> Element:
23
+ full_attrib = {FuzzyOWL2Keyword.LOGIC.get_str_value(): logic}
24
+ if attrib:
25
+ full_attrib.update(attrib)
26
+ return Element(
27
+ FuzzyOWL2Keyword.FUZZY_LOGIC.get_tag_name(),
28
+ attrib=full_attrib,
29
+ )
30
+
31
+ @staticmethod
32
+ def build_datatype_xml(
33
+ datatype_type: str, attrib: dict[str, str] = dict()
34
+ ) -> Element:
35
+ full_attrib = {FuzzyOWL2Keyword.TYPE.get_str_value(): datatype_type}
36
+ if attrib:
37
+ full_attrib.update(attrib)
38
+ return Element(
39
+ FuzzyOWL2Keyword.DATATYPE.get_tag_name(),
40
+ attrib=full_attrib,
41
+ )
42
+
43
+ @staticmethod
44
+ def build_modifier_xml(
45
+ modifier_type: str, attrib: dict[str, str] = dict()
46
+ ) -> Element:
47
+ full_attrib = {FuzzyOWL2Keyword.TYPE.get_str_value(): modifier_type}
48
+ if attrib:
49
+ full_attrib.update(attrib)
50
+ return Element(
51
+ FuzzyOWL2Keyword.MODIFIER.get_tag_name(),
52
+ attrib=full_attrib,
53
+ )
54
+
55
+ @staticmethod
56
+ def build_degree_xml(
57
+ value: typing.Union[int, float], attrib: dict[str, str] = dict()
58
+ ) -> Element:
59
+ full_attrib = {FuzzyOWL2Keyword.DEGREE_VALUE.get_str_value(): str(value)}
60
+ if attrib:
61
+ full_attrib.update(attrib)
62
+ return Element(
63
+ FuzzyOWL2Keyword.DEGREE_DEF.get_tag_name(),
64
+ attrib=full_attrib,
65
+ )
66
+
67
+ @staticmethod
68
+ def build_concept_xml(
69
+ concept_type: str, attrib: dict[str, str] = dict()
70
+ ) -> Element:
71
+ full_attrib = {FuzzyOWL2Keyword.TYPE.get_str_value(): concept_type}
72
+ if attrib:
73
+ full_attrib.update(attrib)
74
+ return Element(
75
+ FuzzyOWL2Keyword.CONCEPT.get_tag_name(),
76
+ attrib=full_attrib,
77
+ )
78
+
79
+ @staticmethod
80
+ def build_weights_xml(weights: list[float]) -> Element:
81
+ element = Element(FuzzyOWL2Keyword.WEIGHTS.get_tag_name())
82
+ for w in weights:
83
+ curr = Element(FuzzyOWL2Keyword.WEIGHT.get_tag_name())
84
+ curr.text = str(w)
85
+ element.append(curr)
86
+ return element
87
+
88
+ @staticmethod
89
+ def build_names_xml(concepts: list[OWLClassExpression]) -> Element:
90
+ element = Element(FuzzyOWL2Keyword.CONCEPT_NAMES.get_tag_name())
91
+ for c in concepts:
92
+ curr = Element(FuzzyOWL2Keyword.NAME.get_tag_name())
93
+ curr.text = str(c)
94
+ element.append(curr)
95
+ return element
96
+
97
+ @staticmethod
98
+ def to_str(element: Element) -> str:
99
+ return re.sub(
100
+ "\n+",
101
+ "\n",
102
+ "\n".join(
103
+ minidom.parseString(tostring(element, encoding="unicode", method="xml"))
104
+ .toprettyxml()
105
+ .split("\n")[1:]
106
+ ),
107
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fuzzy-dl-owl2
3
- Version: 1.0.5
3
+ Version: 1.0.6
4
4
  Summary: A python porting of the Fuzzy Description Language (see https://www.umbertostraccia.it/cs/software/fuzzyDL/fuzzyDL.html) and the Fuzzy OWL 2 framework (see https://www.umbertostraccia.it/cs/software/FuzzyOWL/index.html).
5
5
  License: CC-BY-SA-4.0
6
6
  Author: Giuseppe Filippone
@@ -62,7 +62,7 @@ fuzzy_dl_owl2/fuzzydl/exception/__init__.py,sha256=IoYY5IQoU4UYyoB-dFOVLZyDvJN20
62
62
  fuzzy_dl_owl2/fuzzydl/exception/fuzzy_ontology_exception.py,sha256=eH1ybBCx1QoZaf8PLCq1rC_3tiBRA-gKCwECTcUUuro,122
63
63
  fuzzy_dl_owl2/fuzzydl/exception/inconsistent_ontology_exception.py,sha256=ez0RQN4KGlNRcfB7IXfPz3bM86CFLl6zo-RRTBRpa_o,129
64
64
  fuzzy_dl_owl2/fuzzydl/feature_function.py,sha256=KSQvCSYfJK5N6FFfDlyS1Y7UPHSYZNXzdYYZMWzXF8U,6399
65
- fuzzy_dl_owl2/fuzzydl/fuzzydl_to_owl2.py,sha256=BUt-LUHW9VPtUNT74zPblgbClwuQL8_HN6gXMQ2_X8k,46670
65
+ fuzzy_dl_owl2/fuzzydl/fuzzydl_to_owl2.py,sha256=aqFuf7xH7_5fJL57RlLhN2tzpQEX8i6LzlTmKRAkZak,53023
66
66
  fuzzy_dl_owl2/fuzzydl/general_concept_inclusion.py,sha256=Noom35WAeJosPrliGd9_gvEtcK4BthazsSuZH-cxfyU,2380
67
67
  fuzzy_dl_owl2/fuzzydl/individual/__init__.py,sha256=zBCa24kE2nv08VgtphjLshpbGNEARUJgCdtyv9r6JGc,110
68
68
  fuzzy_dl_owl2/fuzzydl/individual/created_individual.py,sha256=HOo_UXjPPPtm7B0a7k90kE1veuR9gOCK5hp2f_aaJnY,7653
@@ -117,13 +117,13 @@ fuzzy_dl_owl2/fuzzydl/restriction/__init__.py,sha256=rpjzuQK3xxYYA3WeXFDdIK9tXbU
117
117
  fuzzy_dl_owl2/fuzzydl/restriction/has_value_restriction.py,sha256=DL-50TlD289OXVEEh_tK9Cu0ceP0ANmH-Q3k0oRe5ok,554
118
118
  fuzzy_dl_owl2/fuzzydl/restriction/restriction.py,sha256=SyeFvaJeKcTe750eAbLoAVYkWTK_UjdqWr2Lw8OF1S0,948
119
119
  fuzzy_dl_owl2/fuzzydl/role_parent_with_degree.py,sha256=1J5dtlVbiascxHBwAJ7uc97IHnJke9RWqxq5rgrrkoA,282
120
- fuzzy_dl_owl2/fuzzydl/util/__init__.py,sha256=44tug6cK4CwfOR865-q1FOVN34TEDzfLlaevh5YMiGo,84
120
+ fuzzy_dl_owl2/fuzzydl/util/__init__.py,sha256=3GufSMUuWGISGukXM5T5ZGA0BC1WX-5eLFSuttVYueU,109
121
121
  fuzzy_dl_owl2/fuzzydl/util/config_reader.py,sha256=8kyrfK-wQaiGrKfrLsiVr77jg1NRaviGniWOtQwrZRU,1797
122
122
  fuzzy_dl_owl2/fuzzydl/util/constants.py,sha256=_BM9maPkVPzz-GjWjVHjPEtNOA72c5R4qjP9w-2bAdQ,12817
123
123
  fuzzy_dl_owl2/fuzzydl/util/util.py,sha256=5COC79TAJz8fNrRzXLbNpAT9rLd_0KrRI1OU-hob3oU,1903
124
124
  fuzzy_dl_owl2/fuzzydl/util/utils.py,sha256=TPVLEL9NJXgReuxEIOTEOVYqojSymg_-kyrLETXnYdo,2344
125
125
  fuzzy_dl_owl2/fuzzyowl2/__init__.py,sha256=C44P0-Sn35FQdVMqYLzeDWa5qPmokbcs8GPiD_zQaSg,153
126
- fuzzy_dl_owl2/fuzzyowl2/fuzzyowl2.py,sha256=EAC_DXYa694h3pUZ9T_4Y_f60DjzPUs4VqIGbpLY5vo,71402
126
+ fuzzy_dl_owl2/fuzzyowl2/fuzzyowl2.py,sha256=5nMIJfNxes5OXyGJxFkdG5VIueOUaK-5TNN4KMLeESk,71603
127
127
  fuzzy_dl_owl2/fuzzyowl2/fuzzyowl2_to_fuzzydl.py,sha256=egspxTzY4kNvhsQLP0AAaqJgFUqyO6VJuXLLOej06PA,36994
128
128
  fuzzy_dl_owl2/fuzzyowl2/owl_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
129
  fuzzy_dl_owl2/fuzzyowl2/owl_types/choquet_concept.py,sha256=ymnyNfvkvWA3y2UMXyPviD0U98vJ6jrX6zddj09SUoI,671
@@ -137,7 +137,7 @@ fuzzy_dl_owl2/fuzzyowl2/owl_types/linear_function.py,sha256=3MZR09E0AhUTEHQZY_RU
137
137
  fuzzy_dl_owl2/fuzzyowl2/owl_types/linear_modifier.py,sha256=CIm4rlSuvcI9dqLscASFHexjHKcJ06Wg3fZy__tw7H4,340
138
138
  fuzzy_dl_owl2/fuzzyowl2/owl_types/modified_concept.py,sha256=JdjSemKb-mnVtVQhHnk_OAU8cvB3YRRmmEF0DLrtdXk,555
139
139
  fuzzy_dl_owl2/fuzzyowl2/owl_types/modified_function.py,sha256=3_GFKWMU4YrPrMC7bhEm7GDUKtCko8H5wx2dpGdXGZc,428
140
- fuzzy_dl_owl2/fuzzyowl2/owl_types/modified_property.py,sha256=uA7PlBGCbHcrjqYHIDWgsIvI_x3dpzTEJKtEfNRivwA,384
140
+ fuzzy_dl_owl2/fuzzyowl2/owl_types/modified_property.py,sha256=d94ZQRWJ_BoH0lvM_XuwexeAlQGDZDB6Lq0WaO9acaQ,545
141
141
  fuzzy_dl_owl2/fuzzyowl2/owl_types/owa_concept.py,sha256=rQNp8zSQ-tQYwcJsc3sCVhG1chtZ7Ev1MumSBOPbOwI,659
142
142
  fuzzy_dl_owl2/fuzzyowl2/owl_types/property_definition.py,sha256=5NZd22GcaPQKCrIZwCGzPgx1M5h41A3tH9qKI_m2WVc,268
143
143
  fuzzy_dl_owl2/fuzzyowl2/owl_types/qowa_concept.py,sha256=yfErtkNIWWW-QUgA4T6F7tL-sCPC0GXYYkR2xT8LHKk,598
@@ -152,11 +152,13 @@ fuzzy_dl_owl2/fuzzyowl2/owl_types/weighted_max_concept.py,sha256=NEIshfx9h4XyvfO
152
152
  fuzzy_dl_owl2/fuzzyowl2/owl_types/weighted_min_concept.py,sha256=_sEao87lwH2fKspVR_NrpilFwuI6g25E1mNDI55dtYk,510
153
153
  fuzzy_dl_owl2/fuzzyowl2/owl_types/weighted_sum_concept.py,sha256=TrX3-M-LrG-5XgEo6LY8JESZpYwcaIX4rOCU8wfWE4k,510
154
154
  fuzzy_dl_owl2/fuzzyowl2/owl_types/weighted_sum_zero_concept.py,sha256=OJW8-ZJXvYTFHrqC8hpVBTY6SwLCTTIe72MSAO3H7hk,524
155
- fuzzy_dl_owl2/fuzzyowl2/parser/__init__.py,sha256=fKaME_uuWyG5UB7VKD-nMV-j95lC1jWV6E6vD59yM4M,27
156
- fuzzy_dl_owl2/fuzzyowl2/parser/owl2_parser.py,sha256=wSE5FBCfv3t-XePJ9Pzyr_EVFTPWtMrtMyqHNgKd9aw,20052
157
- fuzzy_dl_owl2/fuzzyowl2/util/__init__.py,sha256=81quoggCuIypZjZs3bbf1Ty70KHdva5RGEJxi0oC57E,25
158
- fuzzy_dl_owl2/fuzzyowl2/util/constants.py,sha256=05eQLYTB4CxxUZ_T-sNG9FsH8hkrBMAh2y24oiQN8xY,3904
159
- fuzzy_dl_owl2-1.0.5.dist-info/LICENSE,sha256=er4Z7Ju3OzYUG5mbhh0krYVegIuv4PgehMzihVb2wpc,20131
160
- fuzzy_dl_owl2-1.0.5.dist-info/METADATA,sha256=uPCNsrud2pSsRiLl4hydpRIAehnILDZcLgZF3iLs3y4,13057
161
- fuzzy_dl_owl2-1.0.5.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
162
- fuzzy_dl_owl2-1.0.5.dist-info/RECORD,,
155
+ fuzzy_dl_owl2/fuzzyowl2/parser/__init__.py,sha256=HjRhpobpAAB569symjAAoN98RVIqo0P6KtsVLDxC3Ok,60
156
+ fuzzy_dl_owl2/fuzzyowl2/parser/owl2_parser.py,sha256=6rwMT_dGaaaKZQRotGiidbwqCOpLuPkyXaHXGQ5CV1k,20068
157
+ fuzzy_dl_owl2/fuzzyowl2/parser/owl2_xml_parser.py,sha256=qbx6SsrYUdDOn1-qClq-0ECIZ24MKPJCeAuvl6rwk_s,11234
158
+ fuzzy_dl_owl2/fuzzyowl2/util/__init__.py,sha256=4qG4CwkdYoT0vh3uX9N8DlmXh4QfKimVUqR4h2DR8Gg,50
159
+ fuzzy_dl_owl2/fuzzyowl2/util/constants.py,sha256=Oev5Q-H4mhmdvV3nrp0fZKZx8jpo9beXjJwm0dfDUSc,6970
160
+ fuzzy_dl_owl2/fuzzyowl2/util/fuzzy_xml.py,sha256=iYAodtBkZYt3cOvMBA0VEMOU87ljb-06_aUfH14gvwE,3416
161
+ fuzzy_dl_owl2-1.0.6.dist-info/LICENSE,sha256=er4Z7Ju3OzYUG5mbhh0krYVegIuv4PgehMzihVb2wpc,20131
162
+ fuzzy_dl_owl2-1.0.6.dist-info/METADATA,sha256=BjS_oE4GrApDHsEvGzus0rGZ6yXtLmf_U3ZmBa9VVe8,13057
163
+ fuzzy_dl_owl2-1.0.6.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
164
+ fuzzy_dl_owl2-1.0.6.dist-info/RECORD,,