atramhasis.rdf._add_metadataset()   B
last analyzed

Complexity

Conditions 5

Size

Total Lines 48
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 31
dl 0
loc 48
rs 8.6693
c 0
b 0
f 0
cc 5
nop 3
1
"""
2
Module containing utility functions dealing with RDF used by Atramhasis.
3
4
.. versionadded:: 0.6.0
5
"""
6
7
from pyramid.settings import asbool
8
from rdflib import Graph
9
from rdflib import DCTERMS
10
from rdflib import FOAF
11
from rdflib import Namespace
12
from rdflib import RDF
13
from rdflib import SKOS
14
from rdflib import VOID
15
from rdflib.term import BNode
16
from rdflib.term import Literal
17
from rdflib.term import URIRef
18
from skosprovider_rdf.utils import _add_labels
19
20
FORMATS = Namespace('http://www.w3.org/ns/formats/')
21
SKOS_THES = Namespace('http://purl.org/iso25964/skos-thes#')
22
HYDRA = Namespace('http://www.w3.org/ns/hydra/core#')
23
24
25
def void_dumper(request, registry):
26
    """
27
    Creates a void file with information about all void Datasets in this Atramhasis instance.
28
29
    :param request: pyramid.request.Request request
30
    :param registry: skosprovider.registry.Registry
31
    """
32
    providers = [
33
        x for x in registry.get_providers()
34
        if not any([not_shown in x.get_metadata()['subject'] for not_shown in ['external']])
35
    ]
36
    graph = Graph()
37
    graph.namespace_manager.bind("void", VOID)
38
    graph.namespace_manager.bind("dcterms", DCTERMS)
39
    graph.namespace_manager.bind("foaf", FOAF)
40
    graph.namespace_manager.bind("skos", SKOS)
41
    graph.namespace_manager.bind("skos-thes", SKOS_THES)
42
    graph.namespace_manager.bind("hydra", HYDRA)
43
    duri = request.route_url('atramhasis.rdf_void_turtle_ext', _anchor='atramhasis')
44
    dataset = URIRef(duri)
45
    graph.add((dataset, RDF.type, VOID.Dataset))
46
    graph.add((dataset, FOAF.homepage, URIRef(request.route_url('home'))))
47
    graph.add((dataset, VOID.vocabulary, URIRef(DCTERMS)))
48
    graph.add((dataset, VOID.vocabulary, URIRef(SKOS)))
49
    graph.add((dataset, VOID.vocabulary, URIRef(SKOS_THES)))
50
    ldf_enabled = asbool(request.registry.settings.get('atramhasis.ldf.enabled'))
51
    ldf_baseurl = request.registry.settings.get('atramhasis.ldf.baseurl')
52
    if ldf_enabled and ldf_baseurl:
53
        ldfurl = ldf_baseurl + '/composite{?s,p,o}'
54
        _add_ldf_server(graph, dataset, ldfurl)
55
    for p in providers:
56
        _add_provider(graph, p, dataset, request)
57
    return graph
58
59
60
def _add_provider(graph, provider, dataseturi, request):
61
    """
62
    :param rdflib.graph.Graph graph: Graph that will contain the Dataset.
63
    :param skosprovider.providers.VocabularyProvider provider: Provider to turn into a Dataset.
64
    :param rdflib.term.URIRef dataseturi: URI of the main dataset this provider will be attached to.
65
    :param pyramid.request.Request request:
66
    :rtype: :class:`rdflib.graph.Graph`
67
    """
68
    pid = provider.get_vocabulary_id()
69
    metadataset = provider.get_metadata().get('dataset', {})
70
    duri = metadataset.get(
71
        'uri',
72
        request.route_url('atramhasis.rdf_void_turtle_ext', _anchor=pid)
73
    )
74
    pd = URIRef(duri)
75
    graph.add((pd, RDF.type, VOID.Dataset))
76
    graph.add((dataseturi, VOID.subset, pd))
77
    graph.add((pd, DCTERMS.identifier, Literal(pid)))
78
    graph.add((pd, VOID.rootResource, URIRef(provider.concept_scheme.uri)))
