There is more than one way to build a terminology.
The simplest way to create an OM Terminology is to use the OM::XML::Terminology::Builder block syntax.
In the following examples, we will show different ways of building this Terminology:
builder = OM::XML::Terminology::Builder.new do |t|
t.root(:path=>"grants", :xmlns=>"http://yourmediashelf.com/schemas/hydra-dataset/v0", :schema=>"http://example.org/schemas/grants-v1.xsd")
t.grant {
t.org(:path=>"organization", :attributes=>{:type=>"funder"}) {
t.name(:index_as=>:searchable)
}
t.number
}
end
another_terminology = builder.buildUsing OM::XML::Term::Builders
First, create the Terminology Builder object:
terminology_builder = OM::XML::Terminology::Builder.newThe .root method handles creating the root term and setting namespaces, schema, etc. on the Terminology:
terminology_builder.root(:path=>"grants", :xmlns=>"http://yourmediashelf.com/schemas/hydra-dataset/v0", :schema=>"http://example.org/schemas/grants-v1.xsd")This sets the namespaces for you and created the “grants” root term:
terminology_builder.namespaces
=> {"oxns"=>"http://yourmediashelf.com/schemas/hydra-dataset/v0", "xmlns"=>"http://yourmediashelf.com/schemas/hydra-dataset/v0"}
terminology_builder.term_buildersCreate Term Builders for each of the Terms:
term1_builder = OM::XML::Term::Builder.new("grant", terminology_builder).path("grant")
subterm1_builder = OM::XML::Term::Builder.new("org", terminology_builder).attributes(:type=>"funder")
subsubterm_builder = OM::XML::Term::Builder.new("name", terminology_builder).index_as(:searchable)
subterm2_builder = OM::XML::Term::Builder.new("number", terminology_builder)Assemble the tree of Term builders by adding child builders to their parents; then add the top level terms to the root term in the Terminology builder:
subterm1_builder.add_child(subsubterm_builder)
term1_builder.add_child(subterm1_builder)
term1_builder.add_child(subterm2_builder)
terminology_builder.term_builders["grant"] = term1_builderNow build the Terminology, which will also call .build on each of the Term Builders in the tree:
built_terminology = terminology_builder.buildTest it out:
built_terminology.retrieve_term(:grant, :org, :name)
built_terminology.xpath_for(:grant, :org, :name)
built_terminology.root_terms
built_terminology.terms.keys # This will only return the Terms at the root of the terminology hierarchy
built_terminology.retrieve_term(:grant).children.keysIf you want to manipulate Terms and Terminologies directly rather than using the Builder classes, you can consume their APIs at any time.
People don’t often do this, but the option is there if you need it.
Create the Terminology, set its namespaces & (optional) schema: (Note that you have to set the :oxns namespaces to match :xmlns. This is usually done for you by the Terminology::Builder.root method.)
handcrafted_terminology = OM::XML::Terminology.new
handcrafted_terminology.namespaces[:xmlns] = "http://yourmediashelf.com/schemas/hydra-dataset/v0"
handcrafted_terminology.namespaces[:oxns] = "http://yourmediashelf.com/schemas/hydra-dataset/v0"
handcrafted_terminology.schema = "http://example.org/schemas/grants-v1.xsd"Create the Terms:
# Create term1 (the root) and set it as the root term
root_term = OM::XML::Term.new("grants")
root_term.is_root_term = true
# Create term1 (grant) and its subterms
term1 = OM::XML::Term.new("grant")
subterm1 = OM::XML::Term.new("org")
subterm1.path = "organization"
subterm1.attributes = {:type=>"funder"}
subsubterm = OM::XML::Term.new("name")
subsubterm.index_as = :searchable
subterm2 = OM::XML::Term.new("number")Assemble the tree of terms by adding child terms to their parents, then add those to the Terminology.
subterm1.add_child(subsubterm)
term1.add_child(subterm1)
term1.add_child(subterm2)
handcrafted_terminology.add_term(root_term)
handcrafted_terminology.add_term(term1)Generate the xpath queries for each term. This is usually done for you by the Term Builder.build method:
[root_term, term1, subterm1, subsubterm, subterm2].each {|t| t.generate_xpath_queries!}Test it out:
handcrafted_terminology.retrieve_term(:grant, :org, :name)
handcrafted_terminology.xpath_for(:grant, :org, :name)
handcrafted_terminology.root_terms
handcrafted_terminology.terms.keys # This will only return the Terms at the root of the terminology hierarchy
handcrafted_terminology.retrieve_term(:grant).children.keys