rdf-reasoner 0.4.0 → 0.4.2

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