rdf-reasoner 0.4.0 → 0.4.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f519d63f62d46294c8c459b62ffa5cc0ec678f2c
4
- data.tar.gz: 8987fe2050be4cf328b5749df311f15e514fba2d
3
+ metadata.gz: fbd3173e701cc40466c211a064bc71f2e55a45f0
4
+ data.tar.gz: 7bd3c6390427adc2029daae1ecf40b487c2a1cf0
5
5
  SHA512:
6
- metadata.gz: 6fbea5eecc04728ae65f46d9aca05dd5abb1324cc9296bc1e173c3f65dd4f227486ce4664a0bfdd0a8b35fcc3d334f154e87603cd2a1a200f325bf428196d877
7
- data.tar.gz: 92ba7bd1e699fe8b1c97d1c835c9b4f37667621abfb937be6aac2274c6721a77a086b5a6d692f86dc3c744bce64aee40fc247c0ea5cdee6164fb452929d1db46
6
+ metadata.gz: ecd33982a775129086f110caa4ade5986ae23c107107157660cf74f0bdc26987fa214e58dd3b07a0a737fc3076d112fb82b1fdc9efb4028579ee98fd5b74fa86
7
+ data.tar.gz: 188c9804dc37c080cc792a8d12ff2d13f42242ed28c4d3a313a9e700f0fe2611495b0d23ce6c628b2e483fedb99e4a408b451204f64897b607cca30190d3512d
data/README.md CHANGED
@@ -98,10 +98,13 @@ Domain and Range entailment include specific rules for schema.org vocabularies.
98
98
  end
99
99
  end
100
100
 
101
+ ## Command-Line interface
102
+ The `rdf` command-line interface is extended with `entail` and `lint` commands. `Entail` can be used in combination, with `serialize` to generate an output graph representation including entailed triples.
103
+
101
104
  ## Dependencies
102
105
 
