Completed
Push — master ( 52d879...ff15e7 )
by Koen
59s
created

_add_ldf_server()   A

Complexity

Conditions 1

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

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