79
    graph.add((pd, FOAF.homepage, URIRef(request.route_url('skosprovider.conceptscheme', scheme_id=pid))))
80
    _add_labels(graph, provider.concept_scheme, pd)
81
    _add_metadataset(graph, pd, metadataset)
82
    fmap = [
83
        ('rdf', FORMATS.RDF_XML, 'skosprovider.conceptscheme.cs.rdf'),
84
        ('ttl', FORMATS.Turtle, 'skosprovider.conceptscheme.cs.ttl')
85
    ]
86
    for f in fmap:
87
        graph.add((pd, VOID.feature, f[1]))
88
        dump_url = request.route_url(f[2], scheme_id=pid)
89
        graph.add((pd, VOID.dataDump, URIRef(dump_url)))
90
91
    ldf_enabled = asbool(request.registry.settings.get('atramhasis.ldf.enabled'))
92
    ldf_baseurl = request.registry.settings.get('atramhasis.ldf.baseurl')
93
    if ldf_enabled and ldf_baseurl:
94
        pid = provider.get_vocabulary_id()
95
        ldfurl = ldf_baseurl + '/' + pid + '{?s,p,o}'
96
        _add_ldf_server(graph, pd, ldfurl)
97
    return graph
98
99
100
def _add_metadataset(graph, subject, metadataset):
101
    """
102
    :param rdflib.graph.Graph graph: Graph that contains the Dataset.
103
    :param rdflib.term.URIRef subject: Uri of the Dataset.
104
    :param dict metadataset: Dictionary with metadata to add to the Dataset.
105
    :rtype: :class:`rdflib.graph.Graph`
106
    """
107
    mapping = {
108
        'creator': {
109
            'predicate': DCTERMS.creator,
110
            'objecttype': URIRef
111
        },
112
        'publisher': {
113
            'predicate': DCTERMS.publisher,
114
            'objecttype': URIRef
115
        },
116
        'contributor': {
117
            'predicate': DCTERMS.contributor,
118
            'objecttype': URIRef
119
        },
120
        'language': {
121
            'predicate': DCTERMS.language
122
        },
123
        'date': {
124
            'predicte': DCTERMS.date
125
        },
126
        'created': {
127
            'predicate': DCTERMS.created
128
        },
129
        'issued': {
130
            'predicate': DCTERMS.issued
131
        },
132
        'license': {
133
            'predicate': DCTERMS.license,
134
            'objecttype': URIRef
135
        }
136
    }
137
138
    for k, v in mapping.items():
139
        if k in metadataset:
140
            if 'objecttype' in v:
141
                objecttype = v['objecttype']
142
            else:
143
                objecttype = Literal
144
            for ko in metadataset[k]:
145
                o = objecttype(ko)
146
                graph.add((subject, v['predicate'], o))
147
    return graph
148
149
150
def _add_ldf_server(graph, dataseturi, ldfurl):
151
    """
152
    :param rdflib.graph.Graph graph: Graph that contains the Dataset.
153
    :param rdflib.term.URIRef dataseturi: Uri of the Dataset.
154
    :param str ldfurl: Url pointing to the ldf server.
155
    :rtype: :class:`rdflib.graph.Graph`
156
    """
157
    ldf = BNode()
158
    graph.add((dataseturi, HYDRA.search, ldf))
159
    graph.add((ldf, HYDRA.template, Literal(ldfurl)))
160
    s = BNode()
161
    graph.add((s, HYDRA.variable, Literal('s')))
162
    graph.add((s, HYDRA.property, RDF.subject))
163
    graph.add((ldf, HYDRA.mapping, s))
164
    p = BNode()
165
    graph.add((p, HYDRA.variable, Literal('p')))
166
    graph.add((p, HYDRA.property, RDF.predicate))
167
    graph.add((ldf, HYDRA.mapping, p))
168
    o = BNode()
169
    graph.add((o, HYDRA.variable, Literal('o')))
170
    graph.add((o, HYDRA.property, RDF.object))
171
    graph.add((ldf, HYDRA.mapping, o))
172
    return graph
173