1use serde::{Deserialize, Serialize};
2
3use crate::owl::*;
4
5#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
6pub enum Axiom {
7 AnnotationAssertion(AnnotationAssertion),
9 AnnotationPropertyRange(AnnotationPropertyRange),
10 AnnotationPropertyDomain(AnnotationPropertyDomain),
11 SubObjectPropertyOf(SubObjectPropertyOf),
13 SubDataPropertyOf(SubDataPropertyOf),
14 SubAnnotationPropertyOf(SubAnnotationPropertyOf),
15 EquivalentObjectProperties(EquivalentObjectProperties),
16 EquivalentDataProperties(EquivalentDataProperties),
17 InverseObjectProperties(InverseObjectProperties),
18 DisjointObjectProperties(DisjointObjectProperties),
19 ObjectPropertyDomain(ObjectPropertyDomain),
20 ObjectPropertyRange(ObjectPropertyRange),
21 DataPropertyDomain(DataPropertyDomain),
22 DataPropertyRange(DataPropertyRange),
23 SymmetricObjectProperty(SymmetricObjectProperty),
24 AsymmetricObjectProperty(AsymmetricObjectProperty),
25 ReflexiveObjectProperty(ReflexiveObjectProperty),
26 IrreflexiveObjectProperty(IrreflexiveObjectProperty),
27 FunctionalObjectProperty(FunctionalObjectProperty),
28 InverseFunctionalObjectProperty(InverseFunctionalObjectProperty),
29 TransitiveObjectProperty(TransitiveObjectProperty),
30 FunctionalDataProperty(FunctionalDataProperty),
31 SubClassOf(SubClassOf),
33 EquivalentClasses(EquivalentClasses),
34 DisjointClasses(DisjointClasses),
35 DatatypeDefinition(DatatypeDefinition),
37 ClassAssertion(ClassAssertion),
39 SameIndividual(SameIndividual),
40 DifferentIndividuals(DifferentIndividuals),
41 ObjectPropertyAssertion(ObjectPropertyAssertion),
43 NegativeObjectPropertyAssertion(NegativeObjectPropertyAssertion),
44 DataPropertyAssertion(DataPropertyAssertion),
46 NegativeDataPropertyAssertion(NegativeDataPropertyAssertion),
47 HasKey(HasKey),
49}
50
51impl Axiom {
52 pub fn annotations_mut(&mut self) -> &mut Vec<Annotation> {
53 match self {
54 Axiom::AnnotationAssertion(a) => &mut a.annotations,
55 Axiom::AnnotationPropertyDomain(a) => &mut a.annotations,
56 Axiom::AnnotationPropertyRange(a) => &mut a.annotations,
57 Axiom::SubObjectPropertyOf(a) => &mut a.annotations,
58 Axiom::SubAnnotationPropertyOf(a) => &mut a.annotations,
59 Axiom::SubDataPropertyOf(a) => &mut a.annotations,
60 Axiom::EquivalentObjectProperties(a) => &mut a.annotations,
61 Axiom::EquivalentDataProperties(a) => &mut a.annotations,
62 Axiom::InverseObjectProperties(a) => &mut a.annotations,
63 Axiom::DisjointObjectProperties(a) => &mut a.annotations,
64 Axiom::ObjectPropertyDomain(a) => &mut a.annotations,
65 Axiom::ObjectPropertyRange(a) => &mut a.annotations,
66 Axiom::DataPropertyDomain(a) => &mut a.annotations,
67 Axiom::DataPropertyRange(a) => &mut a.annotations,
68 Axiom::SymmetricObjectProperty(a) => &mut a.annotations,
69 Axiom::AsymmetricObjectProperty(a) => &mut a.annotations,
70 Axiom::ReflexiveObjectProperty(a) => &mut a.annotations,
71 Axiom::IrreflexiveObjectProperty(a) => &mut a.annotations,
72 Axiom::FunctionalObjectProperty(a) => &mut a.annotations,
73 Axiom::InverseFunctionalObjectProperty(a) => &mut a.annotations,
74 Axiom::TransitiveObjectProperty(a) => &mut a.annotations,
75 Axiom::FunctionalDataProperty(a) => &mut a.annotations,
76 Axiom::SubClassOf(a) => &mut a.annotations,
77 Axiom::EquivalentClasses(a) => &mut a.annotations,
78 Axiom::DisjointClasses(a) => &mut a.annotations,
79 Axiom::DatatypeDefinition(a) => &mut a.annotations,
80 Axiom::ClassAssertion(a) => &mut a.annotations,
81 Axiom::SameIndividual(a) => &mut a.annotations,
82 Axiom::DifferentIndividuals(a) => &mut a.annotations,
83 Axiom::ObjectPropertyAssertion(a) => &mut a.annotations,
84 Axiom::NegativeObjectPropertyAssertion(a) => &mut a.annotations,
85 Axiom::DataPropertyAssertion(a) => &mut a.annotations,
86 Axiom::NegativeDataPropertyAssertion(a) => &mut a.annotations,
87 Axiom::HasKey(a) => &mut a.annotations,
88 }
89 }
90
91 pub fn subject(&self) -> Option<&IRI> {
92 match self {
93 Axiom::AnnotationAssertion(a) => {
94 match &a.subject {
96 ResourceId::IRI(iri_subject) => {
97 Some(&iri_subject)
98 }
99 ResourceId::BlankNode(_) => {None}
100 }
101 },
102 Axiom::AnnotationPropertyRange(a) => Some(a.iri.as_iri()),
103 Axiom::AnnotationPropertyDomain(a) => Some(a.iri.as_iri()),
104 Axiom::SubObjectPropertyOf(a) => match &a.object_property {
105 ObjectPropertyConstructor::IRI(iri) => Some(iri.as_iri()),
106 ObjectPropertyConstructor::ObjectInverseOf(_) => None,
107 ObjectPropertyConstructor::ObjectPropertyChain(_) => None,
108 },
109 Axiom::SubDataPropertyOf(a) => Some(a.subject_iri.as_iri()),
110 Axiom::SubAnnotationPropertyOf(a) => Some(a.subject_iri.as_iri()),
111 Axiom::EquivalentObjectProperties(a) => Some(a.object_property_iri_1.as_iri()),
112 Axiom::EquivalentDataProperties(a) => Some(a.data_property_iri_1.as_iri()),
113 Axiom::InverseObjectProperties(a) => Some(a.object_property_iri_1.as_iri()),
114 Axiom::DisjointObjectProperties(a) => Some(a.object_property_iri_1.as_iri()),
115 Axiom::ObjectPropertyDomain(a) => Some(a.iri.as_iri()),
116 Axiom::ObjectPropertyRange(a) => Some(a.iri.as_iri()),
117 Axiom::DataPropertyDomain(a) => Some(a.iri.as_iri()),
118 Axiom::DataPropertyRange(a) => Some(a.iri.as_iri()),
119 Axiom::SymmetricObjectProperty(a) => Some(a.object_property_iri.as_iri()),
120 Axiom::AsymmetricObjectProperty(a) => Some(a.object_property_iri.as_iri()),
121 Axiom::ReflexiveObjectProperty(a) => Some(a.object_property_iri.as_iri()),
122 Axiom::IrreflexiveObjectProperty(a) => Some(a.object_property_iri.as_iri()),
123 Axiom::FunctionalObjectProperty(a) => Some(a.object_property_iri.as_iri()),
124 Axiom::InverseFunctionalObjectProperty(a) => Some(a.object_property_iri.as_iri()),
125 Axiom::TransitiveObjectProperty(a) => Some(a.object_property_iri.as_iri()),
126 Axiom::FunctionalDataProperty(a) => Some(a.data_property_iri.as_iri()),
127 Axiom::SubClassOf(a) => match a.cls.as_ref() {
128 ClassConstructor::IRI(iri) => Some(iri.as_iri()),
129 _ => None,
130 },
131 Axiom::EquivalentClasses(a) => Some(a.class_iri.as_iri()),
132 Axiom::DisjointClasses(_) => None,
133 Axiom::DatatypeDefinition(a) => Some(a.data_property_iri.as_iri()),
134 Axiom::ClassAssertion(a) => Some(a.individual.as_iri()),
135 Axiom::SameIndividual(a) => Some(a.individual1.as_iri()),
136 Axiom::DifferentIndividuals(a) => Some(a.individual1.as_iri()),
137 Axiom::ObjectPropertyAssertion(a) => Some(a.subject.as_iri()),
138 Axiom::NegativeObjectPropertyAssertion(a) => Some(a.subject.as_iri()),
139 Axiom::DataPropertyAssertion(a) => Some(a.subject.as_iri()),
140 Axiom::NegativeDataPropertyAssertion(a) => Some(a.subject.as_iri()),
141 Axiom::HasKey(a) => Some(a.iri.as_iri()),
142 }
143 }
144}
145
146impl From<SubObjectPropertyOf> for Axiom {
147 fn from(s: SubObjectPropertyOf) -> Self {
148 Self::SubObjectPropertyOf(s)
149 }
150}
151
152impl From<SubAnnotationPropertyOf> for Axiom {
153 fn from(s: SubAnnotationPropertyOf) -> Self {
154 Self::SubAnnotationPropertyOf(s)
155 }
156}
157
158impl From<SubDataPropertyOf> for Axiom {
159 fn from(s: SubDataPropertyOf) -> Self {
160 Self::SubDataPropertyOf(s)
161 }
162}