Completed
Pull Request — master (#351)
by Koen
01:20
created

_add_provider()   B

Complexity

Conditions 2

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 31
rs 8.8571
cc 2
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 rdflib import Graph
9
from rdflib.namespace import RDF, VOID, DCTERMS, FOAF, SKOS
10
from rdflib.namespace import Namespace
11
from rdflib.term import URIRef, Literal
12
13
from skosprovider_rdf.utils import _add_labels
14
15
FORMATS = Namespace('http://www.w3.org/ns/formats/')
16
SKOS_THES = Namespace('http://purl.org/iso25964/skos-thes#')
17
18
19
def void_dumper(request, registry):
20
    '''
21
    Creates a void file with information about all void Datasets in this Atramhasis instance.
22
23
    :param pyramid.request.Request request: 
24
    :param skosprovider.registry.Registry:
25
    '''
26
    providers = [
27
        x for x in registry.get_providers()
28
        if not any([not_shown in x.get_metadata()['subject'] for not_shown in ['external', 'hidden']])
29
    ]
30
    graph = Graph()
31
    graph.namespace_manager.bind("void", VOID)
32
    graph.namespace_manager.bind("dcterms", DCTERMS)
33
    graph.namespace_manager.bind("foaf", FOAF)
34
    graph.namespace_manager.bind("skos", SKOS)
35
    graph.namespace_manager.bind("skos-thes", SKOS_THES)
36
    duri = request.route_url('atramhasis.rdf_void_turtle_ext', _anchor='atramhasis')
37
    dataset = URIRef(duri)
38
    graph.add((dataset, RDF.type, VOID.Dataset))
39
    graph.add((dataset, FOAF.homepage, URIRef(request.route_url('home'))))
40
    graph.add((dataset, VOID.vocabulary, URIRef(DCTERMS)))
41
    graph.add((dataset, VOID.vocabulary, URIRef(SKOS)))
42
    graph.add((dataset, VOID.vocabulary, URIRef(SKOS_THES)))
43
    for p in providers:
44
        _add_provider(graph, p, dataset, request)
45
    return graph
46
47
48
def _add_provider(graph, provider, dataseturi, request):
49
    '''
50
    :param rdflib.graph.Graph graph: Graph that will contain the Dataset.
51
    :param skosprovider.providers.VocabularyProvider provider: Provider to turn into a Dataset.
52
    :param rdflib.term.URIRef URIRef: URI of the main dataset this provider will be attached to.
53
    :param pyramid.request.Request request:
54
    :rtype: :class:`rdflib.graph.Graph`
55
    '''
56
    pid = provider.get_vocabulary_id()
57
    metadataset = provider.get_metadata().get('dataset', {})
58
    duri = metadataset.get(
59
        'uri',
60
        request.route_url('atramhasis.rdf_void_turtle_ext', _anchor=pid)
61
    )
62
    pd = URIRef(duri)
63
    graph.add((pd, RDF.type, VOID.Dataset))
64
    graph.add((dataseturi, VOID.subset, pd))
65
    graph.add((pd, DCTERMS.identifier, Literal(pid)))
66
    graph.add((pd, VOID.rootResource, URIRef(provider.concept_scheme.uri)))
67
    graph.add((pd, FOAF.homepage, URIRef(request.route_url('conceptscheme', scheme_id=pid))))
68
    _add_labels(graph, provider.concept_scheme, pd)
69
    _add_metadataset(graph, pd, metadataset)
70
    fmap = [
71
        ('rdf', FORMATS.RDF_XML, 'atramhasis.rdf_full_export_ext'),
72
        ('ttl', FORMATS.Turtle, 'atramhasis.rdf_full_export_turtle_ext')
73
    ]
74
    for f in fmap:
75
        graph.add((pd, VOID.feature, f[1]))
76
        dump_url = request.route_url(f[2], scheme_id=pid)
77
        graph.add((pd, VOID.dataDump, URIRef(dump_url)))
78
    return graph
79
80
81
def _add_metadataset(graph, subject, metadataset):
82
    '''
83
    :param rdflib.graph.Graph graph: Graph that contains the Dataset.
84
    :param rdflib.term.URIRef subject: Uri of the Dataset.
85
    :param dict metadataset: Dictionary with metadata to add to the Dataset.
86
    :rtype: :class:`rdflib.graph.Graph`
87
    '''
88
    mapping = {
89
        'creator': {
90
            'predicate': DCTERMS.creator,
91
            'objecttype': URIRef
92
        },
93
        'publisher': {
94
            'predicate': DCTERMS.publisher,
95
            'objecttype': URIRef
96
        },
97
        'contributor': {
98
            'predicate': DCTERMS.contributor,
99
            'objecttype': URIRef
100
        },
101
        'language': {
102
            'predicate': DCTERMS.language
103
        },
104
        'date': {
105
            'predicte': DCTERMS.date
106
        },
107
        'created': {
108
            'predicate': DCTERMS.created
109
        },
110
        'issued': {
111
            'predicate': DCTERMS.issued
112
        },
113
        'license': {
114
            'predicate': DCTERMS.license,
115
            'objecttype': URIRef
116
        }
117
    }
118
119
    for k, v in mapping.items():
120
        if k in metadataset:
121
            if 'objecttype' in v:
122
                objecttype = v['objecttype']
123
            else:
124
                objecttype = Literal
125
            for ko in metadataset[k]:
126
                if objecttype == Literal:
127
                    if 'datatype' in v:
128
                        o = Literal(ko, datatype=v['datatype'])
129
                    else:
130
                        o = Literal(ko)
131
                else:
132
                    o = objecttype(ko)
133
                graph.add((subject, v['predicate'], o))
134
    return graph
135