Ejemplo n.º 1
0
class RDFMapping:
    def __init__(self, yarrrml_mapping=None):
        if yarrrml_mapping:
            self.graph = yarrrml_parser.get_rdf_mapping(yarrrml_mapping)
        else:
            self.graph = Graph()

    def __repr__(self):
        return self.graph.__repr__()

    def __str__(self):
        return self.graph.__str__()

    def __len__(self):
        return len(self.graph)

    @property
    def rdf_graph(self):
        return self.graph

    def triples(self):
        for s, p, o in self.graph.triples((None, None, None)):
            yield (str(s), str(p), str(o))

    def classes(self, subject=None):
        classes = set()
        if subject:
            subject = URIRef(subject)
        for _, _, o in self.graph.triples((subject, RDF.type, None)):
            classes.add(str(o))
        return classes

    def search_classes(self, string):
        for uri in self.classes():
            if string.lower() == get_suffix(uri).lower():
                yield uri

    def templates(self, class_uri=None):
        templates = set()
        if class_uri:
            for s, _, _ in self.graph.triples(
                (None, RDF.type, URIRef(class_uri))):
                templates.add(str(s))
        else:
            for s, _, _ in self.graph.triples((None, RDF.type, None)):
                templates.add(str(s))
        return templates

    def properties(self, template=None):
        properties = set()
        if template:
            for _, p, _ in self.graph.triples((URIRef(template), None, None)):
                properties.add(str(p))
        else:
            for _, p, _ in self.graph.triples((None, None, None)):
                properties.add(str(p))
        return properties

    def properties_objects(self, template=None):
        if template:
            for _, p, o in self.graph.triples((URIRef(template), None, None)):
                yield str(p), str(o)
        else:
            for _, p, o in self.graph.triples((None, None, None)):
                yield str(p), str(o)

    def add(self, subject, predicate, object):
        if is_valid_uri(object):
            self.graph.add(
                (URIRef(subject), URIRef(predicate), URIRef(object)))
        else:
            self.graph.add(
                (URIRef(subject), URIRef(predicate), Literal(object)))

    def serialize(self, format='yaml', dataset_id=None):
        """‘xml’, ‘n3’, ‘turtle’, ‘nt’, ‘pretty-xml’, ‘trix’, ‘trig’ and ‘nquads’ formats are built in"""
        if format in ['yaml', 'yml', 'yarrrml']:
            return yarrrml_serializer.dump(self, dataset_id)
        else:
            return str(self.graph.serialize(format=format), 'utf-8')