dor-services 2.2.4 → 4.4.10

Sign up to get free protection for your applications and to get access to all the features.
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/