publish_my_data 0.0.29 → 0.0.30
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.
- data/app/controllers/concerns/publish_my_data/data_download.rb +22 -0
- data/app/controllers/concerns/publish_my_data/resource_rendering.rb +40 -0
- data/app/controllers/concerns/publish_my_data/sparql_processing.rb +81 -0
- data/app/controllers/publish_my_data/datasets_controller.rb +5 -23
- data/app/controllers/publish_my_data/information_resources_controller.rb +26 -4
- data/app/controllers/publish_my_data/queries_controller.rb +1 -1
- data/app/controllers/publish_my_data/resources_controller.rb +5 -9
- data/app/controllers/publish_my_data/sparql_controller.rb +1 -1
- data/app/controllers/publish_my_data/vocabularies_controller.rb +18 -0
- data/app/models/concerns/publish_my_data/all_features.rb +79 -0
- data/app/models/concerns/publish_my_data/basic_features.rb +21 -0
- data/app/models/concerns/publish_my_data/dataset_powers.rb +130 -0
- data/{lib → app/models/concerns}/publish_my_data/defined_by_ontology.rb +5 -0
- data/app/models/publish_my_data/concept.rb +2 -2
- data/app/models/publish_my_data/concept_scheme.rb +31 -3
- data/app/models/publish_my_data/dataset.rb +2 -128
- data/app/models/publish_my_data/example_resource.rb +21 -0
- data/app/models/publish_my_data/ontology.rb +35 -6
- data/app/models/publish_my_data/ontology_class.rb +3 -5
- data/app/models/publish_my_data/property.rb +3 -5
- data/app/models/publish_my_data/rdf_type.rb +1 -2
- data/app/models/publish_my_data/resource.rb +25 -96
- data/app/models/publish_my_data/theme.rb +1 -3
- data/app/models/publish_my_data/third_party/concept_scheme.rb +30 -0
- data/app/models/publish_my_data/third_party/ontology.rb +30 -0
- data/app/models/publish_my_data/vocabulary.rb +22 -0
- data/app/views/publish_my_data/classes/show.html.erb +3 -0
- data/app/views/publish_my_data/concept_schemes/_concepts.html.erb +18 -3
- data/app/views/publish_my_data/concept_schemes/show.html.erb +3 -1
- data/app/views/publish_my_data/concepts/show.html.erb +3 -3
- data/app/views/publish_my_data/datasets/show.html.erb +2 -2
- data/app/views/publish_my_data/ontologies/show.html.erb +6 -6
- data/app/views/publish_my_data/properties/show.html.erb +3 -3
- data/app/views/publish_my_data/resources/_summaries.html.erb +18 -0
- data/app/views/publish_my_data/resources/show.html.erb +3 -3
- data/config/routes.rb +8 -4
- data/lib/publish_my_data.rb +14 -5
- data/lib/publish_my_data/engine.rb +3 -0
- data/lib/publish_my_data/version.rb +1 -1
- data/spec/controllers/publish_my_data/datasets_controller_spec.rb +3 -3
- data/spec/controllers/publish_my_data/information_resources_controller_spec.rb +158 -104
- data/spec/controllers/publish_my_data/resources_controller_spec.rb +0 -71
- data/spec/controllers/publish_my_data/vocabularies_controller_spec.rb +14 -0
- data/spec/dummy/config/environments/development.rb +1 -1
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/log/test.log +208075 -0
- data/spec/factories/concept_scheme_factories.rb +17 -13
- data/spec/factories/dataset_factories.rb +2 -0
- data/spec/factories/example_resource_factories.rb +9 -0
- data/spec/factories/ontology_factories.rb +17 -12
- data/spec/factories/property_factories.rb +1 -1
- data/spec/factories/resource_factories.rb +10 -0
- data/spec/features/running_a_sparql_query_spec.rb +2 -2
- data/spec/features/viewing_resources_spec.rb +96 -0
- data/spec/{renderers → lib}/publish_my_data/renderers_spec.rb +0 -0
- data/spec/models/publish_my_data/concept_scheme_spec.rb +20 -0
- data/spec/models/publish_my_data/dataset_spec.rb +113 -11
- data/spec/models/publish_my_data/example_resource_spec.rb +18 -0
- data/spec/models/publish_my_data/ontology_spec.rb +20 -0
- data/spec/models/publish_my_data/resource_spec.rb +63 -0
- data/spec/models/publish_my_data/third_party_concept_scheme_spec.rb +16 -0
- data/spec/models/publish_my_data/third_party_ontology_spec.rb +16 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/all_features.rb +26 -0
- data/spec/support/data_download.rb +60 -0
- data/spec/support/vocabularies.rb +150 -0
- metadata +53 -33
- data/app/views/publish_my_data/ontologies/_classes.html.erb +0 -3
- data/app/views/publish_my_data/ontologies/_properties.html.erb +0 -3
- data/config/initializers/zz_factories.rb +0 -7
- data/lib/publish_my_data/concerns.rb +0 -4
- data/lib/publish_my_data/concerns/controllers/resource.rb +0 -23
- data/lib/publish_my_data/concerns/controllers/sparql.rb +0 -86
- data/lib/publish_my_data/concerns/models/resource.rb +0 -14
- data/lib/publish_my_data/render_params.rb +0 -7
- data/lib/publish_my_data/render_params/concept_render_params.rb +0 -18
- data/lib/publish_my_data/render_params/concept_scheme_render_params.rb +0 -31
- data/lib/publish_my_data/render_params/dataset_render_params.rb +0 -32
- data/lib/publish_my_data/render_params/ontology_class_render_params.rb +0 -18
- data/lib/publish_my_data/render_params/ontology_render_params.rb +0 -41
- data/lib/publish_my_data/render_params/property_render_params.rb +0 -18
- data/lib/publish_my_data/render_params/resource_render_params.rb +0 -17
@@ -0,0 +1,22 @@
|
|
1
|
+
module PublishMyData
|
2
|
+
module DataDownload
|
3
|
+
def find_latest_download_url_for_resource(resource)
|
4
|
+
# find the latest download for this dataset
|
5
|
+
# Note: filenames on s3 take the format: "<prefix>_<slug>_<time>.nt.zip"
|
6
|
+
# Only look for ones that were made on the same day as the the modified date, to restrict the results
|
7
|
+
# (v. small possibility of errors for changes aroung midnight, but unlikely people will be changing datasets then anyway!)
|
8
|
+
s3 = AWS::S3.new
|
9
|
+
downloads = s3.buckets[PublishMyData.downloads_s3_bucket].objects.with_prefix(resource.download_prefix).to_a
|
10
|
+
|
11
|
+
download_url = nil
|
12
|
+
if downloads.any?
|
13
|
+
download_url = downloads.last.public_url.to_s
|
14
|
+
end
|
15
|
+
download_url
|
16
|
+
end
|
17
|
+
|
18
|
+
def type_for_resource(resource)
|
19
|
+
resource.class.name.demodulize.underscore # ontology, concept_scheme or vocabulary
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module PublishMyData
|
2
|
+
module ResourceRendering
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def render_resource(resource)
|
10
|
+
respond_with(resource) do |format|
|
11
|
+
format.html do
|
12
|
+
resource.eager_load!
|
13
|
+
|
14
|
+
logger.debug(locals_for_resource(resource))
|
15
|
+
render template: template_for_resource(resource), locals: locals_for_resource(resource)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def template_for_resource(resource)
|
21
|
+
{
|
22
|
+
Dataset => 'publish_my_data/datasets/show',
|
23
|
+
Ontology => 'publish_my_data/ontologies/show',
|
24
|
+
ConceptScheme => 'publish_my_data/concept_schemes/show',
|
25
|
+
OntologyClass => 'publish_my_data/classes/show',
|
26
|
+
Property => 'publish_my_data/properties/show',
|
27
|
+
Concept => 'publish_my_data/concepts/show',
|
28
|
+
Resource => 'publish_my_data/resources/show',
|
29
|
+
ThirdParty::Ontology => 'publish_my_data/ontologies/show',
|
30
|
+
ThirdParty::ConceptScheme => 'publish_my_data/concept_schemes/show'
|
31
|
+
}[resource.class]
|
32
|
+
end
|
33
|
+
|
34
|
+
def locals_for_resource(resource)
|
35
|
+
key = resource.class.name.demodulize.underscore.to_sym
|
36
|
+
{key => resource}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module PublishMyData
|
2
|
+
module SparqlProcessing
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
|
7
|
+
rescue_from PublishMyData::SparqlQueryExecutionException, :with => :show_sparql_execution_message
|
8
|
+
|
9
|
+
rescue_from PublishMyData::SparqlQueryMissingVariablesException, :with => :missing_variables
|
10
|
+
|
11
|
+
respond_to :html, :csv, :text, :nt, :ttl, :xml, :rdf, :json
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def check_format
|
16
|
+
unless request.format
|
17
|
+
head :status => 406
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def build_sparql_query(query_text)
|
23
|
+
interpolations = request.params.reject{ |p| ['controller', 'action', 'page', 'per_page', 'id', 'commit' ,'utf8', 'query'].include?(p) }
|
24
|
+
PublishMyData::SparqlQuery.new(query_text, {
|
25
|
+
:request_format => request.format.to_sym,
|
26
|
+
:interpolations => interpolations
|
27
|
+
})
|
28
|
+
end
|
29
|
+
|
30
|
+
# process the sparql query, paginating if appropriate
|
31
|
+
def process_sparql_query(sparql_query)
|
32
|
+
if sparql_query.allow_pagination?
|
33
|
+
|
34
|
+
@pagination_params = SparqlPaginationParams.from_request(request)
|
35
|
+
|
36
|
+
# if there are pagination paramters, then use them
|
37
|
+
if @pagination_params.per_page && @pagination_params.page
|
38
|
+
sparql_query_result = sparql_query.paginate(@pagination_params.page, @pagination_params.per_page)
|
39
|
+
if is_request_html_format?
|
40
|
+
count = sparql_query.as_pagination_query(@pagination_params.page, @pagination_params.per_page, 1).count
|
41
|
+
@more_pages = (count > @pagination_params.per_page)
|
42
|
+
end
|
43
|
+
# otherwise just execute
|
44
|
+
else
|
45
|
+
sparql_query_result = @sparql_query.execute
|
46
|
+
end
|
47
|
+
else
|
48
|
+
# pagination not allowed - just execute.
|
49
|
+
sparql_query_result = @sparql_query.execute
|
50
|
+
end
|
51
|
+
|
52
|
+
add_json_p_callback(sparql_query_result)
|
53
|
+
end
|
54
|
+
|
55
|
+
def respond_with_error
|
56
|
+
respond_to do |format|
|
57
|
+
format.html { render 'publish_my_data/sparql/endpoint' }
|
58
|
+
format.any { render :text => @error_message, :status => 400 }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def missing_variables(e)
|
63
|
+
@error_message = e.message
|
64
|
+
respond_with_error
|
65
|
+
end
|
66
|
+
|
67
|
+
def show_sparql_execution_message(e)
|
68
|
+
@error_message = "There was a syntax error in your query: #{e.message}"
|
69
|
+
respond_with_error
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_json_p_callback(result)
|
73
|
+
if request.format && request.format.json?
|
74
|
+
params[:callback] ? "#{params[:callback]}(#{result});" : result
|
75
|
+
else
|
76
|
+
result
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -2,36 +2,18 @@ require_dependency "publish_my_data/application_controller"
|
|
2
2
|
|
3
3
|
module PublishMyData
|
4
4
|
class DatasetsController < ApplicationController
|
5
|
+
include PublishMyData::DataDownload
|
5
6
|
|
6
7
|
respond_to :html, :ttl, :rdf, :nt, :json, :text
|
7
8
|
|
8
9
|
def dump
|
9
|
-
s3 = AWS::S3.new
|
10
10
|
@dataset = Dataset.find_by_slug(params[:id])
|
11
|
-
|
12
|
-
# find the latest download for this dataset
|
13
|
-
# Note: filenames on s3 take the format: "dataset_data_<slug>_time.nt.zip"
|
14
|
-
# Only look for ones that were made on the same day as the the modified date, to restrict the results
|
15
|
-
# (v. small possibility of errors for changes aroung midnight, but unlikely people will be changing datasets then anyway!)
|
16
|
-
prefix = "dataset_data_#{@dataset.slug.gsub('/', '|')}_#{@dataset.modified.strftime("%Y%m%d")}"
|
17
|
-
downloads = s3.buckets[PublishMyData.dataset_downloads_s3_bucket].objects.with_prefix(prefix).to_a
|
18
|
-
|
19
|
-
# filter the downloads to only include ones with a timestamp equal to or after the dataset modified date.
|
20
|
-
# (ones older than this are out of date)
|
21
|
-
current_downloads = downloads.select do |d|
|
22
|
-
date_portion = d.public_url.to_s.split("_").last.split('.').first #between last underscore and first dot.
|
23
|
-
file_timestamp = DateTime.parse(date_portion)
|
24
|
-
file_timestamp >= @dataset.modified
|
25
|
-
end
|
26
|
-
|
27
11
|
# if we can't find a current download it's cos we haven't generated it yet since ds was modified
|
28
12
|
# ... and we should 404.
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
raise Tripod::Errors::ResourceNotFound
|
34
|
-
end
|
13
|
+
url = find_latest_download_url_for_resource(@dataset)
|
14
|
+
raise Tripod::Errors::ResourceNotFound unless url
|
15
|
+
|
16
|
+
redirect_to url
|
35
17
|
end
|
36
18
|
|
37
19
|
# /data?page=2&per_page=10
|
@@ -3,15 +3,37 @@ require_dependency "publish_my_data/application_controller"
|
|
3
3
|
module PublishMyData
|
4
4
|
class InformationResourcesController < ApplicationController
|
5
5
|
|
6
|
+
include ResourceRendering
|
7
|
+
include DataDownload
|
8
|
+
|
6
9
|
respond_to :html, :ttl, :rdf, :nt, :json, :text
|
7
10
|
|
8
|
-
|
11
|
+
# http://example.com/data/blah
|
12
|
+
def data
|
13
|
+
uri = "http://#{PublishMyData.local_domain}/data/#{params[:id]}"
|
14
|
+
resource = PublishMyData::Resource.find(uri, local: true)
|
15
|
+
render_resource(resource)
|
16
|
+
end
|
9
17
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
18
|
+
# http://example.com/def/blah
|
19
|
+
def def
|
20
|
+
uri = "http://#{PublishMyData.local_domain}/def/#{params[:id]}"
|
21
|
+
resource = PublishMyData::Resource.find(uri, local: true)
|
22
|
+
render_resource(resource)
|
13
23
|
end
|
14
24
|
|
25
|
+
# http://example.com/def/blah/dump
|
26
|
+
def dump
|
27
|
+
uri = "http://#{PublishMyData.local_domain}/def/#{params[:id]}"
|
28
|
+
resource = PublishMyData::Resource.find(uri, local: true)
|
29
|
+
|
30
|
+
# if we can't find a current download it's cos we haven't generated it yet since ds was modified
|
31
|
+
# ... and we should 404.
|
32
|
+
url = find_latest_download_url_for_resource(resource)
|
33
|
+
raise Tripod::Errors::ResourceNotFound unless url
|
34
|
+
|
35
|
+
redirect_to url
|
36
|
+
end
|
15
37
|
end
|
16
38
|
|
17
39
|
end
|
@@ -3,7 +3,7 @@ require_dependency "publish_my_data/application_controller"
|
|
3
3
|
module PublishMyData
|
4
4
|
class QueriesController < ApplicationController
|
5
5
|
|
6
|
-
include PublishMyData::
|
6
|
+
include PublishMyData::SparqlProcessing
|
7
7
|
|
8
8
|
before_filter :check_format, :only => [:show]
|
9
9
|
|
@@ -3,7 +3,7 @@ require_dependency "publish_my_data/application_controller"
|
|
3
3
|
module PublishMyData
|
4
4
|
class ResourcesController < ApplicationController
|
5
5
|
|
6
|
-
include
|
6
|
+
include ResourceRendering
|
7
7
|
|
8
8
|
respond_to :html, :ttl, :rdf, :nt, :json, :text
|
9
9
|
|
@@ -30,7 +30,8 @@ module PublishMyData
|
|
30
30
|
|
31
31
|
if uri.present?
|
32
32
|
begin
|
33
|
-
|
33
|
+
resource = PublishMyData::Resource.find(uri, local: uri.starts_with?('http://' + PublishMyData.local_domain))
|
34
|
+
render_resource(resource)
|
34
35
|
rescue Tripod::Errors::ResourceNotFound
|
35
36
|
# if it's not there
|
36
37
|
respond_to do |format|
|
@@ -58,13 +59,8 @@ module PublishMyData
|
|
58
59
|
# http://example.com/doc/blah
|
59
60
|
def doc
|
60
61
|
uri = Resource.uri_from_host_and_doc_path(request.host, params[:path], params[:format])
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
# http://example.com/def/blah
|
65
|
-
def definition
|
66
|
-
uri = 'http://' + request.host + '/def/' + params[:path]
|
67
|
-
render_resource_with_uri(uri)
|
62
|
+
resource = PublishMyData::Resource.find(uri)
|
63
|
+
render_resource(resource)
|
68
64
|
end
|
69
65
|
|
70
66
|
private
|
@@ -3,7 +3,7 @@ require_dependency "publish_my_data/application_controller"
|
|
3
3
|
module PublishMyData
|
4
4
|
class SparqlController < ApplicationController
|
5
5
|
|
6
|
-
include PublishMyData::
|
6
|
+
include PublishMyData::SparqlProcessing
|
7
7
|
|
8
8
|
before_filter :check_format, :only => [:endpoint]
|
9
9
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_dependency "publish_my_data/application_controller"
|
2
|
+
|
3
|
+
module PublishMyData
|
4
|
+
class VocabulariesController < ApplicationController
|
5
|
+
include PublishMyData::DataDownload
|
6
|
+
|
7
|
+
def dump
|
8
|
+
vocabulary = Vocabulary.find_by_data_dump(request.url)
|
9
|
+
|
10
|
+
# if we can't find a current download it's cos we haven't generated it yet since ds was modified
|
11
|
+
# ... and we should 404.
|
12
|
+
url = find_latest_download_url_for_resource(vocabulary)
|
13
|
+
raise Tripod::Errors::ResourceNotFound unless url
|
14
|
+
|
15
|
+
redirect_to url
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module PublishMyData
|
2
|
+
module AllFeatures
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
include PublishMyData::BasicFeatures
|
7
|
+
|
8
|
+
# basics
|
9
|
+
field :title, RDF::DC.title
|
10
|
+
field :description, RDF::DC.description # long desc
|
11
|
+
|
12
|
+
# licence, owner, contact
|
13
|
+
field :publisher, RDF::DC.publisher, :is_uri => true # value is a URI of a publisher
|
14
|
+
field :license, RDF::DC.license, :is_uri => true # value is URI of where licence is defined.
|
15
|
+
field :contact_email, RDF::PMD_DS.contactEmail, :is_uri => true
|
16
|
+
# NOTE: for contact, use :publisher's foaf:mbox value (in this metadata graph).
|
17
|
+
|
18
|
+
# quality, updates, maintenance
|
19
|
+
field :issued, RDF::DC.issued, :datatype => RDF::XSD.dateTime # value is DateTime literal
|
20
|
+
field :modified, RDF::DC.modified, :datatype => RDF::XSD.dateTime # value is DateTime literal
|
21
|
+
# field :update_periodicity, RDF::DC.accrualPeriodicity # waiting for response on what the value should be.
|
22
|
+
|
23
|
+
# where to get it
|
24
|
+
field :data_dump, RDF::VOID.dataDump, :is_uri => true # full download URI
|
25
|
+
|
26
|
+
# what the data is about
|
27
|
+
field :tags, RDF::DCAT.keyword, :multivalued => true # values are string literals
|
28
|
+
|
29
|
+
# field :spatial_coverage, RDF::DC.spatial # value is a URI for region covered, e.g. England.
|
30
|
+
# field :temporal_coverage, RDF::DC.temporal # value is a time interval URI
|
31
|
+
# field :spatial_granularity, RDF::DC.spatial # value is class of the objects of refArea
|
32
|
+
# field :temporal_granularity, RDF::DC.temporal # value is class of objects of refPeriod
|
33
|
+
|
34
|
+
field :size, RDF::VOID.triples # value is integer.
|
35
|
+
field :replaced_by, RDF::DC.isReplacedBy, is_uri: true
|
36
|
+
|
37
|
+
cattr_accessor :_DEPRECATED_RDF_TYPE
|
38
|
+
end
|
39
|
+
|
40
|
+
def deprecated?
|
41
|
+
self.rdf_type.include?(self.class.get_deprecated_rdf_type)
|
42
|
+
end
|
43
|
+
|
44
|
+
def slug
|
45
|
+
self.class.slug_from_uri(self.uri)
|
46
|
+
end
|
47
|
+
|
48
|
+
def resource_type
|
49
|
+
self.class.name.demodulize.underscore
|
50
|
+
end
|
51
|
+
|
52
|
+
def download_prefix
|
53
|
+
"#{self.resource_type}_data_#{self.slug.gsub('/', '|')}_#{self.modified.strftime("%Y%m%d")}"
|
54
|
+
end
|
55
|
+
|
56
|
+
module ClassMethods
|
57
|
+
def deprecated_rdf_type(type)
|
58
|
+
self._DEPRECATED_RDF_TYPE = type
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_deprecated_rdf_type
|
62
|
+
self._DEPRECATED_RDF_TYPE
|
63
|
+
end
|
64
|
+
|
65
|
+
def uri_from_slug(slug)
|
66
|
+
# Implement!
|
67
|
+
end
|
68
|
+
|
69
|
+
def slug_from_uri(uri)
|
70
|
+
root_uri = self.uri_from_slug('')
|
71
|
+
uri.to_s.gsub(root_uri, '')
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_by_slug(slug)
|
75
|
+
find(uri_from_slug(slug))
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module PublishMyData
|
2
|
+
module BasicFeatures
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
field :label, RDF::RDFS.label # same as the title
|
7
|
+
field :comment, RDF::RDFS.comment #short desc
|
8
|
+
field :data_graph_uri, RDF::PMD_DS.graph, is_uri: true
|
9
|
+
end
|
10
|
+
|
11
|
+
# Is this resource in the host domain?
|
12
|
+
def in_domain?(domain)
|
13
|
+
uri.starts_with?("http://" + domain)
|
14
|
+
end
|
15
|
+
|
16
|
+
def eager_load!
|
17
|
+
eager_load_object_triples!(labels_only: true)
|
18
|
+
eager_load_predicate_triples!(labels_only: true)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module PublishMyData
|
2
|
+
module DatasetPowers
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
include PublishMyData::AllFeatures
|
7
|
+
field :theme, RDF::DCAT.theme, :is_uri => true
|
8
|
+
end
|
9
|
+
|
10
|
+
def metadata_graph_uri
|
11
|
+
self.class.metadata_graph_uri(self.slug)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_param
|
15
|
+
slug
|
16
|
+
end
|
17
|
+
|
18
|
+
def resources_in_dataset_criteria
|
19
|
+
Resource.all.graph(self.data_graph_uri)
|
20
|
+
end
|
21
|
+
|
22
|
+
def types
|
23
|
+
@types ||= RdfType.where('?s a ?uri').graph(self.data_graph_uri).resources
|
24
|
+
end
|
25
|
+
|
26
|
+
def type_count(type_uri)
|
27
|
+
count_query = "SELECT ?uri WHERE { GRAPH <#{self.data_graph_uri.to_s}> { ?uri a <#{type_uri.to_s}> } }"
|
28
|
+
SparqlQuery.new(count_query).count
|
29
|
+
end
|
30
|
+
|
31
|
+
def resource_count
|
32
|
+
self.types.map{|t| type_count(t.uri)}.sum
|
33
|
+
end
|
34
|
+
|
35
|
+
def example_resources
|
36
|
+
return @example_resources if @example_resources
|
37
|
+
|
38
|
+
resource_queries = self.types.map do |t|
|
39
|
+
"{ SELECT DISTINCT ?uri WHERE { ?uri a <#{t.uri.to_s}> } LIMIT 1 }"
|
40
|
+
end
|
41
|
+
query = "SELECT ?uri WHERE { GRAPH <#{self.data_graph_uri.to_s}> {"
|
42
|
+
query << resource_queries.join(" UNION ")
|
43
|
+
query << "}}"
|
44
|
+
@example_resources = ExampleResource.find_by_sparql(query)
|
45
|
+
@example_resources.each {|r| r.eager_load!}
|
46
|
+
@example_resources
|
47
|
+
end
|
48
|
+
|
49
|
+
def ontologies
|
50
|
+
return @ontologies if @ontologies
|
51
|
+
|
52
|
+
query = "SELECT DISTINCT ?uri WHERE {"
|
53
|
+
query << " GRAPH <#{self.data_graph_uri.to_s}> {?s ?p ?o}"
|
54
|
+
query << " { ?p <http://www.w3.org/2000/01/rdf-schema#isDefinedBy> ?uri } UNION { ?o <http://www.w3.org/2000/01/rdf-schema#isDefinedBy> ?uri }"
|
55
|
+
query << " ?uri a <http://www.w3.org/2002/07/owl#Ontology>."
|
56
|
+
query << "}"
|
57
|
+
@ontologies = Ontology.find_by_sparql(query)
|
58
|
+
end
|
59
|
+
|
60
|
+
def concept_schemes
|
61
|
+
return @concept_schemes if @concept_schemes
|
62
|
+
|
63
|
+
query = "SELECT DISTINCT ?uri WHERE {"
|
64
|
+
query << " GRAPH <#{self.data_graph_uri.to_s}> {?s ?p ?o}"
|
65
|
+
query << " { ?p <http://www.w3.org/2004/02/skos/core#inScheme> ?uri } UNION { ?o <http://www.w3.org/2004/02/skos/core#inScheme> ?uri }"
|
66
|
+
query << " ?uri a <http://www.w3.org/2004/02/skos/core#ConceptScheme>"
|
67
|
+
query << "}"
|
68
|
+
@concept_schemes = ConceptScheme.find_by_sparql(query)
|
69
|
+
end
|
70
|
+
|
71
|
+
def theme_obj
|
72
|
+
Theme.find(self.theme.to_s) rescue nil
|
73
|
+
end
|
74
|
+
|
75
|
+
module ClassMethods
|
76
|
+
include PublishMyData::AllFeatures::ClassMethods
|
77
|
+
|
78
|
+
# this is the graph that dataset metadata goes in.
|
79
|
+
def metadata_graph_uri(slug)
|
80
|
+
"#{data_graph_uri(slug)}/metadata"
|
81
|
+
end
|
82
|
+
|
83
|
+
# this is the dataset that the actual data will go in
|
84
|
+
def data_graph_uri(slug)
|
85
|
+
"http://#{PublishMyData.local_domain}/graph/#{slug}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def uri_from_data_graph_uri(data_graph_uri)
|
89
|
+
data_graph_uri.to_s.sub("/graph/", "/data/")
|
90
|
+
end
|
91
|
+
|
92
|
+
def uri_from_slug(slug)
|
93
|
+
"http://#{PublishMyData.local_domain}/data/#{slug}"
|
94
|
+
end
|
95
|
+
|
96
|
+
# Criteria etc.
|
97
|
+
|
98
|
+
def ordered_by_title
|
99
|
+
all.where("?uri <#{RDF::DC.title}> ?title").order("?title")
|
100
|
+
end
|
101
|
+
|
102
|
+
def deprecation_last_query_str
|
103
|
+
"
|
104
|
+
SELECT ?uri where {
|
105
|
+
# this bit is all the non-deprecated ones
|
106
|
+
{
|
107
|
+
SELECT * WHERE {
|
108
|
+
?uri a <http://publishmydata.com/def/dataset#Dataset> .
|
109
|
+
?uri <#{RDF::DC.title}> ?title . # select title so we can order
|
110
|
+
MINUS {
|
111
|
+
?uri a <http://publishmydata.com/def/dataset#DeprecatedDataset>
|
112
|
+
}
|
113
|
+
}
|
114
|
+
ORDER BY ?title
|
115
|
+
}
|
116
|
+
UNION
|
117
|
+
# this bit is all the deprecated ones
|
118
|
+
{
|
119
|
+
SELECT * WHERE {
|
120
|
+
?uri a <http://publishmydata.com/def/dataset#DeprecatedDataset> .
|
121
|
+
?uri <#{RDF::DC.title}> ?title . # select title so we can order
|
122
|
+
}
|
123
|
+
ORDER BY ?title
|
124
|
+
}
|
125
|
+
}
|
126
|
+
"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|