103
- * [Ruby](http://ruby-lang.org/) (>= 2.0)
104
- * [RDF.rb](http://rubygems.org/gems/rdf) (>= 2.0)
106
+ * [Ruby](http://ruby-lang.org/) (>= 2.2.2)
107
+ * [RDF.rb](http://rubygems.org/gems/rdf) (>= 2.1.1)
105
108
 
106
109
  ## Mailing List
107
110
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.4.2
@@ -178,7 +178,7 @@ module RDF
178
178
  messages = {}
179
179
 
180
180
  # Check for defined classes in known vocabularies
181
- self.query(:predicate => RDF.type) do |stmt|
181
+ self.query(predicate: RDF.type) do |stmt|
182
182
  vocab = RDF::Vocabulary.find(stmt.object)
183
183
  term = (RDF::Vocabulary.find_term(stmt.object) rescue nil) if vocab
184
184
  pname = term ? term.pname : stmt.object.pname
@@ -200,6 +200,13 @@ module RDF
200
200
  term = (RDF::Vocabulary.find_term(stmt.predicate) rescue nil) if vocab
201
201
  pname = term ? term.pname : stmt.predicate.pname
202
202
 
203
+ # Must be a valid statement
204
+ begin
205
+ stmt.validate!
206
+ rescue
207
+ ((messages[:statement] ||= {})[pname] ||= []) << "Triple #{stmt.to_ntriples} is invalid"
208
+ end
209
+
203
210
  # Must be a defined property
204
211
  if term && term.property?
205
212
  # Warn against using a deprecated term
@@ -217,7 +224,7 @@ module RDF
217
224
  uniq.
218
225
  compact
219
226
 
220
- unless term.domain_compatible?(stmt.subject, self, :types => resource_types[stmt.subject])
227
+ unless term.domain_compatible?(stmt.subject, self, types: resource_types[stmt.subject])
221
228
  ((messages[:property] ||= {})[pname] ||= []) << if term.respond_to?(:domain)
222
229
  "Subject #{show_resource(stmt.subject)} not compatible with domain (#{Array(term.domain).map {|d| d.pname|| d}.join(',')})"
223
230
  else
@@ -232,7 +239,7 @@ module RDF
232
239
  uniq.
233
240
  compact if stmt.object.resource?
234
241
 
235
- unless term.range_compatible?(stmt.object, self, :types => resource_types[stmt.object])
242
+ unless term.range_compatible?(stmt.object, self, types: resource_types[stmt.object])
236
243
  ((messages[:property] ||= {})[pname] ||= []) << if term.respond_to?(:range)
237
244
  "Object #{show_resource(stmt.object)} not compatible with range (#{Array(term.range).map {|d| d.pname|| d}.join(',')})"
238
245
  else
@@ -50,7 +50,7 @@ module RDF::Reasoner
50
50
  if self.predicate == RDF.type
51
51
  if term = (RDF::Vocabulary.find_term(self.object) rescue nil)
52
52
  term._entail_equivalentClass do |t|
53
- statements << RDF::Statement(self.to_hash.merge(object: t))
53
+ statements << RDF::Statement(self.to_h.merge(object: t, inferred: true))
54
54
  end
55
55
  end
56
56
  end
@@ -89,7 +89,7 @@ module RDF::Reasoner
89
89
  statements = []
90
90
  if term = (RDF::Vocabulary.find_term(self.predicate) rescue nil)
91
91
  term._entail_equivalentProperty do |t|
92
- statements << RDF::Statement(self.to_hash.merge(predicate: t))
92
+ statements << RDF::Statement(self.to_h.merge(predicate: t, inferred: true))
93
93
  end
94
94
  end
95
95
  statements.each {|s| yield s} if block_given?
@@ -58,7 +58,7 @@ module RDF::Reasoner
58
58
  if self.predicate == RDF.type
59
59
  if term = (RDF::Vocabulary.find_term(self.object) rescue nil)
60
60
  term._entail_subClassOf do |t|
61
- statements << RDF::Statement(self.to_hash.merge(object: t))
61
+ statements << RDF::Statement(self.to_h.merge(object: t, inferred: true))
62
62
  end
63
63
  end
64
64
  #$stderr.puts("subClassf(#{self.predicate.pname}): #{statements.map(&:object).map {|r| r.respond_to?(:pname) ? r.pname : r.to_ntriples}}}")
@@ -127,7 +127,7 @@ module RDF::Reasoner
127
127
  statements = []
128
128
  if term = (RDF::Vocabulary.find_term(self.predicate) rescue nil)
129
129
  term._entail_subPropertyOf do |t|
130
- statements << RDF::Statement(self.to_hash.merge(predicate: t))
130
+ statements << RDF::Statement(self.to_h.merge(predicate: t, inferred: true))
131
131
  end
132
132
  #$stderr.puts("subPropertyOf(#{self.predicate.pname}): #{statements.map(&:object).map {|r| r.respond_to?(:pname) ? r.pname : r.to_ntriples}}}")
133
133
  end
@@ -146,7 +146,7 @@ module RDF::Reasoner
146
146
  statements = []
147
147
  if term = (RDF::Vocabulary.find_term(self.predicate) rescue nil)
148
148
  term.domain.each do |t|
149
- statements << RDF::Statement(self.to_hash.merge(predicate: RDF.type, object: t))
149
+ statements << RDF::Statement(self.to_h.merge(predicate: RDF.type, object: t, inferred: true))
150
150
  end
151
151
  end
152
152
  #$stderr.puts("domain(#{self.predicate.pname}): #{statements.map(&:object).map {|r| r.respond_to?(:pname) ? r.pname : r.to_ntriples}}}")
@@ -165,7 +165,7 @@ module RDF::Reasoner
165
165
  statements = []
166
166
  if object.resource? && term = (RDF::Vocabulary.find_term(self.predicate) rescue nil)
167
167
  term.range.each do |t|
168
- statements << RDF::Statement(self.to_hash.merge(subject: self.object, predicate: RDF.type, object: t))
168
+ statements << RDF::Statement(self.to_h.merge(subject: self.object, predicate: RDF.type, object: t, inferred: true))
169
169
  end
170
170
  end
171
171
  #$stderr.puts("range(#{self.predicate.pname}): #{statements.map(&:object).map {|r| r.respond_to?(:pname) ? r.pname : r.to_ntriples}}")
@@ -192,7 +192,7 @@ module RDF::Reasoner
192
192
 
193
193
  # Fully entailed types of the resource
194
194
  types = options.fetch(:types) do
195
- queryable.query(:subject => resource, :predicate => RDF.type).
195
+ queryable.query(subject: resource, predicate: RDF.type).
196
196
  map {|s| (t = (RDF::Vocabulary.find_term(s.object)) rescue nil) && t.entail(:subClassOf)}.
197
197
  flatten.
198
198
  uniq.
@@ -274,7 +274,7 @@ module RDF::Reasoner
274
274
  else
275
275
  # Fully entailed types of the resource
276
276
  types = options.fetch(:types) do
277
- queryable.query(:subject => resource, :predicate => RDF.type).
277
+ queryable.query(subject: resource, predicate: RDF.type).
278
278
  map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
279
279
  flatten.
280
280
  uniq.
@@ -27,13 +27,7 @@ module RDF::Reasoner
27
27
  domains = Array(self.domainIncludes) - [RDF::OWL.Thing]
28
28
 
29
29
  # Fully entailed types of the resource
30
- types = options.fetch(:types) do
31
- queryable.query(:subject => resource, :predicate => RDF.type).
32
- map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
33
- flatten.
34
- uniq.
35
- compact
36
- end unless domains.empty?
30
+ types = entailed_types(resource, queryable, options) unless domains.empty?
37
31
 
38
32
  # Every domain must match some entailed type
39
33
  resource_acceptable = Array(types).empty? || domains.any? {|d| types.include?(d)}
@@ -109,13 +103,13 @@ module RDF::Reasoner
109
103
  resource.datatype == RDF::XSD.anyURI ||
110
104
  resource.plain? && RDF::Literal::AnyURI.new(resource.value).valid?
111
105
  else
112
- # If this is an XSD range, look for appropriate literal
106
+ # If may be an XSD range, look for appropriate literal
113
107
  if range.start_with?(RDF::XSD.to_s)
114
108
  if resource.datatype == RDF::URI(range)
115
109
  true
116
110
  else
117
111
  # Valid if cast as datatype
118
- resource.plain? && RDF::Literal(resource.value, :datatype => RDF::URI(range)).valid?
112
+ resource.plain? && RDF::Literal(resource.value, datatype: RDF::URI(range)).valid?
119
113
  end
120
114
  else
121
115
  # Otherwise, presume that the range refers to a typed resource. This is allowed if the value is a plain literal
@@ -127,28 +121,14 @@ module RDF::Reasoner
127
121
  true # Special case for schema boolean resources
128
122
  elsif ranges.include?(RDF::Vocab::SCHEMA.URL) && resource.uri?
129
123
  true # schema:URL matches URI resources
130
- elsif ranges.include?(RDF::Vocab::SCHEMA.Text) && resource.uri?
124
+ elsif ranges == [RDF::Vocab::SCHEMA.Text] && resource.uri?
131
125
  # Allowed if resource is untyped
132
- # Fully entailed types of the resource
133
- types = options.fetch(:types) do
134
- queryable.query(:subject => resource, :predicate => RDF.type).
135
- map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
136
- flatten.
137
- uniq.
138
- compact
139
- end
140
- types.empty?
126
+ entailed_types(resource, queryable, options).empty?
141
127
  elsif literal_range?(ranges)
142
128
  false # If resource isn't literal, this is a range violation
143
129
  else
144
130
  # Fully entailed types of the resource
145
- types = options.fetch(:types) do
146
- queryable.query(:subject => resource, :predicate => RDF.type).
147
- map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
148
- flatten.
149
- uniq.
150
- compact
151
- end
131
+ types = entailed_types(resource, queryable, options)
152
132
 
153
133
  # Every range must match some entailed type
154
134
  resource_acceptable = Array(types).empty? || ranges.any? {|d| types.include?(d)}
@@ -191,6 +171,18 @@ module RDF::Reasoner
191
171
 
192
172
  def self.included(mod)
193
173
  end
174
+
175
+ private
176
+ # Fully entailed types
177
+ def entailed_types(resource, queryable, options = {})
178
+ options.fetch(:types) do
179
+ queryable.query(subject: resource, predicate: RDF.type).
180
+ map {|s| (t = (RDF::Vocabulary.find_term(s.object) rescue nil)) && t.entail(:subClassOf)}.
181
+ flatten.
182
+ uniq.
183
+ compact
184
+ end
185
+ end
194
186
  end
195
187
 
196
188
  # Extend the Term with this methods
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf-reasoner
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregg Kellogg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-10 00:00:00.000000000 Z
11
+ date: 2017-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rdf
@@ -16,126 +16,126 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '2.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '2.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rdf-vocab
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
33
+ version: '2.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.0'
40
+ version: '2.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rdf-xsd
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.0'
47
+ version: '2.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '2.0'
54
+ version: '2.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rdf-spec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '2.0'
62
- type: :runtime
61
+ version: '2.2'
62
+ type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '2.0'
68
+ version: '2.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: json-ld
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '2.0'
75
+ version: '2.2'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '2.0'
82
+ version: '2.2'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rdf-turtle
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '2.0'
89
+ version: '2.2'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '2.0'
96
+ version: '2.2'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: equivalent-xml
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.4'
103
+ version: '0.6'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.4'
110
+ version: '0.6'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '3.4'
117
+ version: '3.5'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '3.4'
124
+ version: '3.5'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: yard
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '0.8'
131
+ version: '0.9'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '0.8'
138
+ version: '0.9'
139
139
  description: Reasons over RDFS/OWL vocabularies to generate statements which are entailed
140
140
  based on base RDFS/OWL rules along with vocabulary information. It can also be used
141
141
  to ask specific questions, such as if a given object is consistent with the vocabulary
@@ -168,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
168
168
  requirements:
169
169
  - - ">="
170
170
  - !ruby/object:Gem::Version
171
- version: '2.0'
171
+ version: 2.2.2
172
172
  required_rubygems_version: !ruby/object:Gem::Requirement
173
173
  requirements:
174
174
  - - ">="
@@ -176,9 +176,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
176
  version: '0'
177
177
  requirements: []
178
178
  rubyforge_project:
179
- rubygems_version: 2.4.8
179
+ rubygems_version: 2.6.8
180
180
  signing_key:
181
181
  specification_version: 4
182
182
  summary: RDFS/OWL Reasoner for RDF.rb
183
183
  test_files: []
184
- has_rdoc: false