qa 4.2.2 → 4.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/qa/linked_data_terms_controller.rb +5 -0
- data/app/controllers/qa/terms_controller.rb +5 -0
- data/lib/qa/authorities/discogs/discogs_instance_builder.rb +17 -19
- data/lib/qa/authorities/discogs/discogs_translation.rb +23 -18
- data/lib/qa/authorities/discogs/discogs_utils.rb +32 -20
- data/lib/qa/authorities/discogs/discogs_works_builder.rb +26 -47
- data/lib/qa/authorities/discogs/generic_authority.rb +12 -3
- data/lib/qa/authorities/linked_data/find_term.rb +6 -1
- data/lib/qa/version.rb +1 -1
- data/spec/controllers/linked_data_terms_controller_spec.rb +18 -0
- data/spec/controllers/terms_controller_spec.rb +12 -0
- data/spec/lib/authorities/discogs/generic_authority_spec.rb +47 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eba5e21a3c6692b86e9974f53a642c22fe4b15e6
|
4
|
+
data.tar.gz: 5d62930818fc514a4e685f5480a15592f5c7c1d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c24bd0c98bb86cca3dbeb5d0889f017af4c97911bbaab33e2a413562f9ce954d6128042b3dd09647483990517d90ec0f6ac493a0fcae3277b215cc75613e4e21
|
7
|
+
data.tar.gz: c81ee4a69c029942069d39a4b0cb5e3cb3b199abf65b94a7a57e29e5bf3eb9f999e67584a65b6b26d5ebed3790550e2870a7bce38087bd5409f13c2cb5f3abce
|
@@ -222,9 +222,14 @@ class Qa::LinkedDataTermsController < ::ApplicationController
|
|
222
222
|
format.casecmp?('n3')
|
223
223
|
end
|
224
224
|
|
225
|
+
def ntriples?
|
226
|
+
format.casecmp?('ntriples')
|
227
|
+
end
|
228
|
+
|
225
229
|
def content_type_for_format
|
226
230
|
return 'application/ld+json' if jsonld?
|
227
231
|
return 'text/n3' if n3?
|
232
|
+
return 'application/n-triples' if ntriples?
|
228
233
|
'application/json'
|
229
234
|
end
|
230
235
|
|
@@ -95,9 +95,14 @@ class Qa::TermsController < ::ApplicationController
|
|
95
95
|
format.casecmp?('n3')
|
96
96
|
end
|
97
97
|
|
98
|
+
def ntriples?
|
99
|
+
format.casecmp?('ntriples')
|
100
|
+
end
|
101
|
+
|
98
102
|
def content_type_for_format
|
99
103
|
return 'application/ld+json' if jsonld?
|
100
104
|
return 'text/n3' if n3?
|
105
|
+
return 'application/n-triples' if ntriples?
|
101
106
|
'application/json'
|
102
107
|
end
|
103
108
|
end
|
@@ -44,11 +44,12 @@ module Qa::Authorities
|
|
44
44
|
count = 1
|
45
45
|
return stmts unless response["identifiers"].present?
|
46
46
|
response["identifiers"].each do |activity|
|
47
|
-
stmts << contruct_stmt_uri_object(
|
48
|
-
stmts << contruct_stmt_uri_object("
|
49
|
-
stmts << contruct_stmt_literal_object("
|
47
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/identifiedBy", "iidn#{count}")
|
48
|
+
stmts << contruct_stmt_uri_object("iidn#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Identifier")
|
49
|
+
stmts << contruct_stmt_literal_object("iidn#{count}", rdfs_label_predicate, activity["value"])
|
50
50
|
count += 1
|
51
51
|
end
|
52
|
+
stmts.concat(build_year_statements(response)) if response["released"].present?
|
52
53
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
53
54
|
end
|
54
55
|
|
@@ -64,7 +65,7 @@ module Qa::Authorities
|
|
64
65
|
if df.present?
|
65
66
|
stmts += build_format_characteristics(df, count)
|
66
67
|
else
|
67
|
-
stmts << contruct_stmt_literal_object(
|
68
|
+
stmts << contruct_stmt_literal_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/editionStatement", desc)
|
68
69
|
end
|
69
70
|
end
|
70
71
|
stmts
|
@@ -77,15 +78,13 @@ module Qa::Authorities
|
|
77
78
|
stmts = []
|
78
79
|
case df["type"]
|
79
80
|
when "playbackChannel"
|
80
|
-
stmts << contruct_stmt_uri_object(
|
81
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/soundCharacteristic", df["uri"])
|
81
82
|
stmts << contruct_stmt_uri_object(df["uri"], rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/PlaybackChannel")
|
82
83
|
stmts << contruct_stmt_literal_object(df["uri"], rdfs_label_predicate, df["label"])
|
83
84
|
when "dimension"
|
84
|
-
stmts <<
|
85
|
+
stmts << contruct_stmt_literal_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/dimensions", df["label"])
|
85
86
|
when "playingSpeed"
|
86
|
-
stmts
|
87
|
-
stmts << contruct_stmt_uri_object("PlayingSpeed#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/PlayingSpeed")
|
88
|
-
stmts << contruct_stmt_literal_object("PlayingSpeed#{count}", rdfs_label_predicate, df["label"])
|
87
|
+
stmts.concat(build_playing_speed_stmts(df["label"], count))
|
89
88
|
end
|
90
89
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
91
90
|
end
|
@@ -98,13 +97,13 @@ module Qa::Authorities
|
|
98
97
|
return stmts unless name.present?
|
99
98
|
dc = discogs_formats[name.gsub(/\s+/, "")]
|
100
99
|
if dc.present?
|
101
|
-
stmts << contruct_stmt_uri_object(
|
100
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/carrier", dc["uri"])
|
102
101
|
stmts << contruct_stmt_uri_object(dc["uri"], rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Carrier")
|
103
102
|
stmts << contruct_stmt_literal_object(dc["uri"], rdfs_label_predicate, dc["label"])
|
104
103
|
stmts.concat(build_base_materials(name))
|
105
104
|
else
|
106
105
|
# if it's not a carrier, it's an edition statement
|
107
|
-
stmts << contruct_stmt_literal_object(
|
106
|
+
stmts << contruct_stmt_literal_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/editionStatement", name)
|
108
107
|
end
|
109
108
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
110
109
|
end
|
@@ -116,7 +115,7 @@ module Qa::Authorities
|
|
116
115
|
return stmts unless name == "Vinyl" || name == "Shellac"
|
117
116
|
id = name == "Vinyl" ? "300014502" : "300014918"
|
118
117
|
|
119
|
-
stmts << contruct_stmt_uri_object(
|
118
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/baseMaterial", "http://vocab.getty.edu/aat/" + id)
|
120
119
|
stmts << contruct_stmt_uri_object("http://vocab.getty.edu/aat/" + id, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/BaseMaterial")
|
121
120
|
stmts << contruct_stmt_literal_object("http://vocab.getty.edu/aat/" + id, rdfs_label_predicate, name)
|
122
121
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
@@ -129,13 +128,12 @@ module Qa::Authorities
|
|
129
128
|
# need to distinguish among different provision activities and roles
|
130
129
|
count = 1
|
131
130
|
activities.each do |activity|
|
132
|
-
stmts << contruct_stmt_uri_object(
|
133
|
-
stmts << contruct_stmt_uri_object("
|
134
|
-
stmts << contruct_stmt_uri_object("
|
135
|
-
stmts << contruct_stmt_uri_object(
|
136
|
-
stmts <<
|
137
|
-
stmts
|
138
|
-
stmts << contruct_stmt_literal_object("PA_Role#{count}", rdfs_label_predicate, activity["entity_type_name"])
|
131
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/provisionActivity", "proact#{count}")
|
132
|
+
stmts << contruct_stmt_uri_object("proact#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/ProvisionActivity")
|
133
|
+
stmts << contruct_stmt_uri_object("proact#{count}", bf_agent_predicate, "agentn3#{count}")
|
134
|
+
stmts << contruct_stmt_uri_object("agentn3#{count}", rdf_type_predicate, bf_agent_type_object)
|
135
|
+
stmts << contruct_stmt_literal_object("agentn3#{count}", rdfs_label_predicate, activity["name"])
|
136
|
+
stmts += build_role_stmts("agentn3#{count}", "role3#{count}", activity["entity_type_name"])
|
139
137
|
count += 1
|
140
138
|
end
|
141
139
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
@@ -11,7 +11,7 @@ module Qa::Authorities
|
|
11
11
|
# to the URIs of corresponding objects in the Library of Congress vocabulary.
|
12
12
|
# @param [Hash] the http response from discogs
|
13
13
|
# @param [String] the subauthority
|
14
|
-
# @return [Array, String] requested RDF serialzation (supports: jsonld Array, n3 String)
|
14
|
+
# @return [Array, String] requested RDF serialzation (supports: jsonld Array, n3 String, n-triples String)
|
15
15
|
def build_graph(response, subauthority = "", format: :jsonld)
|
16
16
|
graph = RDF::Graph.new
|
17
17
|
|
@@ -30,14 +30,17 @@ module Qa::Authorities
|
|
30
30
|
# all we need is a work and not an instance. If there's no subauthority, we can determine
|
31
31
|
# if the discogs record is a master because it will have a main_release field.
|
32
32
|
if master_only(response, subauthority)
|
33
|
+
self.work_uri = response["uri"]
|
33
34
|
complete_rdf_stmts.concat(build_master_statements(response))
|
34
35
|
else
|
35
36
|
# If the subauthority is not "master," we need to define an instance as well as a
|
36
37
|
# work. If the discogs record has a master_id, fetch that and use the results to
|
37
38
|
# build the statements for the work.
|
38
39
|
master_resp = response["master_id"].present? ? json("https://api.discogs.com/masters/#{response['master_id']}") : response
|
40
|
+
self.work_uri = master_resp["uri"] if master_resp["uri"].present? && master_resp["uri"].include?("master")
|
39
41
|
complete_rdf_stmts.concat(build_master_statements(master_resp))
|
40
42
|
# Now do the statements for the instance.
|
43
|
+
self.instance_uri = response["uri"] if response["uri"].present?
|
41
44
|
complete_rdf_stmts.concat(build_instance_statements(response))
|
42
45
|
end
|
43
46
|
end
|
@@ -77,11 +80,12 @@ module Qa::Authorities
|
|
77
80
|
# @return [Array] rdf statements
|
78
81
|
def get_primary_work_definition(response)
|
79
82
|
stmts = []
|
80
|
-
stmts << contruct_stmt_uri_object(
|
81
|
-
stmts << contruct_stmt_uri_object(
|
82
|
-
stmts << contruct_stmt_literal_object("
|
83
|
-
stmts << contruct_stmt_uri_object("
|
84
|
-
stmts
|
83
|
+
stmts << contruct_stmt_uri_object(work_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Work")
|
84
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/title", "titlen1")
|
85
|
+
stmts << contruct_stmt_literal_object("titlen1", bf_main_title_predicate, response["title"])
|
86
|
+
stmts << contruct_stmt_uri_object("titlen1", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Title")
|
87
|
+
stmts << contruct_stmt_uri_object(work_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Audio")
|
88
|
+
stmts << contruct_stmt_literal_object(work_uri, "http://id.loc.gov/ontologies/bibframe/originDate", response["year"].to_s) if response["year"].present?
|
85
89
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
86
90
|
end
|
87
91
|
|
@@ -89,14 +93,14 @@ module Qa::Authorities
|
|
89
93
|
# @return [Array] rdf statements
|
90
94
|
def get_primary_instance_definition(response)
|
91
95
|
stmts = []
|
92
|
-
stmts << contruct_stmt_uri_object(
|
93
|
-
stmts << contruct_stmt_uri_object(
|
94
|
-
stmts << contruct_stmt_uri_object(
|
95
|
-
stmts << contruct_stmt_literal_object("
|
96
|
-
stmts << contruct_stmt_uri_object("
|
97
|
-
stmts << contruct_stmt_uri_object(
|
98
|
-
stmts <<
|
99
|
-
stmts
|
96
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/hasInstance", instance_uri)
|
97
|
+
stmts << contruct_stmt_uri_object(instance_uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Instance")
|
98
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/title", "titlen2")
|
99
|
+
stmts << contruct_stmt_literal_object("titlen2", bf_main_title_predicate, response["title"])
|
100
|
+
stmts << contruct_stmt_uri_object("titlen2", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Title")
|
101
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/identifiedBy", "widn1")
|
102
|
+
stmts << contruct_stmt_uri_object("widn1", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Identifier")
|
103
|
+
stmts << contruct_stmt_literal_object("widn1", "http://www.w3.org/1999/02/22-rdf-syntax-ns#value", response["id"])
|
100
104
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
101
105
|
end
|
102
106
|
|
@@ -112,10 +116,11 @@ module Qa::Authorities
|
|
112
116
|
# we need the primary artists later when we loop through the track list, so build this array
|
113
117
|
primary_artists << artist
|
114
118
|
|
115
|
-
stmts << contruct_stmt_uri_object(
|
116
|
-
stmts << contruct_stmt_uri_object("
|
117
|
-
stmts << contruct_stmt_uri_object("
|
118
|
-
stmts << contruct_stmt_uri_object(
|
119
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn#{count}")
|
120
|
+
stmts << contruct_stmt_uri_object("contrbn#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bflc/PrimaryContribution")
|
121
|
+
stmts << contruct_stmt_uri_object("contrbn#{count}", bf_agent_predicate, "agentn#{count}")
|
122
|
+
stmts << contruct_stmt_uri_object("agentn#{count}", rdf_type_predicate, bf_agent_type_object)
|
123
|
+
stmts << contruct_stmt_literal_object("agentn#{count}", rdfs_label_predicate, artist["name"])
|
119
124
|
count += 1
|
120
125
|
end
|
121
126
|
end
|
@@ -9,9 +9,11 @@ module Qa::Authorities
|
|
9
9
|
# @param [String] either a string used to create a unique URI or an LOC uri in string format
|
10
10
|
# @param [String] or [Class] either a BIBFRAME property uri in string format or an RDF::URI
|
11
11
|
# @param [String] or [Class] strings can be a label or BIBFRAME class uri; class is always RDF::URI
|
12
|
-
# @return [Class] RDF::Statement with uri as the object
|
12
|
+
# @return [Class] RDF::Statement with either a uri or a bnode as the object
|
13
13
|
def contruct_stmt_uri_object(subject, predicate, object)
|
14
|
-
|
14
|
+
s = subject.include?("http") ? RDF::URI.new(subject) : subject.to_sym
|
15
|
+
o = object.to_s.include?("http") ? RDF::URI.new(object) : object.to_sym
|
16
|
+
RDF::Statement(s, RDF::URI(predicate), o)
|
15
17
|
end
|
16
18
|
|
17
19
|
# Constructs an RDF statement where the subject and predicate are URIs and the object is a literal
|
@@ -20,7 +22,8 @@ module Qa::Authorities
|
|
20
22
|
# @param [String] or [Class] strings can be a label or BIBFRAME class uri; class is always RDF::URI
|
21
23
|
# @return [Class] RDF::Statement with a literal as the object
|
22
24
|
def contruct_stmt_literal_object(subject, predicate, object)
|
23
|
-
|
25
|
+
s = subject.include?("http") ? RDF::URI.new(subject) : subject.to_sym
|
26
|
+
RDF::Statement(s, RDF::URI(predicate), RDF::Literal.new(object))
|
24
27
|
end
|
25
28
|
|
26
29
|
# frequently used predicates and objects
|
@@ -41,7 +44,7 @@ module Qa::Authorities
|
|
41
44
|
end
|
42
45
|
|
43
46
|
def bf_agent_type_object
|
44
|
-
|
47
|
+
"http://id.loc.gov/ontologies/bibframe/Agent"
|
45
48
|
end
|
46
49
|
|
47
50
|
def bf_role_predicate
|
@@ -49,7 +52,7 @@ module Qa::Authorities
|
|
49
52
|
end
|
50
53
|
|
51
54
|
def bf_role_type_object
|
52
|
-
|
55
|
+
"http://id.loc.gov/ontologies/bibframe/Role"
|
53
56
|
end
|
54
57
|
|
55
58
|
def discogs_genres
|
@@ -62,27 +65,36 @@ module Qa::Authorities
|
|
62
65
|
|
63
66
|
# both the work and the instance require a statement for the release year
|
64
67
|
# @param [Hash] the http response from discogs
|
65
|
-
# @param [String] either "Work" or "Instance"
|
66
68
|
# @return [Array] rdf statements
|
67
|
-
def build_year_statements(response
|
69
|
+
def build_year_statements(response)
|
68
70
|
year_stmts = []
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
year_stmts = get_year_rdf(type + "1", response["released"])
|
73
|
-
end
|
71
|
+
year_stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/provisionActivity", "daten1")
|
72
|
+
year_stmts << contruct_stmt_uri_object("daten1", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Publication")
|
73
|
+
year_stmts << contruct_stmt_literal_object("daten1", RDF::URI("http://id.loc.gov/ontologies/bibframe/date"), response["released"].to_s)
|
74
74
|
year_stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
75
75
|
end
|
76
76
|
|
77
|
-
# @param [
|
78
|
-
# @param [
|
77
|
+
# @param [Hash] the extraartists defined at the release level, not the track level
|
78
|
+
# @param [Integer] gives the role a unique uri
|
79
|
+
# @param [String] the entity type name
|
79
80
|
# @return [Array] rdf statements
|
80
|
-
def
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
def build_role_stmts(subject_node, role_node, label)
|
82
|
+
stmts = []
|
83
|
+
stmts << contruct_stmt_uri_object(subject_node, bf_role_predicate, role_node)
|
84
|
+
stmts << contruct_stmt_uri_object(role_node, rdf_type_predicate, bf_role_type_object)
|
85
|
+
stmts << contruct_stmt_literal_object(role_node, rdfs_label_predicate, label)
|
86
|
+
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
87
|
+
end
|
88
|
+
|
89
|
+
# @param [String] the playing speed in string format
|
90
|
+
# @param [Integer] gives the playing speed a unique uri
|
91
|
+
# @return [Array] rdf statements
|
92
|
+
def build_playing_speed_stmts(label, count)
|
93
|
+
stmts = []
|
94
|
+
stmts << contruct_stmt_uri_object(instance_uri, "http://id.loc.gov/ontologies/bibframe/soundCharacteristic", "speed#{count}")
|
95
|
+
stmts << contruct_stmt_uri_object("speed#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/PlayingSpeed")
|
96
|
+
stmts << contruct_stmt_literal_object("speed#{count}", rdfs_label_predicate, label)
|
97
|
+
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
86
98
|
end
|
87
99
|
end
|
88
100
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rdf'
|
2
2
|
module Qa::Authorities
|
3
3
|
module Discogs
|
4
|
-
module DiscogsWorksBuilder
|
4
|
+
module DiscogsWorksBuilder
|
5
5
|
include Discogs::DiscogsUtils
|
6
6
|
|
7
7
|
# @param [Hash] the http response from discogs
|
@@ -12,27 +12,17 @@ module Qa::Authorities
|
|
12
12
|
count = 1
|
13
13
|
return stmts unless response["extraartists"].present?
|
14
14
|
response["extraartists"].each do |artist|
|
15
|
-
stmts << contruct_stmt_uri_object(
|
16
|
-
stmts << contruct_stmt_uri_object("
|
17
|
-
stmts << contruct_stmt_uri_object("
|
18
|
-
stmts << contruct_stmt_uri_object(
|
19
|
-
stmts
|
15
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn1#{count}")
|
16
|
+
stmts << contruct_stmt_uri_object("contrbn1#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Contribution")
|
17
|
+
stmts << contruct_stmt_uri_object("contrbn1#{count}", bf_agent_predicate, "agentn1#{count}")
|
18
|
+
stmts << contruct_stmt_uri_object("agentn1#{count}", rdf_type_predicate, bf_agent_type_object)
|
19
|
+
stmts << contruct_stmt_literal_object("agentn1#{count}", rdfs_label_predicate, artist["name"])
|
20
|
+
stmts += build_role_stmts("agentn1#{count}", "rolen1#{count}", artist["role"])
|
20
21
|
count += 1
|
21
22
|
end
|
22
23
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
23
24
|
end
|
24
25
|
|
25
|
-
# @param [Hash] the extraartists defined at the release level, not the track level
|
26
|
-
# @param [Integer] gives the role a unique uri
|
27
|
-
# @return [Array] rdf statements
|
28
|
-
def build_artist_role_stmts(artist, count)
|
29
|
-
stmts = []
|
30
|
-
stmts << contruct_stmt_uri_object(artist["name"], bf_role_predicate, "Work1SecondaryContributor_Role#{count}")
|
31
|
-
stmts << contruct_stmt_uri_object("Work1SecondaryContributor_Role#{count}", rdf_type_predicate, bf_role_type_object)
|
32
|
-
stmts << contruct_stmt_literal_object("Work1SecondaryContributor_Role#{count}", rdfs_label_predicate, artist["role"])
|
33
|
-
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
34
|
-
end
|
35
|
-
|
36
26
|
# @param [Hash] the http response from discogs
|
37
27
|
# @return [Array] rdf statements
|
38
28
|
def get_genres_stmts(response)
|
@@ -54,24 +44,13 @@ module Qa::Authorities
|
|
54
44
|
stmts = []
|
55
45
|
dg = discogs_genres[genre.gsub(/\s+/, "")]
|
56
46
|
if dg.present?
|
57
|
-
stmts << contruct_stmt_uri_object(
|
47
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/genreForm", dg["uri"])
|
58
48
|
stmts << contruct_stmt_uri_object(dg["uri"], rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/GenreForm")
|
59
49
|
stmts << contruct_stmt_literal_object(dg["uri"], rdfs_label_predicate, dg["label"])
|
60
50
|
end
|
61
51
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
62
52
|
end
|
63
53
|
|
64
|
-
# @param [String] the uri of the genreForm
|
65
|
-
# @param [String] the genreForm label
|
66
|
-
# @return [Array] rdf statements
|
67
|
-
def build_genres_and_styles(uri, dg_label)
|
68
|
-
stmts = []
|
69
|
-
stmts << contruct_stmt_uri_object("Work1", "http://id.loc.gov/ontologies/bibframe/genreForm", uri)
|
70
|
-
stmts << contruct_stmt_uri_object(uri, rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/GenreForm")
|
71
|
-
stmts << contruct_stmt_literal_object(uri, rdfs_label_predicate, dg_label)
|
72
|
-
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
73
|
-
end
|
74
|
-
|
75
54
|
# @param [Hash] the http response from discogs
|
76
55
|
# @return [Array] rdf statements
|
77
56
|
def get_tracklist_artists_stmts(response)
|
@@ -103,13 +82,13 @@ module Qa::Authorities
|
|
103
82
|
# @return [Array] rdf statements
|
104
83
|
def build_secondary_works(track, w_count)
|
105
84
|
stmts = []
|
106
|
-
stmts << contruct_stmt_uri_object(
|
107
|
-
stmts << contruct_stmt_uri_object("
|
108
|
-
stmts << contruct_stmt_uri_object("
|
109
|
-
stmts << contruct_stmt_uri_object("
|
110
|
-
stmts << contruct_stmt_uri_object("
|
111
|
-
stmts << contruct_stmt_literal_object("
|
112
|
-
stmts << contruct_stmt_literal_object("
|
85
|
+
stmts << contruct_stmt_uri_object(work_uri, "http://id.loc.gov/ontologies/bibframe/hasPart", "workn#{w_count}")
|
86
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Work")
|
87
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Audio")
|
88
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", "http://id.loc.gov/ontologies/bibframe/title", "titlen3#{w_count}")
|
89
|
+
stmts << contruct_stmt_uri_object("titlen3#{w_count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Title")
|
90
|
+
stmts << contruct_stmt_literal_object("titlen3#{w_count}", bf_main_title_predicate, track["title"])
|
91
|
+
stmts << contruct_stmt_literal_object("workn#{w_count}", "http://id.loc.gov/ontologies/bibframe/duration", track["duration"]) if track["duration"].present?
|
113
92
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
114
93
|
end
|
115
94
|
|
@@ -120,10 +99,11 @@ module Qa::Authorities
|
|
120
99
|
stmts = []
|
121
100
|
count = 1
|
122
101
|
artists.each do |artist|
|
123
|
-
stmts << contruct_stmt_uri_object("
|
124
|
-
stmts << contruct_stmt_uri_object("
|
125
|
-
stmts << contruct_stmt_uri_object("
|
126
|
-
stmts << contruct_stmt_uri_object(
|
102
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn#{w_count}#{count}")
|
103
|
+
stmts << contruct_stmt_uri_object("contrbn#{w_count}#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bflc/PrimaryContribution")
|
104
|
+
stmts << contruct_stmt_uri_object("contrbn#{w_count}#{count}", bf_agent_predicate, "agentn#{w_count}#{count}")
|
105
|
+
stmts << contruct_stmt_uri_object("agentn#{w_count}#{count}", rdf_type_predicate, bf_agent_type_object)
|
106
|
+
stmts << contruct_stmt_literal_object("agentn#{w_count}#{count}", rdfs_label_predicate, artist["name"])
|
127
107
|
count += 1
|
128
108
|
end
|
129
109
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
@@ -137,13 +117,12 @@ module Qa::Authorities
|
|
137
117
|
# to distinguish among contributors to a track/work and their roles
|
138
118
|
count = 1
|
139
119
|
extraartists.each do |artist|
|
140
|
-
stmts << contruct_stmt_uri_object("
|
141
|
-
stmts << contruct_stmt_uri_object("
|
142
|
-
stmts << contruct_stmt_uri_object("
|
143
|
-
stmts << contruct_stmt_uri_object(
|
144
|
-
stmts <<
|
145
|
-
stmts
|
146
|
-
stmts << contruct_stmt_literal_object("Work#{w_count}ContributorRole#{count}", rdfs_label_predicate, artist["role"])
|
120
|
+
stmts << contruct_stmt_uri_object("workn#{w_count}", "http://id.loc.gov/ontologies/bibframe/contribution", "contrbn#{w_count}2#{count}")
|
121
|
+
stmts << contruct_stmt_uri_object("contrbn#{w_count}2#{count}", rdf_type_predicate, "http://id.loc.gov/ontologies/bibframe/Contribution")
|
122
|
+
stmts << contruct_stmt_uri_object("contrbn#{w_count}2#{count}", bf_agent_predicate, "agentn#{w_count}2#{count}")
|
123
|
+
stmts << contruct_stmt_uri_object("agentn#{w_count}2#{count}", rdf_type_predicate, bf_agent_type_object)
|
124
|
+
stmts << contruct_stmt_literal_object("agentn#{w_count}2#{count}", rdfs_label_predicate, artist["name"])
|
125
|
+
stmts += build_role_stmts("agentn#{w_count}2#{count}", "role2#{w_count}#{count}", artist["role"])
|
147
126
|
count += 1
|
148
127
|
end
|
149
128
|
stmts # w/out this line, building the graph throws an undefined method `graph_name=' error
|
@@ -1,16 +1,19 @@
|
|
1
1
|
require 'rdf'
|
2
|
+
require 'rdf/ntriples'
|
2
3
|
module Qa::Authorities
|
3
4
|
class Discogs::GenericAuthority < Base
|
4
5
|
include WebServiceBase
|
5
6
|
include Discogs::DiscogsTranslation
|
6
7
|
|
7
8
|
class_attribute :discogs_secret, :discogs_key
|
8
|
-
attr_accessor :primary_artists
|
9
|
+
attr_accessor :primary_artists, :selected_format, :work_uri, :instance_uri
|
9
10
|
|
10
11
|
# @param [String] subauthority to use
|
11
12
|
def initialize(subauthority)
|
12
13
|
@subauthority = subauthority
|
13
14
|
self.primary_artists = []
|
15
|
+
self.work_uri = "http://generic.uri/workn1"
|
16
|
+
self.instance_uri = "http://generic.uri/instn1"
|
14
17
|
end
|
15
18
|
|
16
19
|
# @param [String] the query
|
@@ -35,12 +38,14 @@ module Qa::Authorities
|
|
35
38
|
#
|
36
39
|
# @param [String] the Discogs id of the selected item
|
37
40
|
# @param [Class] QA::TermsController
|
38
|
-
# @return results in requested format (supports: json, jsonld, n3)
|
41
|
+
# @return results in requested format (supports: json, jsonld, n3, ntriples)
|
39
42
|
def find(id, tc)
|
40
43
|
response = tc.params["subauthority"].include?("all") ? fetch_discogs_results(id) : json(find_url(id, tc.params["subauthority"]))
|
44
|
+
self.selected_format = tc.params["format"]
|
41
45
|
return response if response["message"].present?
|
42
46
|
return build_graph(response, format: :jsonld) if jsonld?(tc)
|
43
47
|
return build_graph(response, format: :n3) if n3?(tc)
|
48
|
+
return build_graph(response, format: :ntriples) if ntriples?(tc)
|
44
49
|
response
|
45
50
|
end
|
46
51
|
|
@@ -164,8 +169,12 @@ module Qa::Authorities
|
|
164
169
|
format(tc).casecmp?('n3')
|
165
170
|
end
|
166
171
|
|
172
|
+
def ntriples?(tc)
|
173
|
+
format(tc).casecmp?('ntriples')
|
174
|
+
end
|
175
|
+
|
167
176
|
def graph_format?(tc)
|
168
|
-
jsonld?(tc) || n3?(tc)
|
177
|
+
jsonld?(tc) || n3?(tc) || ntriples?(tc)
|
169
178
|
end
|
170
179
|
end
|
171
180
|
end
|
@@ -74,10 +74,10 @@ module Qa::Authorities
|
|
74
74
|
|
75
75
|
def normalize_results
|
76
76
|
normalize_start_dt = Time.now.utc
|
77
|
-
normalize_end_dt = Time.now.utc
|
78
77
|
|
79
78
|
json = perform_normalization
|
80
79
|
|
80
|
+
normalize_end_dt = Time.now.utc
|
81
81
|
@normalize_time_s = normalize_end_dt - normalize_start_dt
|
82
82
|
@normalized_size = json.to_s.size if performance_data?
|
83
83
|
Rails.logger.info("Time to convert data to json: #{normalize_time_s}s")
|
@@ -89,6 +89,7 @@ module Qa::Authorities
|
|
89
89
|
return "{}" unless full_graph.size.positive?
|
90
90
|
return full_graph.dump(:jsonld, standard_prefixes: true) if jsonld?
|
91
91
|
return full_graph.dump(:n3, standard_prefixes: true) if n3?
|
92
|
+
return full_graph.dump(:ntriples, standard_prefixes: true) if ntriples?
|
92
93
|
|
93
94
|
filter_graph
|
94
95
|
extract_uri
|
@@ -201,6 +202,10 @@ module Qa::Authorities
|
|
201
202
|
@format && @format.casecmp?('n3')
|
202
203
|
end
|
203
204
|
|
205
|
+
def ntriples?
|
206
|
+
@format && @format.casecmp?('ntriples')
|
207
|
+
end
|
208
|
+
|
204
209
|
def performance_data?
|
205
210
|
@performance_data == true && !jsonld?
|
206
211
|
end
|
data/lib/qa/version.rb
CHANGED
@@ -434,6 +434,15 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
434
434
|
expect(response.body).to start_with "@prefix"
|
435
435
|
end
|
436
436
|
end
|
437
|
+
|
438
|
+
context 'and it was requested as ntriples' do
|
439
|
+
it 'succeeds and returns term data as ntriples content type' do
|
440
|
+
get :show, params: { id: '530369', vocab: 'OCLC_FAST', format: 'ntriples' }
|
441
|
+
expect(response).to be_successful
|
442
|
+
expect(response.content_type).to eq 'application/n-triples'
|
443
|
+
expect(response.body).to include('<http://id.worldcat.org/fast/530369> <http://www.w3.org/2004/02/skos/core#prefLabel> "Cornell University"')
|
444
|
+
end
|
445
|
+
end
|
437
446
|
end
|
438
447
|
|
439
448
|
context 'when cors headers are enabled' do
|
@@ -605,6 +614,15 @@ describe Qa::LinkedDataTermsController, type: :controller do
|
|
605
614
|
end
|
606
615
|
end
|
607
616
|
|
617
|
+
context 'and it was requested as ntriples' do
|
618
|
+
it 'succeeds and returns term data as ntriples content type' do
|
619
|
+
get :fetch, params: { uri: 'http://id.worldcat.org/fast/530369', vocab: 'LOD_TERM_URI_PARAM_CONFIG', format: 'ntriples' }
|
620
|
+
expect(response).to be_successful
|
621
|
+
expect(response.content_type).to eq 'application/n-triples'
|
622
|
+
expect(response.body).to include('<http://id.worldcat.org/fast/530369> <http://www.w3.org/2004/02/skos/core#prefLabel> "Cornell University"')
|
623
|
+
end
|
624
|
+
end
|
625
|
+
|
608
626
|
context 'blank nodes not included in predicates list' do
|
609
627
|
before do
|
610
628
|
stub_request(:get, 'http://localhost/test_default/term?uri=http://id.worldcat.org/fast/530369wbn')
|
@@ -240,5 +240,17 @@ describe Qa::TermsController, type: :controller do
|
|
240
240
|
expect(response.body).to start_with "@prefix"
|
241
241
|
end
|
242
242
|
end
|
243
|
+
context "with request for ntriples" do
|
244
|
+
before do
|
245
|
+
stub_request(:get, "https://api.discogs.com/releases/3380671")
|
246
|
+
.to_return(status: 200, body: webmock_fixture("discogs-find-response-json.json"))
|
247
|
+
end
|
248
|
+
it 'Access-Control-Allow-Origin is not present' do
|
249
|
+
get :show, params: { vocab: "discogs", subauthority: "release", id: "3380671", format: 'ntriples' }
|
250
|
+
expect(response).to be_successful
|
251
|
+
expect(response.content_type).to eq 'application/n-triples'
|
252
|
+
expect(response.body).to include('_:agentn1 <http://www.w3.org/2000/01/rdf-schema#label> "Dexter Gordon"')
|
253
|
+
end
|
254
|
+
end
|
243
255
|
end
|
244
256
|
end
|
@@ -158,6 +158,28 @@ describe Qa::Authorities::Discogs::GenericAuthority do
|
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
161
|
+
context "ntriples format and subauthority master" do
|
162
|
+
let(:tc) { instance_double(Qa::TermsController) }
|
163
|
+
let :results do
|
164
|
+
authority.find("950011", tc)
|
165
|
+
end
|
166
|
+
before do
|
167
|
+
allow(Qa::TermsController).to receive(:new).and_return(tc)
|
168
|
+
allow(tc).to receive(:params).and_return('format' => "ntriples", 'subauthority' => "master")
|
169
|
+
end
|
170
|
+
|
171
|
+
it "returns the Discogs data converted to ntriples for a given id" do
|
172
|
+
expect(results).to include("https://www.discogs.com/Billie-Holiday-And-Her-Orchestra-Blue-Moon-You-Go-To-My-Head/master/950011")
|
173
|
+
expect(results).to include("Blue Moon / You Go To My Head")
|
174
|
+
expect(results).to include("Billie Holiday And Her Orchestra")
|
175
|
+
expect(results).to include("Haven Gillespie")
|
176
|
+
expect(results).to include("1952")
|
177
|
+
expect(results).to include("Jazz")
|
178
|
+
expect(results).to include("Barney Kessel")
|
179
|
+
expect(results).to include("Guitar")
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
161
183
|
context "json-ld format and subauthority all" do
|
162
184
|
let(:tc) { instance_double(Qa::TermsController) }
|
163
185
|
let :results do
|
@@ -208,6 +230,31 @@ describe Qa::Authorities::Discogs::GenericAuthority do
|
|
208
230
|
expect(results).to include("1952")
|
209
231
|
end
|
210
232
|
end
|
233
|
+
|
234
|
+
context "ntriples format and subauthority all" do
|
235
|
+
let(:tc) { instance_double(Qa::TermsController) }
|
236
|
+
let :results do
|
237
|
+
authority.find("7143179", tc)
|
238
|
+
end
|
239
|
+
before do
|
240
|
+
allow(Qa::TermsController).to receive(:new).and_return(tc)
|
241
|
+
allow(tc).to receive(:params).and_return('format' => "ntriples", 'subauthority' => "all")
|
242
|
+
end
|
243
|
+
|
244
|
+
it "returns the Discogs data converted to ntriples for a given id" do
|
245
|
+
expect(results).to include("https://www.discogs.com/Billie-Holiday-And-Her-Orchestra-Blue-Moon-You-Go-To-My-Head/release/7143179")
|
246
|
+
expect(results).to include("You Go To My Head")
|
247
|
+
expect(results).to include("Rodgers & Hart")
|
248
|
+
expect(results).to include("Ray Brown")
|
249
|
+
expect(results).to include("1952")
|
250
|
+
expect(results).to include("Single")
|
251
|
+
expect(results).to include("mono")
|
252
|
+
expect(results).to include("45 RPM")
|
253
|
+
expect(results).to include("Vinyl")
|
254
|
+
expect(results).to include("http://id.loc.gov/vocabulary/carriers/sd")
|
255
|
+
expect(results).to include("1952")
|
256
|
+
end
|
257
|
+
end
|
211
258
|
end
|
212
259
|
end
|
213
260
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.2.
|
4
|
+
version: 4.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Anderson
|
@@ -16,7 +16,7 @@ authors:
|
|
16
16
|
autorequire:
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
|
-
date: 2019-
|
19
|
+
date: 2019-10-10 00:00:00.000000000 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: activerecord-import
|