Source code for owmeta_core.property_mixins
import logging
import rdflib
L = logging.getLogger(__name__)
__all__ = ["DatatypePropertyMixin",
"UnionPropertyMixin"]
[docs]class UnionPropertyMixin(object):
""" A Property that can handle either DataObjects or basic types """
def __init__(self, resolver, **kwargs):
"""
Parameters
----------
resolver : RDFTypeResolver
Resolves RDF identifiers into objects returned from :meth:`get`
"""
super(UnionPropertyMixin, self).__init__(**kwargs)
self.resolver = resolver
def set(self, v):
return super(UnionPropertyMixin, self).set(v)
def get(self):
for ident in super(UnionPropertyMixin, self).get():
if isinstance(ident, rdflib.Literal):
yield self.resolver.deserializer(ident)
elif isinstance(ident, rdflib.BNode):
L.warn(
'UnionProperty.get: Retrieved BNode, "' +
ident +
'". BNodes are not supported in owmeta-core')
else:
types = set()
rdf = super(UnionPropertyMixin, self).rdf
for rdf_type in rdf.objects(ident, rdflib.RDF['type']):
types.add(rdf_type)
L.debug("{} <- types, {} <- ident".format(types, ident))
the_type = self.resolver.base_type
if len(types) == 0:
L.warn(
'UnionProperty.get: Retrieved un-typed URI, "' +
ident +
'", for a DataObject. Creating a default-typed object')
else:
the_type = self.resolver.type_resolver(
self.owner.context.rdf_graph(), types)
L.debug("the_type = {}".format(the_type))
yield self.resolver.id2ob(ident, the_type, context=self.owner.context)