Source code for oldman.parsing.schema.property

from rdflib import Namespace, URIRef
from oldman.property import OMProperty


[docs]class OMPropertyExtractor(object): """An :class:`~oldman.parsing.schema.property.OMPropertyExtractor` object generates and updates :class:`~oldman.property.OMProperty` objects from the schema RDF graph. This class is generic and must derived for supporting various RDF vocabularies. """
[docs] def update(self, om_properties, class_iri, type_iris, schema_graph, manager): """Generates new :class:`~oldman.property.OMProperty` objects or updates them from the schema graph. :param om_properties: `dict` of :class:`~oldman.property.OMProperty` objects indexed by their IRIs and their reverse status. :param class_iri: IRI of RDFS class of the future :class:`~oldman.model.Model` object. :param type_iris: Ancestry of the RDFS class. :param schema_graph: :class:`rdflib.graph.Graph` object. :return: Updated `dict` :class:`~oldman.property.OMProperty` objects. """ raise NotImplementedError()
[docs]class HydraPropertyExtractor(OMPropertyExtractor): """:class:`~oldman.parsing.schema.property.OMPropertyExtractor` objects that support the `Hydra vocabulary <http://www.markus-lanthaler.com/hydra/spec/latest/core/>`_. Currently, this class supports: - `hydra:required <http://www.markus-lanthaler.com/hydra/spec/latest/core/#hydra:required>`_ ; - `hydra:readonly <http://www.markus-lanthaler.com/hydra/spec/latest/core/#hydra:readonly>`_; - `hydra:writeonly <http://www.markus-lanthaler.com/hydra/spec/latest/core/#hydra:writeonly>`_ . """ _extract_hydra_properties = u""" SELECT ?p ?required ?readonly ?writeonly ?reversed WHERE { ?class_iri hydra:supportedProperty ?sp. ?sp hydra:property ?p. OPTIONAL { ?sp hydra:required ?required } . OPTIONAL { ?sp hydra:readonly ?readonly } . OPTIONAL { ?sp hydra:writeonly ?writeonly } . OPTIONAL { ?sp hydra:reversed ?reversed } . } """ _ns = {u'hydra': Namespace(u"http://www.w3.org/ns/hydra/core#")}
[docs] def update(self, om_properties, class_iri, type_iris, schema_graph, manager): """See :func:`oldman.parsing.schema.property.OMPropertyExtractor.update`.""" prop_params = {} for type_uri in type_iris: results = schema_graph.query(self._extract_hydra_properties, initNs=self._ns, initBindings={u'class_iri': URIRef(type_uri)}) for property_iri, is_req, ro, wo, rev in results: reversed = bool(rev) prop_uri = property_iri.toPython() # Booleans are false by default is_required, read_only, write_only = prop_params.get((prop_uri, reversed), (False, False, False)) # Updates these booleans is_required = is_required or (is_req is not None and bool(is_req.toPython())) read_only = read_only or (ro is not None and bool(ro.toPython())) write_only = write_only or (wo is not None and bool(wo.toPython())) prop_params[(prop_uri, reversed)] = (is_required, read_only, write_only) for (property_iri, reversed), (is_required, read_only, write_only) in prop_params.iteritems(): if not (property_iri, reversed) in om_properties: om_property = OMProperty(manager, property_iri, class_iri, is_required=is_required, read_only=read_only, write_only=write_only, reversed=reversed) om_properties[(property_iri, reversed)] = om_property return om_properties