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
|
|
|
|