-
Notifications
You must be signed in to change notification settings - Fork 63
Lesson: Define a custom Vocabulary (AF7)
A custom vocabulary is simply a namespace and a set of terms. We encode these into a Ruby class so they are useable by the RDF.rb gem.
We'll start out by defining a vocabulary about images.
Create a lib directory called rdf_vocabularies
mkdir lib/rdf_vocabularies
Then create a file in the rdf_vocabularies directory called image.rb
. We'll give it the namespace "http://projecthydra.org/images#". We'll give it three terms: "height", "width", and "color_depth".
class ImageVocabulary < RDF::Vocabulary("http://projecthydra.org/images#")
property :height
property :width
property :color_depth
end
Restart your console session and you can now you can see that each of these properties resolves to a URI:
require "./lib/rdf_vocabularies/image"
# => true
ImageVocabulary.height
# => #<RDF::URI:0x3fe828f1dee8 URI:http://projecthydra.org/images#height>
Let's add these properties to our class by editing lib/rdf_types/dublin_core_asset.rb
:
require "active-fedora"
class DublinCoreAsset < ActiveFedora::Rdf::Resource
configure type: RDF::URI('http://www.mydomain.mn/metadata/ontologies/foo#SpecialAsset'), base_uri: 'info:fedora'
property :title, predicate: RDF::DC.title
property :creator, predicate: RDF::DC.creator
property :contributor, predicate: RDF::DC.contributor
property :date, predicate: RDF::DC.date
property :subject, predicate: RDF::DC.subject
property :relation, predicate: RDF::DC.relation
property :height, predicate: ImageVocabulary.height
property :width, predicate: ImageVocabulary.width
property :color_depth, predicate: ImageVocabulary.color_depth
end
Restart the console session and require the new files. Then when we instantiate the DublinCoreAsset, we can assign values to the properties:
require "./lib/rdf_vocabularies/image"
# => true
require "./lib/rdf_types/dublin_core_asset"
# => true
subject = RDF::URI('http://example.com/1234')
# => #<RDF::URI:0x3fe82995c01c URI:http://example.com/1234>
asset = DublinCoreAsset.new(subject)
# => #<DublinCoreAsset:0x007fd0532c9658 @graph=#<RDF::Graph:0x3fe8298e01c4(default)>, @rdf_subject=#<RDF::URI:0x3fe82995c01c URI:http://example.com/1234>>
asset.title="A picture of a waterfall"
# => "A picture of a waterfall"
asset.height = "1028px"
# => "1028px"
asset.width = "800px"
# => "800px"
asset.color_depth = "32bit"
# => "32bit"
puts asset.dump :ntriples
#<http://example.com/1234> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.mydomain.mn/metadata/ontologies/foo#SpecialAsset> .
#<http://example.com/1234> <http://purl.org/dc/terms/title> "A picture of a waterfall" .
#<http://example.com/1234> <http://projecthydra.org/images#height> "1028px" .
#<http://example.com/1234> <http://projecthydra.org/images#width> "800px" .
#<http://example.com/1234> <http://projecthydra.org/images#color_depth> "32bit" .
# => nil
Go on to Lesson: Define a Complex Network of Related RDF Types (AF7) or return to the Tame your RDF Metadata with ActiveFedora landing page.