dor-services 2.2.4 → 4.4.10

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.
Files changed (106) hide show
  1. checksums.yaml +15 -0
  2. data/bin/dor-indexer +108 -0
  3. data/bin/dor-indexerd +73 -0
  4. data/bin/nokogiri +19 -0
  5. data/bin/rake +19 -0
  6. data/bin/ruby_noexec_wrapper +14 -0
  7. data/bin/solrizer +19 -0
  8. data/bin/solrizerd +19 -0
  9. data/config/certs/README +1 -0
  10. data/config/config_defaults.yml +62 -0
  11. data/config/dev_console_env.rb.example +67 -0
  12. data/config/predicate_mappings.yml +55 -0
  13. data/lib/dor-services.rb +152 -19
  14. data/lib/dor/config.rb +133 -35
  15. data/lib/dor/datastreams/administrative_metadata_ds.rb +84 -0
  16. data/lib/dor/datastreams/content_metadata_ds.rb +337 -0
  17. data/lib/dor/datastreams/datastream_spec_solrizer.rb +18 -0
  18. data/lib/dor/datastreams/default_object_rights_ds.rb +52 -0
  19. data/lib/dor/datastreams/desc_metadata_ds.rb +39 -0
  20. data/lib/{datastreams → dor/datastreams}/embargo_metadata_ds.rb +25 -20
  21. data/lib/{datastreams → dor/datastreams}/events_ds.rb +14 -9
  22. data/lib/dor/datastreams/identity.xsl +8 -0
  23. data/lib/dor/datastreams/identity_metadata_ds.rb +112 -0
  24. data/lib/dor/datastreams/role_metadata_ds.rb +51 -0
  25. data/lib/dor/datastreams/simple_dublin_core_ds.rb +45 -0
  26. data/lib/dor/datastreams/version_metadata_ds.rb +214 -0
  27. data/lib/dor/datastreams/workflow_definition_ds.rb +113 -0
  28. data/lib/dor/datastreams/workflow_ds.rb +103 -0
  29. data/lib/dor/exceptions.rb +0 -1
  30. data/lib/dor/migrations/content_metadata_ds/change_content_type.rb +7 -0
  31. data/lib/dor/migrations/identifiable/assert_adminPolicy.rb +9 -0
  32. data/lib/dor/migrations/identifiable/fix_model_assertions.rb +13 -0
  33. data/lib/dor/migrations/identifiable/record_remediation.rb +18 -0
  34. data/lib/dor/migrations/identifiable/uriify_augmented_contentlocation_refs.rb +18 -0
  35. data/lib/dor/migrations/identifiable/uriify_contentlocation_refs.rb +18 -0
  36. data/lib/dor/migrations/processable/unify_workflows.rb +17 -0
  37. data/lib/dor/migrations/versionable/add_missing_version_md.rb +9 -0
  38. data/lib/dor/models/admin_policy_object.rb +16 -0
  39. data/lib/dor/models/assembleable.rb +14 -0
  40. data/lib/dor/models/collection.rb +14 -0
  41. data/lib/dor/models/contentable.rb +227 -0
  42. data/lib/dor/models/describable.rb +194 -0
  43. data/lib/dor/models/discoverable.rb +66 -0
  44. data/lib/dor/models/editable.rb +267 -0
  45. data/lib/dor/models/embargoable.rb +97 -0
  46. data/lib/dor/models/eventable.rb +12 -0
  47. data/lib/dor/models/governable.rb +162 -0
  48. data/lib/dor/models/identifiable.rb +211 -0
  49. data/lib/dor/models/item.rb +44 -0
  50. data/lib/dor/models/itemizable.rb +66 -0
  51. data/lib/dor/{mods2dc.xslt → models/mods2dc.xslt} +39 -12
  52. data/lib/dor/models/preservable.rb +50 -0
  53. data/lib/dor/models/processable.rb +229 -0
  54. data/lib/dor/models/publishable.rb +74 -0
  55. data/lib/dor/models/set.rb +12 -0
  56. data/lib/dor/models/shelvable.rb +27 -0
  57. data/lib/dor/models/upgradable.rb +74 -0
  58. data/lib/dor/models/versionable.rb +94 -0
  59. data/lib/dor/models/workflow_object.rb +54 -0
  60. data/lib/dor/services/cleanup_service.rb +47 -0
  61. data/lib/dor/services/digital_stacks_service.rb +55 -0
  62. data/lib/dor/services/merge_service.rb +96 -0
  63. data/lib/dor/{metadata_handlers → services/metadata_handlers}/catalog_handler.rb +0 -2
  64. data/lib/dor/{metadata_handlers → services/metadata_handlers}/mdtoolkit_handler.rb +0 -2
  65. data/lib/dor/{metadata_service.rb → services/metadata_service.rb} +1 -3
  66. data/lib/dor/services/registration_service.rb +181 -0
  67. data/lib/dor/services/sdr_ingest_service.rb +181 -0
  68. data/lib/dor/services/search_service.rb +131 -0
  69. data/lib/dor/services/suri_service.rb +32 -0
  70. data/lib/dor/services/technical_metadata_service.rb +226 -0
  71. data/lib/dor/{tei2dc.xslt → services/tei2dc.xslt} +0 -0
  72. data/lib/dor/utils/ng_tidy.rb +37 -0
  73. data/lib/dor/utils/predicate_patch.rb +23 -0
  74. data/lib/dor/utils/solr_doc_helper.rb +9 -0
  75. data/lib/dor/utils/utc_date_field_mapper.rb +7 -0
  76. data/lib/dor/version.rb +3 -0
  77. data/lib/dor/workflow/document.rb +131 -0
  78. data/lib/dor/workflow/graph.rb +166 -0
  79. data/lib/dor/workflow/process.rb +99 -0
  80. data/lib/gsearch/demoFoxmlToSolr.xslt +340 -122
  81. data/lib/tasks/dor.rake +39 -0
  82. metadata +494 -384
  83. data/lib/datastreams/content_metadata_ds.rb +0 -12
  84. data/lib/datastreams/identity_metadata_ds.rb +0 -28
  85. data/lib/datastreams/ng_tidy.rb +0 -19
  86. data/lib/datastreams/simple_dublin_core_ds.rb +0 -23
  87. data/lib/datastreams/workflow_definition_ds.rb +0 -105
  88. data/lib/datastreams/workflow_ds.rb +0 -16
  89. data/lib/dor/admin_policy_object.rb +0 -11
  90. data/lib/dor/base.rb +0 -81
  91. data/lib/dor/cleanup_service.rb +0 -32
  92. data/lib/dor/digital_stacks_service.rb +0 -82
  93. data/lib/dor/druid_utils.rb +0 -41
  94. data/lib/dor/embargo.rb +0 -41
  95. data/lib/dor/item.rb +0 -141
  96. data/lib/dor/provenance_metadata_service.rb +0 -65
  97. data/lib/dor/registration_service.rb +0 -87
  98. data/lib/dor/rsolr.rb +0 -27
  99. data/lib/dor/sdr_ingest_service.rb +0 -117
  100. data/lib/dor/search_service.rb +0 -86
  101. data/lib/dor/suri_service.rb +0 -37
  102. data/lib/dor/workflow_object.rb +0 -13
  103. data/lib/dor/workflow_service.rb +0 -111
  104. data/lib/xml_models/foxml.rb +0 -261
  105. data/lib/xml_models/identity_metadata/dublin_core.rb +0 -119
  106. data/lib/xml_models/identity_metadata/identity_metadata.rb +0 -288
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YWJmMDE5MTIzMTg4MWU2NmZkNjYwNDYxZTMxMTE5YmFiZTIyYmVjOQ==
5
+ data.tar.gz: !binary |-
6
+ ZGI0NGRlNzU4NWY0Zjg3YmUwNzRhMzhlMzk1YjVlN2MzMmM1MzJiMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NGI2NjgyNTc3ZmI2NWFmZjFmMmM2ZDRmMzhlM2ZlMWIwOGI4MTFkNGJhNTZj
10
+ YjdhMGFkZTAxMDQ5MTMxY2E1ODg2NzFjNmIyOGZiOTQ3MDI0NzQ1NmU0MjA4
11
+ OWQ4MTQwNWJhMDczZTlmOWVmMmVkNTIxMjJkMzIxNzA4NDI0ZmY=
12
+ data.tar.gz: !binary |-
13
+ NThiODVlMDIzODJjZTg5ZTc1MTBkNTUzMmFhMDdhM2Q0NDFlMDNjMTMzZWUw
14
+ YzdhMjcxZDE0N2Q1ZmI3NjhmMjdlZDdjODA1YjVjMDNmNTZlN2YyMjFkY2M3
15
+ OGE5NWJiYmJmZTgzMzQzY2NkY2E2MmFjMTk2OGUzNWZjYmJhMjY=
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'optparse'
5
+ require 'stomp'
6
+ require 'timeout'
7
+ require 'dor-services'
8
+
9
+ options = { :log_level => Logger::WARN }
10
+
11
+ optparse = OptionParser.new do|opts|
12
+ opts.banner = "Usage: #{File.basename(__FILE__)} [options]"
13
+
14
+ options[:dor_config] = nil
15
+ opts.on( '--dor-config PATH', 'Load the dor-services configuration file at this path' ) do |path|
16
+ puts "Configuring dor-services..."
17
+ options[:dor_config] = path
18
+ require options[:dor_config]
19
+ end
20
+
21
+ options[:destination] = '/topic/fedora.apim.update'
22
+ opts.on('-d','--destination TOPIC', 'Topic to listen to') do |destination|
23
+ options[:destination] = destination
24
+ end
25
+
26
+ options[:client_id] = "fedora_stomper"
27
+ opts.on('-c', '--client-id ID', 'Stomp client ID') do |client_id|
28
+ Dor::Config.stomp.client_id = client_id
29
+ end
30
+
31
+ opts.on('-v', 'Verbose') do
32
+ options[:log_level] -= 1 if options[:log_level] > 0
33
+ end
34
+
35
+ opts.on('-h', '--help', 'Display this screen') do
36
+ puts opts
37
+ exit
38
+ end
39
+ end
40
+
41
+ optparse.parse!
42
+
43
+ begin; require 'rubygems'; rescue; end
44
+
45
+ unless options[:dor_config]
46
+ $stderr.puts "The --dor-config PATH option is mandatory. Please provide the path to a valid dor-services configuration file."
47
+ exit 1
48
+ end
49
+
50
+ puts "loading listener"
51
+
52
+ begin
53
+ @clientid = options[:client_id]
54
+ @destination = options[:destination]
55
+
56
+
57
+ @conn = Dor::Config.stomp.connection
58
+ $stderr.print Time.now.to_s + " Getting output from #{@destination}\n"
59
+
60
+ @conn.subscribe(@destination, {"activemq.subscriptionName" => @clientid, :ack =>"client" })
61
+ while true
62
+
63
+ begin
64
+ Timeout::timeout(300) do
65
+ @msg = @conn.receive
66
+ end
67
+ if @msg.nil?
68
+ $stderr.print 'nil message\n'
69
+ else
70
+ pid = @msg.headers["pid"]
71
+ method = @msg.headers["methodName"]
72
+
73
+ if ["addDatastream", "addRelationship","ingest","modifyDatastreamByValue","modifyDatastreamByReference","modifyObject","purgeDatastream","purgeRelationship","reindex"].include? method
74
+ begin
75
+ obj = Dor.load_instance pid
76
+ Dor::SearchService.solr.add(obj.to_solr, :add_attributes => {:commitWithin => 10}) unless obj.nil?
77
+ rescue
78
+ end
79
+ elsif method == "purgeObject"
80
+ Dor::SearchService.solr.delete_by_id(pid)
81
+ else
82
+ $stderr.print Time.now.to_s + " Unknown Method: #{method} for PID #{pid}"
83
+ end
84
+ $stderr.print Time.now.to_s + " updated solr index for #{pid}\n"
85
+ @conn.ack @msg.headers["message-id"]
86
+ end
87
+ rescue Timeout::Error
88
+ begin
89
+ $stderr.print Time.now.to_s +" Sending heartbeat\n"
90
+ @conn.begin('heartbeat')
91
+ @conn.commit('heartbeat')
92
+ rescue Exception => e
93
+ body = "Unable to send heartbeat to broker\n"
94
+ body << "\n\nExeption:\n" << he.inspect << "\n" << he.backtrace.join("\n")
95
+ $stderr.print(Time.now.to_s + " Unable to send heartbeat")
96
+ $stderr.print(body)
97
+ end
98
+
99
+
100
+ rescue Exception => e
101
+ $stderr.print Time.now.to_s + " failed to update solr index for #{pid}: #<#{e.class.name}: #{e.message}>"
102
+ end
103
+ end
104
+ @conn.join
105
+ rescue Exception => e
106
+ p e
107
+ end
108
+
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'daemons'
5
+ require 'stomp'
6
+
7
+ banner=<<-EOC
8
+ Usage: #{File.basename(__FILE__)} command --dor-config PATH [options]
9
+ PATH must point to a valid dor-services configuration file
10
+ Commands:
11
+ start start an instance of the application
12
+ stop stop all instances of the application
13
+ restart stop all instances and restart them afterwards
14
+ status show status (PID) of application instances
15
+ Options:
16
+ --dor-config PATH Load the dor-services configuration file at this path
17
+ -d, --destination TOPIC Topic to listen to (default: /topic/fedora.apim.update)
18
+ -c, --client-id Stomp client ID (default: fedora_stomper)
19
+ -h, --help Display this screen
20
+ EOC
21
+
22
+
23
+ # check for a valid command
24
+ unless ['start','stop','restart','status'].include? ARGV[0]
25
+ puts banner
26
+ exit 7
27
+ end
28
+
29
+ if ARGV.include?('-h') || ARGV.include?('--help')
30
+ puts banner
31
+ exit 0
32
+ end
33
+
34
+ # Make sure --dor-config was set for the start and restart commands
35
+ if ARGV[0] == 'start' || ARGV[0] == 'restart'
36
+ unless ARGV[1] == '--dor-config'
37
+ puts "ERROR: You must --dor-config to specify the path to a valid dor-services gem configuration file"
38
+ exit 8
39
+ end
40
+ end
41
+ #4th arg should be --log_dir and 5th is the path.
42
+ log_dir=nil
43
+ if ARGV[3]=='--log_dir'
44
+ log_dir=ARGV[4]
45
+ else
46
+ puts "Log dir not specified"
47
+ end
48
+
49
+
50
+ if log_dir.empty?
51
+ File.join(Dir.pwd,'log')
52
+ end
53
+
54
+
55
+ options = {
56
+ :multiple=>ARGV.any? { |arg| arg =~ %r{^/queue/}},
57
+ :dir_mode=>:normal,
58
+ :dir=>'/tmp',
59
+ :log_dir=> log_dir,
60
+ :log_output=>true,
61
+ :backtrace=>true
62
+ }
63
+ argv_array = []
64
+ argv_array << ARGV[0]
65
+ argv_array << '--'
66
+ ARGV[1..-1].each {|ele| argv_array << ele }
67
+ options[:ARGV] = argv_array
68
+
69
+ version = '>=0'
70
+ #app = Gem.bin_path('dor-services','dor-indexer',version)
71
+ app = File.expand_path('../dor-indexer',__FILE__)
72
+ Daemons.run(app,options)
73
+
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby_noexec_wrapper
2
+ #
3
+ # This file was generated by RubyGems.
4
+ #
5
+ # The application 'nokogiri' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'rubygems'
10
+
11
+ version = ">= 0"
12
+
13
+ if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
14
+ version = $1
15
+ ARGV.shift
16
+ end
17
+
18
+ gem 'nokogiri', version
19
+ load Gem.bin_path('nokogiri', 'nokogiri', version)
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby_noexec_wrapper
2
+ #
3
+ # This file was generated by RubyGems.
4
+ #
5
+ # The application 'rake' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'rubygems'
10
+
11
+ version = ">= 0"
12
+
13
+ if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
14
+ version = $1
15
+ ARGV.shift
16
+ end
17
+
18
+ gem 'rake', version
19
+ load Gem.bin_path('rake', 'rake', version)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ original_file=ARGV[0]
4
+ ARGV.shift
5
+ $PROGRAM_NAME=original_file
6
+
7
+ require 'rubygems'
8
+ begin
9
+ require 'rubygems-bundler/noexec'
10
+ rescue LoadError
11
+ warn "unable to load rubygems-bundler/noexec" if ENV.key?('NOEXEC_DEBUG')
12
+ end
13
+
14
+ eval File.read(original_file), binding, original_file
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby_noexec_wrapper
2
+ #
3
+ # This file was generated by RubyGems.
4
+ #
5
+ # The application 'solrizer' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'rubygems'
10
+
11
+ version = ">= 0"
12
+
13
+ if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
14
+ version = $1
15
+ ARGV.shift
16
+ end
17
+
18
+ gem 'solrizer', version
19
+ load Gem.bin_path('solrizer', 'solrizer', version)
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby_noexec_wrapper
2
+ #
3
+ # This file was generated by RubyGems.
4
+ #
5
+ # The application 'solrizer' is installed as part of a gem, and
6
+ # this file is here to facilitate running it.
7
+ #
8
+
9
+ require 'rubygems'
10
+
11
+ version = ">= 0"
12
+
13
+ if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
14
+ version = $1
15
+ ARGV.shift
16
+ end
17
+
18
+ gem 'solrizer', version
19
+ load Gem.bin_path('solrizer', 'solrizerd', version)
@@ -0,0 +1 @@
1
+ If you want to use the console, copy the robots-dor-dev.crt and .key from sul-lyberservices-dev
@@ -0,0 +1,62 @@
1
+ ---
2
+ :cleanup:
3
+ :local_workspace_root: /dor/workspace
4
+ :local_assembly_root: /dor/assembly
5
+ :local_export_home: /dor/export
6
+ :ssl:
7
+ :cert_file:
8
+ :key_file:
9
+ :key_pass: ""
10
+ :fedora:
11
+ :url:
12
+ :safeurl:
13
+ :stomp:
14
+ :host:
15
+ :user: ""
16
+ :password: ""
17
+ :port: 61613
18
+ :client_id: 'dor-services'
19
+ :solrizer:
20
+ :url:
21
+ :opts: {}
22
+ :gsearch:
23
+ :rest_url:
24
+ :url:
25
+ :metadata:
26
+ :catalog:
27
+ :url:
28
+ :exist:
29
+ :url:
30
+ :sdr:
31
+ :local_workspace_root: /dor/workspace
32
+ :local_export_home: /dor/export
33
+ :datastreams:
34
+ :rightsMetadata: optional
35
+ :descMetadata: required
36
+ :sourceMetadata: optional
37
+ :identityMetadata: required
38
+ :provenanceMetadata: required
39
+ :relationshipMetadata: required
40
+ :technicalMetadata: required
41
+ :contentMetadata: required
42
+ :rest_url: ""
43
+ :stacks:
44
+ :local_workspace_root: /dor
45
+ :storage_root: /stacks
46
+ :document_cache_storage_root:
47
+ :host:
48
+ :user:
49
+ :document_cache_host:
50
+ :document_cache_user:
51
+ :local_stacks_root: /stacks
52
+ :local_document_cache_root: /purl
53
+ :suri:
54
+ :pass:
55
+ :id_namespace: druid
56
+ :url:
57
+ :user:
58
+ :mint_ids: false
59
+ :workflow:
60
+ :url:
61
+ :dor_services:
62
+ :url:
@@ -0,0 +1,67 @@
1
+ # Copied from common-accessioning config/environments
2
+
3
+ cert_dir = File.join(File.dirname(__FILE__), ".", "certs")
4
+
5
+ Dor::Config.configure do
6
+ fedora do
7
+ url 'https://dor.edu/fedora'
8
+ end
9
+
10
+ ssl do
11
+ cert_file File.join(cert_dir,"robots-dor-dev.crt")
12
+ key_file File.join(cert_dir,"robots-dor-dev.key")
13
+ key_pass ''
14
+ end
15
+
16
+ suri do
17
+ mint_ids true
18
+ id_namespace 'druid'
19
+ url 'https://suri-server'
20
+ user ''
21
+ pass ''
22
+ end
23
+
24
+ metadata do
25
+ exist.url 'http://server/exist/rest/'
26
+ catalog.url 'http://lyberservices-prod.stanford.edu/catalog/mods'
27
+ end
28
+
29
+ stacks do
30
+ document_cache_storage_root '/home/lyberadmin/document_cache'
31
+ document_cache_host 'purl-dev.stanford.edu'
32
+ document_cache_user ''
33
+ local_workspace_root '/dor/workspace'
34
+ storage_root '/stacks'
35
+ host 'host'
36
+ user ''
37
+ local_stacks_root '/stacks'
38
+ local_document_cache_root '/purl'
39
+ end
40
+
41
+ gsearch.url 'https://host/solr/gsearch'
42
+ solrizer.url 'https://host/solr'
43
+ workflow.url 'https://host/workflow/'
44
+ dor_services.url 'https://host/dor/v1'
45
+
46
+ cleanup do
47
+ local_workspace_root '/dor/workspace'
48
+ local_export_home '/dor/export'
49
+ end
50
+
51
+ sdr do
52
+ local_workspace_root '/dor/workspace'
53
+ local_export_home '/dor/export'
54
+ datastreams do
55
+ contentMetadata 'required'
56
+ descMetadata 'required'
57
+ identityMetadata 'required'
58
+ provenanceMetadata 'required'
59
+ relationshipMetadata 'required'
60
+ rightsMetadata 'optional'
61
+ sourceMetadata 'optional'
62
+ end
63
+ end
64
+
65
+ accessioning_robot_sleep_time 30
66
+
67
+ end
@@ -0,0 +1,55 @@
1
+ # The default namespace maps to the default namespace for generating rels_ext from solr
2
+ :default_namespace: info:fedora/fedora-system:def/relations-external#
3
+
4
+ # namespace mappings---
5
+ # you can add specific mappings for your institution by providing the following:
6
+ # namespace_uri:
7
+ # :relationship_symbol: relationship_identifier
8
+ #
9
+ # For example, if you have the following element in your rels_ext:
10
+ #
11
+ # <oai:itemID>oai:example.edu:changeme:500</oai:itemID>
12
+ #
13
+ # With the last two lines of this file uncommented, the relationships hash of your object will include:
14
+ # :oai_item_id => ["info:fedora/oai:example.edu:changeme:500"]
15
+ #
16
+ :predicate_mapping:
17
+ info:fedora/fedora-system:def/relations-external#:
18
+ :conforms_to: conformsTo
19
+ :has_annotation: hasAnnotation
20
+ :has_collection_member: hasCollectionMember
21
+ :has_constituent: hasConstituent
22
+ :has_dependent: hasDependent
23
+ :has_derivation: hasDerivation
24
+ :has_description: hasDescription
25
+ :has_equivalent: hasEquivalent
26
+ :has_metadata: hasMetadata
27
+ :has_member: hasMember
28
+ :has_model: hasModel
29
+ :has_part: hasPart
30
+ :has_subset: hasSubset
31
+ :is_annotation_of: isAnnotationOf
32
+ :is_constituent_of: isConstituentOf
33
+ :is_dependent_of: isDependentOf
34
+ :is_derivation_of: isDerivationOf
35
+ :is_description_of: isDescriptionOf
36
+ :is_member_of: isMemberOf
37
+ :is_member_of_collection: isMemberOfCollection
38
+ :is_metadata_for: isMetadataFor
39
+ :is_part_of: isPartOf
40
+ :is_subset_of: isSubsetOf
41
+ :is_topic_of: isTopicOf
42
+ info:fedora/fedora-system:def/model#:
43
+ :has_model: hasModel
44
+ :has_service: hasService
45
+ http://www.openarchives.org/OAI/2.0/:
46
+ :oai_item_id: itemID
47
+ http://projecthydra.org/ns/relations#:
48
+ :is_governed_by: isGovernedBy
49
+ :references_agreement: referencesAgreement
50
+ :referencesAgreement: referencesAgreement
51
+ :predicate_namespaces:
52
+ :hydra: http://projecthydra.org/ns/relations#
53
+ :fedora: info:fedora/fedora-system:def/relations-external#
54
+ :fedora-model: info:fedora/fedora-system:def/model#
55
+ :oai: http://www.openarchives.org/OAI/2.0/