rdf 3.1.7 → 3.1.12
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 +54 -22
- data/VERSION +1 -1
- data/lib/rdf.rb +24 -0
- data/lib/rdf/cli.rb +38 -10
- data/lib/rdf/mixin/enumerable.rb +55 -28
- data/lib/rdf/mixin/mutable.rb +1 -1
- data/lib/rdf/model/dataset.rb +1 -1
- data/lib/rdf/model/graph.rb +35 -13
- data/lib/rdf/model/list.rb +29 -4
- data/lib/rdf/model/literal.rb +14 -14
- data/lib/rdf/model/literal/date.rb +5 -3
- data/lib/rdf/model/literal/datetime.rb +11 -7
- data/lib/rdf/model/literal/time.rb +7 -5
- data/lib/rdf/model/node.rb +2 -6
- data/lib/rdf/model/statement.rb +80 -32
- data/lib/rdf/model/term.rb +22 -4
- data/lib/rdf/model/uri.rb +14 -16
- data/lib/rdf/model/value.rb +53 -16
- data/lib/rdf/nquads.rb +2 -2
- data/lib/rdf/ntriples/reader.rb +6 -6
- data/lib/rdf/ntriples/writer.rb +3 -3
- data/lib/rdf/query.rb +16 -5
- data/lib/rdf/query/pattern.rb +7 -7
- data/lib/rdf/query/solution.rb +22 -11
- data/lib/rdf/query/solutions.rb +18 -7
- data/lib/rdf/query/variable.rb +19 -5
- data/lib/rdf/reader.rb +6 -19
- data/lib/rdf/repository.rb +46 -21
- data/lib/rdf/transaction.rb +13 -3
- data/lib/rdf/util/cache.rb +10 -6
- data/lib/rdf/util/logger.rb +1 -1
- data/lib/rdf/vocab/owl.rb +366 -388
- data/lib/rdf/vocab/rdfs.rb +72 -74
- data/lib/rdf/vocab/rdfv.rb +74 -74
- data/lib/rdf/vocab/writer.rb +41 -25
- data/lib/rdf/vocab/xsd.rb +198 -463
- data/lib/rdf/vocabulary.rb +136 -88
- data/lib/rdf/writer.rb +2 -2
- metadata +9 -9
data/lib/rdf/model/term.rb
CHANGED
@@ -57,11 +57,21 @@ module RDF
|
|
57
57
|
end
|
58
58
|
|
59
59
|
##
|
60
|
-
#
|
60
|
+
# @overload term?
|
61
|
+
# Returns `true` if `self` is a {RDF::Term}.
|
61
62
|
#
|
62
|
-
#
|
63
|
-
|
64
|
-
|
63
|
+
# @return [Boolean]
|
64
|
+
# @overload term?(name)
|
65
|
+
# Returns `true` if `self` contains the given RDF subject term.
|
66
|
+
#
|
67
|
+
# @param [RDF::Resource] value
|
68
|
+
# @return [Boolean]
|
69
|
+
def term?(*args)
|
70
|
+
case args.length
|
71
|
+
when 0 then true
|
72
|
+
when 1 then false
|
73
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
74
|
+
end
|
65
75
|
end
|
66
76
|
|
67
77
|
##
|
@@ -72,6 +82,14 @@ module RDF
|
|
72
82
|
self
|
73
83
|
end
|
74
84
|
|
85
|
+
##
|
86
|
+
# Returns an array including just itself.
|
87
|
+
#
|
88
|
+
# @return [Array<RDF::Value>]
|
89
|
+
def terms
|
90
|
+
[self]
|
91
|
+
end
|
92
|
+
|
75
93
|
##
|
76
94
|
# Returns the base representation of this term.
|
77
95
|
#
|
data/lib/rdf/model/uri.rb
CHANGED
@@ -27,11 +27,6 @@ module RDF
|
|
27
27
|
class URI
|
28
28
|
include RDF::Resource
|
29
29
|
|
30
|
-
##
|
31
|
-
# Defines the maximum number of interned URI references that can be held
|
32
|
-
# cached in memory at any one time.
|
33
|
-
CACHE_SIZE = -1 # unlimited by default
|
34
|
-
|
35
30
|
# IRI components
|
36
31
|
UCSCHAR = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
|
37
32
|
[\\u00A0-\\uD7FF]|[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFEF]|
|
@@ -117,11 +112,13 @@ module RDF
|
|
117
112
|
).freeze
|
118
113
|
|
119
114
|
##
|
115
|
+
# Cache size may be set through {RDF.config} using `uri_cache_size`.
|
116
|
+
#
|
120
117
|
# @return [RDF::Util::Cache]
|
121
118
|
# @private
|
122
119
|
def self.cache
|
123
120
|
require 'rdf/util/cache' unless defined?(::RDF::Util::Cache)
|
124
|
-
@cache ||= RDF::Util::Cache.new(
|
121
|
+
@cache ||= RDF::Util::Cache.new(RDF.config.uri_cache_size)
|
125
122
|
end
|
126
123
|
|
127
124
|
##
|
@@ -229,13 +226,13 @@ module RDF
|
|
229
226
|
@value.dup.force_encoding(Encoding::UTF_8) if @value.encoding != Encoding::UTF_8
|
230
227
|
@value.freeze
|
231
228
|
else
|
232
|
-
%
|
229
|
+
%i(
|
233
230
|
scheme
|
234
231
|
user password userinfo
|
235
232
|
host port authority
|
236
233
|
path query fragment
|
237
|
-
).
|
238
|
-
if options.
|
234
|
+
).each do |meth|
|
235
|
+
if options.key?(meth)
|
239
236
|
self.send("#{meth}=".to_sym, options[meth])
|
240
237
|
else
|
241
238
|
self.send(meth)
|
@@ -419,7 +416,7 @@ module RDF
|
|
419
416
|
# @see http://tools.ietf.org/html/rfc3986#section-5.2.2
|
420
417
|
# @see http://tools.ietf.org/html/rfc3986#section-5.2.3
|
421
418
|
def join(*uris)
|
422
|
-
joined_parts = object.dup.delete_if {|k, v|
|
419
|
+
joined_parts = object.dup.delete_if {|k, v| %i(user password host port).include?(k)}
|
423
420
|
|
424
421
|
uris.each do |uri|
|
425
422
|
uri = RDF::URI.new(uri) unless uri.is_a?(RDF::URI)
|
@@ -583,7 +580,7 @@ module RDF
|
|
583
580
|
else
|
584
581
|
RDF::URI.new(
|
585
582
|
**object.merge(path: '/').
|
586
|
-
keep_if {|k, v|
|
583
|
+
keep_if {|k, v| %i(scheme authority path).include?(k)})
|
587
584
|
end
|
588
585
|
end
|
589
586
|
|
@@ -591,13 +588,14 @@ module RDF
|
|
591
588
|
# Returns `true` if this URI is hierarchical and it's path component isn't equal to `/`.
|
592
589
|
#
|
593
590
|
# @example
|
594
|
-
# RDF::URI('http://example.org/').
|
595
|
-
# RDF::URI('http://example.org/path/').
|
591
|
+
# RDF::URI('http://example.org/').parent? #=> false
|
592
|
+
# RDF::URI('http://example.org/path/').parent? #=> true
|
596
593
|
#
|
597
594
|
# @return [Boolean] `true` or `false`
|
598
|
-
def
|
595
|
+
def parent?
|
599
596
|
!root?
|
600
597
|
end
|
598
|
+
alias_method :has_parent?, :parent?
|
601
599
|
|
602
600
|
##
|
603
601
|
# Returns a copy of this URI with the path component ascended to the
|
@@ -1125,7 +1123,7 @@ module RDF
|
|
1125
1123
|
# @param [String, #to_s] value
|
1126
1124
|
# @return [RDF::URI] self
|
1127
1125
|
def authority=(value)
|
1128
|
-
object.delete_if {|k, v|
|
1126
|
+
object.delete_if {|k, v| %i(user password host port userinfo).include?(k)}
|
1129
1127
|
object[:authority] = (value.to_s.dup.force_encoding(Encoding::UTF_8) if value)
|
1130
1128
|
user; password; userinfo; host; port
|
1131
1129
|
@value = nil
|
@@ -1155,7 +1153,7 @@ module RDF
|
|
1155
1153
|
# @param [String, #to_s] value
|
1156
1154
|
# @return [RDF::URI] self
|
1157
1155
|
def userinfo=(value)
|
1158
|
-
object.delete_if {|k, v|
|
1156
|
+
object.delete_if {|k, v| %i(user password authority).include?(k)}
|
1159
1157
|
object[:userinfo] = (value.to_s.dup.force_encoding(Encoding::UTF_8) if value)
|
1160
1158
|
user; password; authority
|
1161
1159
|
@value = nil
|
data/lib/rdf/model/value.rb
CHANGED
@@ -29,19 +29,38 @@ module RDF
|
|
29
29
|
# @see RDF::Statement
|
30
30
|
module Value
|
31
31
|
##
|
32
|
-
#
|
32
|
+
# @overload graph?
|
33
|
+
# Returns `true` if `self` is a {RDF::Graph}.
|
33
34
|
#
|
34
|
-
#
|
35
|
-
|
36
|
-
|
35
|
+
# @return [Boolean]
|
36
|
+
# @overload graph?(name)
|
37
|
+
# Returns `true` if `self` contains the given RDF graph_name.
|
38
|
+
#
|
39
|
+
# @param [RDF::Resource, false] graph_name
|
40
|
+
# Use value `false` to query for the default graph_name
|
41
|
+
# @return [Boolean]
|
42
|
+
def graph?(*args)
|
43
|
+
case args.length
|
44
|
+
when 0, 1 then false
|
45
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
46
|
+
end
|
37
47
|
end
|
38
48
|
|
39
49
|
##
|
40
|
-
#
|
50
|
+
# @overload statement?
|
51
|
+
# Returns `true` if `self` is a {RDF::Statement}.
|
41
52
|
#
|
42
|
-
#
|
43
|
-
|
44
|
-
|
53
|
+
# @return [Boolean]
|
54
|
+
# @overload statement?(statement)
|
55
|
+
# Returns `true` if `self` contains the given {RDF::Statement}.
|
56
|
+
#
|
57
|
+
# @param [RDF::Statement] statement
|
58
|
+
# @return [Boolean]
|
59
|
+
def statement?(*args)
|
60
|
+
case args.length
|
61
|
+
when 0, 1 then false
|
62
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
63
|
+
end
|
45
64
|
end
|
46
65
|
|
47
66
|
##
|
@@ -53,11 +72,20 @@ module RDF
|
|
53
72
|
end
|
54
73
|
|
55
74
|
##
|
56
|
-
#
|
75
|
+
# @overload term?
|
76
|
+
# Returns `true` if `self` is a {RDF::Term}.
|
57
77
|
#
|
58
|
-
#
|
59
|
-
|
60
|
-
|
78
|
+
# @return [Boolean]
|
79
|
+
# @overload term?(name)
|
80
|
+
# Returns `true` if `self` contains the given RDF subject term.
|
81
|
+
#
|
82
|
+
# @param [RDF::Resource] value
|
83
|
+
# @return [Boolean]
|
84
|
+
def term?(*args)
|
85
|
+
case args.length
|
86
|
+
when 0, 1 then false
|
87
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
88
|
+
end
|
61
89
|
end
|
62
90
|
|
63
91
|
##
|
@@ -103,12 +131,21 @@ module RDF
|
|
103
131
|
end
|
104
132
|
|
105
133
|
##
|
106
|
-
#
|
134
|
+
# @overload variable?
|
135
|
+
# Returns `true` if `self` is a {RDF::Query::Variable}, or does it contain a variable?
|
107
136
|
#
|
108
|
-
#
|
137
|
+
# @return [Boolean]
|
138
|
+
# @overload variable?(variable)
|
139
|
+
# Returns `true` if `self` contains the given variable.
|
140
|
+
#
|
141
|
+
# @param [RDF::Resource] value
|
142
|
+
# @return [Boolean]
|
109
143
|
# @since 0.1.7
|
110
|
-
def variable?
|
111
|
-
|
144
|
+
def variable?(*args)
|
145
|
+
case args.length
|
146
|
+
when 0, 1 then false
|
147
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
148
|
+
end
|
112
149
|
end
|
113
150
|
|
114
151
|
##
|
data/lib/rdf/nquads.rb
CHANGED
@@ -69,9 +69,9 @@ module RDF
|
|
69
69
|
|
70
70
|
begin
|
71
71
|
unless blank? || read_comment
|
72
|
-
subject = read_uriref || read_node ||
|
72
|
+
subject = read_uriref || read_node || read_embTriple || fail_subject
|
73
73
|
predicate = read_uriref(intern: true) || fail_predicate
|
74
|
-
object = read_uriref || read_node || read_literal ||
|
74
|
+
object = read_uriref || read_node || read_literal || read_embTriple || fail_object
|
75
75
|
graph_name = read_uriref || read_node
|
76
76
|
if validate? && !read_eos
|
77
77
|
log_error("Expected end of statement (found: #{current_line.inspect})", lineno: lineno, exception: RDF::ReaderError)
|
data/lib/rdf/ntriples/reader.rb
CHANGED
@@ -213,7 +213,7 @@ module RDF::NTriples
|
|
213
213
|
begin
|
214
214
|
read_statement
|
215
215
|
rescue RDF::ReaderError
|
216
|
-
value = read_uriref || read_node || read_literal ||
|
216
|
+
value = read_uriref || read_node || read_literal || read_embTriple
|
217
217
|
log_recover
|
218
218
|
value
|
219
219
|
end
|
@@ -229,9 +229,9 @@ module RDF::NTriples
|
|
229
229
|
|
230
230
|
begin
|
231
231
|
unless blank? || read_comment
|
232
|
-
subject = read_uriref || read_node ||
|
232
|
+
subject = read_uriref || read_node || read_embTriple || fail_subject
|
233
233
|
predicate = read_uriref(intern: true) || fail_predicate
|
234
|
-
object = read_uriref || read_node || read_literal ||
|
234
|
+
object = read_uriref || read_node || read_literal || read_embTriple || fail_object
|
235
235
|
|
236
236
|
if validate? && !read_eos
|
237
237
|
log_error("Expected end of statement (found: #{current_line.inspect})", lineno: lineno, exception: RDF::ReaderError)
|
@@ -247,11 +247,11 @@ module RDF::NTriples
|
|
247
247
|
|
248
248
|
##
|
249
249
|
# @return [RDF::Statement]
|
250
|
-
def
|
250
|
+
def read_embTriple
|
251
251
|
if @options[:rdfstar] && match(ST_START)
|
252
|
-
subject = read_uriref || read_node ||
|
252
|
+
subject = read_uriref || read_node || read_embTriple || fail_subject
|
253
253
|
predicate = read_uriref(intern: true) || fail_predicate
|
254
|
-
object = read_uriref || read_node || read_literal ||
|
254
|
+
object = read_uriref || read_node || read_literal || read_embTriple || fail_object
|
255
255
|
if !match(ST_END)
|
256
256
|
log_error("Expected end of statement (found: #{current_line.inspect})", lineno: lineno, exception: RDF::ReaderError)
|
257
257
|
end
|
data/lib/rdf/ntriples/writer.rb
CHANGED
@@ -227,7 +227,7 @@ module RDF::NTriples
|
|
227
227
|
# @param [RDF::Statement] statement
|
228
228
|
# @param [Hash{Symbol => Object}] options ({})
|
229
229
|
# @return [String]
|
230
|
-
def
|
230
|
+
def format_embTriple(statement, **options)
|
231
231
|
"<<%s %s %s>>" % statement.to_a.map { |value| format_term(value, **options) }
|
232
232
|
end
|
233
233
|
##
|
@@ -309,8 +309,8 @@ module RDF::NTriples
|
|
309
309
|
when RDF::Literal
|
310
310
|
# Note, escaping here is more robust than in Term
|
311
311
|
text = quoted(escaped(literal.value))
|
312
|
-
text << "@#{literal.language}" if literal.
|
313
|
-
text << "^^<#{uri_for(literal.datatype)}>" if literal.
|
312
|
+
text << "@#{literal.language}" if literal.language?
|
313
|
+
text << "^^<#{uri_for(literal.datatype)}>" if literal.datatype?
|
314
314
|
text
|
315
315
|
else
|
316
316
|
quoted(escaped(literal.to_s))
|
data/lib/rdf/query.rb
CHANGED
@@ -255,7 +255,7 @@ module RDF
|
|
255
255
|
# @see RDF::Query::Pattern#cost
|
256
256
|
# @since 0.3.0
|
257
257
|
def optimize!(**options)
|
258
|
-
optional, required = @patterns.partition(&:optional?)
|
258
|
+
optional, required = @patterns.uniq.partition(&:optional?)
|
259
259
|
required.sort! do |a, b|
|
260
260
|
(a.cost || 0) <=> (b.cost || 0)
|
261
261
|
end
|
@@ -443,11 +443,22 @@ module RDF
|
|
443
443
|
end
|
444
444
|
|
445
445
|
##
|
446
|
-
#
|
446
|
+
# @overload variable?
|
447
|
+
# Returns `true` if any pattern contains a variable.
|
447
448
|
#
|
448
|
-
#
|
449
|
-
|
450
|
-
|
449
|
+
# @return [Boolean]
|
450
|
+
# @overload variable?(variables)
|
451
|
+
# Returns `true` if any pattern contains any of the variables.
|
452
|
+
#
|
453
|
+
# @param [Array<Symbol, #to_sym>] variables
|
454
|
+
# @return [Boolean]
|
455
|
+
def variable?(*args)
|
456
|
+
case args.length
|
457
|
+
when 0 then !variables.empty?
|
458
|
+
when 1
|
459
|
+
patterns.any? {|p| p.variable?(*args)}
|
460
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
461
|
+
end
|
451
462
|
end
|
452
463
|
alias_method :variables?, :variable?
|
453
464
|
alias_method :has_variables?, :variable?
|
data/lib/rdf/query/pattern.rb
CHANGED
@@ -85,13 +85,13 @@ module RDF; class Query
|
|
85
85
|
#
|
86
86
|
# @return [Boolean] `true` or `false`
|
87
87
|
# @since 0.3.0
|
88
|
-
def
|
88
|
+
def variables?
|
89
89
|
subject && subject.variable? ||
|
90
90
|
predicate && predicate.variable? ||
|
91
91
|
object && object.variable? ||
|
92
92
|
graph_name && graph_name.variable?
|
93
93
|
end
|
94
|
-
alias_method :
|
94
|
+
alias_method :has_variables?, :variables?
|
95
95
|
|
96
96
|
##
|
97
97
|
# Returns `true` if this is an optional pattern.
|
@@ -111,10 +111,10 @@ module RDF; class Query
|
|
111
111
|
#
|
112
112
|
# @return [Boolean] `true` or `false`
|
113
113
|
def valid?
|
114
|
-
(
|
115
|
-
(
|
116
|
-
(
|
117
|
-
(
|
114
|
+
(subject? ? (subject.resource? || subject.variable?) && subject.valid? : true) &&
|
115
|
+
(predicate? ? (predicate.uri? || predicate.variable?) && predicate.valid? : true) &&
|
116
|
+
(object? ? (object.term? || object.variable?) && object.valid? : true) &&
|
117
|
+
(graph? ? (graph_name.resource? || graph_name.variable?) && graph_name.valid? : true)
|
118
118
|
rescue NoMethodError
|
119
119
|
false
|
120
120
|
end
|
@@ -248,7 +248,7 @@ module RDF; class Query
|
|
248
248
|
# @param [RDF::Statement] statement
|
249
249
|
# @return [Array<RDF::Term>]
|
250
250
|
def var_values(var, statement)
|
251
|
-
|
251
|
+
%i(subject predicate object graph_name).map do |position|
|
252
252
|
po = self.send(position)
|
253
253
|
so = statement.send(position)
|
254
254
|
po.var_values(var, so) if po.respond_to?(:var_values)
|
data/lib/rdf/query/solution.rb
CHANGED
@@ -114,16 +114,27 @@ class RDF::Query
|
|
114
114
|
end
|
115
115
|
|
116
116
|
##
|
117
|
-
#
|
117
|
+
# @overload variable?
|
118
|
+
# Returns `false`.
|
119
|
+
#
|
120
|
+
# @return [Boolean]
|
121
|
+
# @overload variable?(variables)
|
122
|
+
# Returns `true` if this solution contains bindings for any of the given
|
118
123
|
# `variables`.
|
119
124
|
#
|
120
|
-
#
|
121
|
-
#
|
122
|
-
# @return [Boolean] `true` or `false`
|
125
|
+
# @param [Array<Symbol, #to_sym>] variables
|
126
|
+
# @return [Boolean]
|
123
127
|
# @since 0.3.0
|
124
|
-
def
|
125
|
-
|
128
|
+
def variable?(*args)
|
129
|
+
case args.length
|
130
|
+
when 0 then false
|
131
|
+
when 1
|
132
|
+
args.first.any? { |variable| bound?(variable) }
|
133
|
+
else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
|
134
|
+
end
|
126
135
|
end
|
136
|
+
alias_method :variables?, :variable?
|
137
|
+
alias_method :has_variables?, :variable?
|
127
138
|
|
128
139
|
##
|
129
140
|
# Enumerates over every variable in this solution.
|
@@ -253,7 +264,7 @@ class RDF::Query
|
|
253
264
|
# @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#defn_algCompatibleMapping
|
254
265
|
def compatible?(other)
|
255
266
|
@bindings.all? do |k, v|
|
256
|
-
!other.to_h.
|
267
|
+
!other.to_h.key?(k) || other[k].eql?(v)
|
257
268
|
end
|
258
269
|
end
|
259
270
|
|
@@ -267,7 +278,7 @@ class RDF::Query
|
|
267
278
|
# @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#defn_algMinus
|
268
279
|
def disjoint?(other)
|
269
280
|
@bindings.none? do |k, v|
|
270
|
-
v && other.to_h.
|
281
|
+
v && other.to_h.key?(k) && other[k].eql?(v)
|
271
282
|
end
|
272
283
|
end
|
273
284
|
|
@@ -281,7 +292,7 @@ class RDF::Query
|
|
281
292
|
# @return [Boolean]
|
282
293
|
def isomorphic_with?(other)
|
283
294
|
@bindings.all? do |k, v|
|
284
|
-
!other.to_h.
|
295
|
+
!other.to_h.key?(k) || other[k].eql?(v)
|
285
296
|
end
|
286
297
|
end
|
287
298
|
|
@@ -332,7 +343,7 @@ class RDF::Query
|
|
332
343
|
# @param [Symbol] name
|
333
344
|
# @return [RDF::Term]
|
334
345
|
def method_missing(name, *args, &block)
|
335
|
-
if args.empty? && @bindings.
|
346
|
+
if args.empty? && @bindings.key?(name.to_sym)
|
336
347
|
@bindings[name.to_sym]
|
337
348
|
else
|
338
349
|
super # raises NoMethodError
|
@@ -342,7 +353,7 @@ class RDF::Query
|
|
342
353
|
##
|
343
354
|
# @return [Boolean]
|
344
355
|
def respond_to_missing?(name, include_private = false)
|
345
|
-
@bindings.
|
356
|
+
@bindings.key?(name.to_sym) || super
|
346
357
|
end
|
347
358
|
|
348
359
|
##
|