AS.hs revision 75aaf82c430ad2a5cf159962b1c5c09255010fb4
ce5ff829db5f0bb4f16ad4de150eed4401d6acd5Christian Maeder{- |
ce5ff829db5f0bb4f16ad4de150eed4401d6acd5Christian MaederModule : $Header$
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaederCopyright : (c) C. Maeder
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian MaederLicense : GPLv2 or higher, see LICENSE.txt
ce5ff829db5f0bb4f16ad4de150eed4401d6acd5Christian Maeder
eca29a7be76eb73944ec19b06eda3d6a9e6e543dChristian MaederMaintainer : Christian.Maeder@dfki.de
ce5ff829db5f0bb4f16ad4de150eed4401d6acd5Christian MaederStability : provisional
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaederPortability : portable
ce5ff829db5f0bb4f16ad4de150eed4401d6acd5Christian Maeder
f3a94a197960e548ecd6520bb768cb0d547457bbChristian MaederCommon datatypes for the Functional and Manchester Syntaxes of OWL 2
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian MaederReferences:
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder <http://www.w3.org/TR/2009/REC-owl2-syntax-20091027/#Functional-Style_Syntax>
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder <http://www.w3.org/TR/owl2-manchester-syntax/>
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder-}
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maedermodule OWL2.AS where
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maederimport Common.Keywords
15c12a3ac049a4528da05b1017b78145f308aeb0Christian Maederimport Common.Id
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder
f353be6210f67ffd4a46967bba749afc968cee52Christian Maederimport OWL2.Keywords
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maederimport OWL2.ColonKeywords
15c12a3ac049a4528da05b1017b78145f308aeb0Christian Maederimport qualified Data.Map as Map
15c12a3ac049a4528da05b1017b78145f308aeb0Christian Maeder
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder{- | full or abbreviated IRIs with a possible uri for the prefix
15c12a3ac049a4528da05b1017b78145f308aeb0Christian Maeder or a local part following a hash sign -}
fc7df539e6d41b050161ed8f9ae6e444b1b5ab14Christian Maederdata QName = QN
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder { namePrefix :: String
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder -- ^ the name prefix part of a qualified name \"namePrefix:localPart\"
2b9022bd5dfb351d1d80f61680336effeccfa23eChristian Maeder , localPart :: String
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder -- ^ the local part of a qualified name \"namePrefix:localPart\"
d3bca27d616c5741d0b18776c8a0848ec31c87f4Christian Maeder , isFullIri :: Bool
2b9022bd5dfb351d1d80f61680336effeccfa23eChristian Maeder , expandedIRI :: String
cc8b603388a7deb7fb8045db0341f550f8be5844Christian Maeder -- ^ the associated namespace uri (not printed)
0df692ce8b9293499b2e1768458613a63e7b5cd0Christian Maeder , iriPos :: Range
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder } deriving Show
0df692ce8b9293499b2e1768458613a63e7b5cd0Christian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maederinstance GetRange QName where
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder getRange = iriPos
04dada28736b4a237745e92063d8bdd49a362debChristian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedershowQN :: QName -> String
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian MaedershowQN q = (if isFullIri q then showQI else showQU) q
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder-- | show QName as abbreviated iri
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedershowQU :: QName -> String
04dada28736b4a237745e92063d8bdd49a362debChristian MaedershowQU (QN pre local _ _ _) =
ce5ff829db5f0bb4f16ad4de150eed4401d6acd5Christian Maeder if null pre then local else pre ++ ":" ++ local
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder-- | show QName in ankle brackets as full iris
cf5149eb4d0faef6272231879c04aa740f5abc2bChristian MaedershowQI :: QName -> String
cf5149eb4d0faef6272231879c04aa740f5abc2bChristian MaedershowQI = ('<' :) . (++ ">") . showQU
cf5149eb4d0faef6272231879c04aa740f5abc2bChristian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedernullQName :: QName
cf5149eb4d0faef6272231879c04aa740f5abc2bChristian MaedernullQName = QN "" "" False "" nullRange
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian MaederdummyQName :: QName
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaederdummyQName =
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder QN "http" "//www.dfki.de/sks/hets/ontology/unamed" True "" nullRange
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian MaedermkQName :: String -> QName
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian MaedermkQName s = nullQName { localPart = s }
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder
04dada28736b4a237745e92063d8bdd49a362debChristian MaedersetQRange :: Range -> QName -> QName
ce5ff829db5f0bb4f16ad4de150eed4401d6acd5Christian MaedersetQRange r q = q { iriPos = r }
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedersetPrefix :: String -> QName -> QName
ccf3de3d66b521a260e5c22d335c64a48e3f0195Christian MaedersetPrefix s q = q { namePrefix = s }
ccf3de3d66b521a260e5c22d335c64a48e3f0195Christian Maeder
8338fbf3cfb9cf981261d893286f070bd9fa17efChristian MaedersetFull :: QName -> QName
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaedersetFull q = q {isFullIri = True}
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maederinstance Eq QName where
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder p == q = compare p q == EQ
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maederinstance Ord QName where
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder compare (QN p1 l1 b1 n1 _) (QN p2 l2 b2 n2 _) = case (n1, n2) of
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder ("", "") -> compare (b1, p1, l1) (b2, p2, l2)
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski ("", _) -> LT
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder (_, "") -> GT
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder _ -> compare n1 n2 -- compare fully expanded names only
2986838ec286d67e7c199e7ea81e7364ca36ad25Christian Maeder
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaederisThing :: IRI -> Bool
36c6cc568751e4235502cfee00ba7b597dae78dcChristian MaederisThing u = localPart u `elem` ["Thing", "Nothing"]
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maedertype IRIreference = QName
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maedertype IRI = QName
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder-- | prefix -> localname
7dec34aee2b609b9535c48d060e0f7baf3536457Christian Maedertype PrefixMap = Map.Map String String
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
e76e6a43f51438215737d6fc176c89da05bb86daChristian Maedertype LexicalForm = String
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maedertype LanguageTag = String
0df692ce8b9293499b2e1768458613a63e7b5cd0Christian Maedertype ImportIRI = IRI
0df692ce8b9293499b2e1768458613a63e7b5cd0Christian Maedertype OntologyIRI = IRI
0df692ce8b9293499b2e1768458613a63e7b5cd0Christian Maedertype Class = IRI
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maedertype Datatype = IRI
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maedertype ObjectProperty = IRI
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maedertype DataProperty = IRI
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maedertype AnnotationProperty = IRI
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maedertype NamedIndividual = IRI
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maedertype Individual = IRI
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maedertype SourceIndividual = Individual
d48085f765fca838c1d972d2123601997174583dChristian Maedertype TargetIndividual = Individual
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maedertype TargetValue = Literal
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maederdata EquivOrDisjoint = Equivalent | Disjoint
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder deriving (Show, Eq, Ord)
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedershowEquivOrDisjoint :: EquivOrDisjoint -> String
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedershowEquivOrDisjoint ed = case ed of
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder Equivalent -> equivalentToC
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder Disjoint -> disjointWithC
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maederdata DomainOrRange = ADomain | ARange deriving (Show, Eq, Ord)
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedershowDomainOrRange :: DomainOrRange -> String
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedershowDomainOrRange dr = case dr of
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder ADomain -> domainC
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder ARange -> rangeC
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maederdata Relation =
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder EDRelation EquivOrDisjoint
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder | SubPropertyOf
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder | InverseOf
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder | SubClass
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder | Types
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder | DRRelation DomainOrRange
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder | SDRelation SameOrDifferent
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder deriving (Show, Eq, Ord)
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedershowRelation :: Relation -> String
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedershowRelation r = case r of
cc8b603388a7deb7fb8045db0341f550f8be5844Christian Maeder EDRelation ed -> showEquivOrDisjoint ed
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder SubPropertyOf -> subPropertyOfC
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder InverseOf -> inverseOfC
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder SubClass -> subClassOfC
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian Maeder Types -> typesC
15c12a3ac049a4528da05b1017b78145f308aeb0Christian Maeder DRRelation dr -> showDomainOrRange dr
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder SDRelation sd -> showSameOrDifferent sd
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedergetDR :: Relation -> DomainOrRange
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedergetDR r = case r of
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder DRRelation dr -> dr
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder _ -> error "not domain or range"
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
6a546f84de613989a2a7a708d310915c7bc3fbddChristian MaedergetED :: Relation -> EquivOrDisjoint
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedergetED r = case r of
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder EDRelation ed -> ed
15c12a3ac049a4528da05b1017b78145f308aeb0Christian Maeder _ -> error "not domain or range"
f4741f6b7da52b5417899c8fcbe4349b920b006eChristian Maeder
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedergetSD :: Relation -> SameOrDifferent
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedergetSD s = case s of
cc8b603388a7deb7fb8045db0341f550f8be5844Christian Maeder SDRelation sd -> sd
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder _ -> error "not same or different"
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder
1d589334ba6b4a4cbfb35307a7a732261e77b0cdChristian Maederdata DataDomainOrRange = DataDomain ClassExpression | DataRange DataRange
cc8b603388a7deb7fb8045db0341f550f8be5844Christian Maeder deriving (Show, Eq, Ord)
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder
cc8b603388a7deb7fb8045db0341f550f8be5844Christian Maederdata Character =
f626b1acbe874a48143a6f8d6246bf9d7a055ffbChristian Maeder Functional
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian Maeder | InverseFunctional
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder | Reflexive
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder | Irreflexive
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder | Symmetric
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder | Asymmetric
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder | Antisymmetric
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maeder | Transitive
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maeder deriving (Enum, Bounded, Show, Eq, Ord)
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maederdata SameOrDifferent = Same | Different deriving (Show, Eq, Ord)
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski
20fe556546c9277cf017931a07d90add61f199d9Christian MaedershowSameOrDifferent :: SameOrDifferent -> String
c2dead95fafd7ca36d06ddf07606a1292ead6d8aChristian MaedershowSameOrDifferent sd = case sd of
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder Same -> sameAsC
20fe556546c9277cf017931a07d90add61f199d9Christian Maeder Different -> differentFromC
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maeder
4ef2a978e66e2246ff0b7f00c77deb7aabb28b8eChristian Maederdata PositiveOrNegative = Positive | Negative deriving (Show, Eq, Ord)
3f63b98c111e5e2bb2cf13795cf6e084a78b0a8dChristian Maeder
c9b711a46e5138b2742727817c8071960e673073Christian Maederdata QuantifierType = AllValuesFrom | SomeValuesFrom deriving (Show, Eq, Ord)
c9b711a46e5138b2742727817c8071960e673073Christian Maeder
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedershowQuantifierType :: QuantifierType -> String
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaedershowQuantifierType ty = case ty of
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder AllValuesFrom -> onlyS
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder SomeValuesFrom -> someS
10397bcc134edbcfbe3ae2c7ea4c6080036aae22Christian Maeder
59c036af82aff7fbe074455dad50477b7878e2d8Christian Maeder-- | data type strings (some are not listed in the grammar)
81946e2b3f6dde6167f48769bd02c7a634736856Christian MaederdatatypeKeys :: [String]
c438c79d00fc438f99627e612498744bdc0d0c89Christian MaederdatatypeKeys =
59c036af82aff7fbe074455dad50477b7878e2d8Christian Maeder [ booleanS
59c036af82aff7fbe074455dad50477b7878e2d8Christian Maeder , dATAS
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maeder , decimalS
, floatS
, integerS
, negativeIntegerS
, nonNegativeIntegerS
, nonPositiveIntegerS
, positiveIntegerS
, stringS
, universalS
]
isDatatypeKey :: IRI -> Bool
isDatatypeKey u =
elem (localPart u) datatypeKeys && elem (namePrefix u) ["", "xsd"]
data DatatypeFacet =
LENGTH
| MINLENGTH
| MAXLENGTH
| PATTERN
| MININCLUSIVE
| MINEXCLUSIVE
| MAXINCLUSIVE
| MAXEXCLUSIVE
| TOTALDIGITS
| FRACTIONDIGITS
deriving (Show, Eq, Ord)
showFacet :: DatatypeFacet -> String
showFacet df = case df of
LENGTH -> lengthS
MINLENGTH -> minLengthS
MAXLENGTH -> maxLengthS
PATTERN -> patternS
MININCLUSIVE -> lessEq
MINEXCLUSIVE -> lessS
MAXINCLUSIVE -> greaterEq
MAXEXCLUSIVE -> greaterS
TOTALDIGITS -> digitsS
FRACTIONDIGITS -> fractionS
data CardinalityType = MinCardinality | MaxCardinality | ExactCardinality
deriving (Show, Eq, Ord)
showCardinalityType :: CardinalityType -> String
showCardinalityType ty = case ty of
MinCardinality -> minS
MaxCardinality -> maxS
ExactCardinality -> exactlyS
data Cardinality a b = Cardinality CardinalityType Int a (Maybe b)
deriving (Show, Eq, Ord)
data JunctionType = UnionOf | IntersectionOf deriving (Show, Eq, Ord)
type ConstrainingFacet = IRI
type RestrictionValue = Literal
-- * ENTITIES
data Entity = Entity EntityType IRI deriving (Show, Eq, Ord)
instance GetRange Entity where
getRange (Entity _ iri) = iriPos iri
data EntityType =
Datatype
| Class
| ObjectProperty
| DataProperty
| AnnotationProperty
| NamedIndividual
deriving (Enum, Bounded, Show, Read, Eq, Ord)
showEntityType :: EntityType -> String
showEntityType e = case e of
Datatype -> datatypeC
Class -> classC
ObjectProperty -> objectPropertyC
DataProperty -> dataPropertyC
AnnotationProperty -> annotationPropertyC
NamedIndividual -> individualC
entityTypes :: [EntityType]
entityTypes = [minBound .. maxBound]
-- * LITERALS
data TypedOrUntyped = Typed Datatype | Untyped (Maybe LanguageTag)
deriving (Show, Eq, Ord)
data Literal = Literal LexicalForm TypedOrUntyped
deriving (Show, Eq, Ord)
cTypeS :: String
cTypeS = "^^"
-- * PROPERTY EXPRESSIONS
type InverseObjectProperty = ObjectPropertyExpression
data ObjectPropertyExpression = ObjectProp ObjectProperty
| ObjectInverseOf InverseObjectProperty
deriving (Show, Eq, Ord)
type DataPropertyExpression = DataProperty
-- * DATA RANGES
data DataRange
= DataType Datatype [(ConstrainingFacet, RestrictionValue)]
| DataJunction JunctionType [DataRange]
| DataComplementOf DataRange
| DataOneOf [Literal]
deriving (Show, Eq, Ord)
-- * CLASS EXPERSSIONS
data ClassExpression =
Expression Class
| ObjectJunction JunctionType [ClassExpression]
| ObjectComplementOf ClassExpression
| ObjectOneOf [Individual]
| ObjectValuesFrom QuantifierType ObjectPropertyExpression ClassExpression
| ObjectHasValue ObjectPropertyExpression Individual
| ObjectHasSelf ObjectPropertyExpression
| ObjectCardinality (Cardinality ObjectPropertyExpression ClassExpression)
| DataValuesFrom QuantifierType
DataPropertyExpression DataRange
| DataHasValue DataPropertyExpression Literal
| DataCardinality (Cardinality DataPropertyExpression DataRange)
deriving (Show, Eq, Ord)
-- * ANNOTATIONS
data Annotation = Annotation [Annotation] AnnotationProperty AnnotationValue
deriving (Show, Eq, Ord)
data AnnotationValue
= AnnValue IRI
| AnnValLit Literal
deriving (Show, Eq, Ord)