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 +4 -4
- data/README.md +5 -2
- data/VERSION +1 -1
- data/lib/rdf/reasoner/extensions.rb +10 -3
- data/lib/rdf/reasoner/owl.rb +2 -2
- data/lib/rdf/reasoner/rdfs.rb +6 -6
- data/lib/rdf/reasoner/schema.rb +18 -26
- metadata +23 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbd3173e701cc40466c211a064bc71f2e55a45f0
|
4
|
+
data.tar.gz: 7bd3c6390427adc2029daae1ecf40b487c2a1cf0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
104
|
-
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 2.
|
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.
|
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(:
|
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, :
|
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, :
|
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
|
data/lib/rdf/reasoner/owl.rb
CHANGED
@@ -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.
|
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.
|
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?
|
data/lib/rdf/reasoner/rdfs.rb
CHANGED
@@ -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.
|
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.
|
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.
|
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.
|
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(:
|
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(:
|
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.
|
data/lib/rdf/reasoner/schema.rb
CHANGED
@@ -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
|
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
|
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, :
|
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
|
124
|
+
elsif ranges == [RDF::Vocab::SCHEMA.Text] && resource.uri?
|
131
125
|
# Allowed if resource is untyped
|
132
|
-
|
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
|
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.
|
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:
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
62
|
-
type: :
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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:
|
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.
|
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
|