cubicweb/rdf.py
author Simon Chabot <simon.chabot@logilab.fr>
Fri, 28 Feb 2020 17:11:01 +0100
changeset 12892 0df0db725f07
parent 12891 eb0cd6060062
child 12910 c87c3943d6ab
permissions -rw-r--r--
[rdf] Add a basic foaf adapter for CWUser By the way, use RDFLib namespaces
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12891
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     2
# copyright 2019 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     3
# contact http://www.logilab.fr -- mailto:contact@logilab.fr
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     4
#
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     5
# This program is free software: you can redistribute it and/or modify it under
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     6
# the terms of the GNU Lesser General Public License as published by the Free
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     7
# Software Foundation, either version 2.1 of the License, or (at your option)
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     8
# any later version.
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
     9
#
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    10
# This program is distributed in the hope that it will be useful, but WITHOUT
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    11
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    12
# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    13
# details.
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    14
#
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    15
# You should have received a copy of the GNU Lesser General Public License
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    16
# along with this program. If not, see <http://www.gnu.org/licenses/>.
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    17
12892
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    18
from rdflib import ConjunctiveGraph, plugin
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    19
from rdflib.namespace import Namespace, RDF, FOAF
12891
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    20
import rdflib_jsonld  # noqa
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    21
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    22
plugin.register("jsonld", plugin.Serializer, "rdflib_jsonld.serializer", "JsonLDSerializer")
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    23
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    24
RDF_MIMETYPE_TO_FORMAT = {
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    25
    'application/rdf+xml': 'xml',
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    26
    'text/turtle': 'turtle',
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    27
    'text/n3': 'n3',
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    28
    'application/n-quads': 'nquads',
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    29
    'application/n-triples': 'nt',
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    30
    'application/trig': 'trig',
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    31
    'application/ld+json': 'json-ld',
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    32
}
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    33
12892
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    34
NAMESPACES = {
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    35
    "rdf": RDF,
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    36
    "schema": Namespace("http://schema.org/"),
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    37
    "foaf": FOAF,
12891
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    38
}
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    39
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    40
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    41
# dict: name of CWEType -> list of regid of adapters derived from EntityRDFAdapter
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    42
ETYPES_ADAPTERS = {
12892
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    43
    "CWUser": ("rdf.foaf",),
12891
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    44
}
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    45
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    46
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    47
def conjunctive_graph():
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    48
    """factory to build a ``ConjunctiveGraph`` and bind all namespaces
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    49
    """
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    50
    graph = ConjunctiveGraph()
12892
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    51
    for prefix, rdfns in NAMESPACES.items():
0df0db725f07 [rdf] Add a basic foaf adapter for CWUser
Simon Chabot <simon.chabot@logilab.fr>
parents: 12891
diff changeset
    52
        graph.bind(prefix, rdfns)
12891
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    53
    return graph
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    54
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    55
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    56
def iter_rdf_adapters(entity):
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    57
    for adapter_id in ETYPES_ADAPTERS.get(entity.__regid__, ()):
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    58
        adapter = entity.cw_adapt_to(adapter_id)
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    59
        if adapter:
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    60
            yield adapter
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    61
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    62
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    63
def add_entity_to_graph(graph, entity):
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    64
    for adapter in iter_rdf_adapters(entity):
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    65
        for triple in adapter.triples():
eb0cd6060062 [rdf] add functions and tools to generate rdf graph
Simon Chabot <simon.chabot@logilab.fr>
parents:
diff changeset
    66
            graph.add(triple)