owlish/owl/
axiom.rs

1use serde::{Deserialize, Serialize};
2
3use crate::owl::*;
4
5#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
6pub enum Axiom {
7    // Annotations
8    AnnotationAssertion(AnnotationAssertion),
9    AnnotationPropertyRange(AnnotationPropertyRange),
10    AnnotationPropertyDomain(AnnotationPropertyDomain),
11    // Properties
12    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    // Classes
32    SubClassOf(SubClassOf),
33    EquivalentClasses(EquivalentClasses),
34    DisjointClasses(DisjointClasses),
35    // Datatypes
36    DatatypeDefinition(DatatypeDefinition),
37    // Individuals
38    ClassAssertion(ClassAssertion),
39    SameIndividual(SameIndividual),
40    DifferentIndividuals(DifferentIndividuals),
41    // ObjectProperties
42    ObjectPropertyAssertion(ObjectPropertyAssertion),
43    NegativeObjectPropertyAssertion(NegativeObjectPropertyAssertion),
44    // DataProperties
45    DataPropertyAssertion(DataPropertyAssertion),
46    NegativeDataPropertyAssertion(NegativeDataPropertyAssertion),
47    // Other
48    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                // TODO: This seems like it could be a source for confusion (silently not having a subject if it's a BlankNode
95                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}