rdf 1.0.10.2 → 1.1.0.p0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +8 -8
  2. data/CREDITS +0 -2
  3. data/README +67 -20
  4. data/VERSION +1 -1
  5. data/etc/doap.nt +75 -75
  6. data/lib/rdf.rb +15 -64
  7. data/lib/rdf/format.rb +11 -20
  8. data/lib/rdf/mixin/countable.rb +4 -11
  9. data/lib/rdf/mixin/enumerable.rb +4 -8
  10. data/lib/rdf/mixin/mutable.rb +1 -4
  11. data/lib/rdf/mixin/queryable.rb +13 -60
  12. data/lib/rdf/model/graph.rb +46 -22
  13. data/lib/rdf/model/list.rb +27 -102
  14. data/lib/rdf/model/literal.rb +48 -100
  15. data/lib/rdf/model/literal/date.rb +1 -1
  16. data/lib/rdf/model/literal/datetime.rb +1 -35
  17. data/lib/rdf/model/literal/decimal.rb +0 -30
  18. data/lib/rdf/model/literal/double.rb +6 -14
  19. data/lib/rdf/model/literal/integer.rb +3 -11
  20. data/lib/rdf/model/literal/numeric.rb +0 -40
  21. data/lib/rdf/model/literal/time.rb +4 -3
  22. data/lib/rdf/model/node.rb +1 -3
  23. data/lib/rdf/model/statement.rb +7 -47
  24. data/lib/rdf/model/term.rb +9 -0
  25. data/lib/rdf/model/uri.rb +28 -68
  26. data/lib/rdf/model/value.rb +1 -31
  27. data/lib/rdf/nquads.rb +4 -7
  28. data/lib/rdf/ntriples.rb +2 -2
  29. data/lib/rdf/ntriples/format.rb +1 -2
  30. data/lib/rdf/ntriples/reader.rb +15 -68
  31. data/lib/rdf/ntriples/writer.rb +13 -53
  32. data/lib/rdf/query.rb +1 -8
  33. data/lib/rdf/query/pattern.rb +25 -7
  34. data/lib/rdf/query/solution.rb +3 -19
  35. data/lib/rdf/query/solutions.rb +4 -22
  36. data/lib/rdf/query/variable.rb +1 -3
  37. data/lib/rdf/reader.rb +8 -22
  38. data/lib/rdf/repository.rb +23 -5
  39. data/lib/rdf/transaction.rb +19 -8
  40. data/lib/rdf/util/aliasing.rb +3 -13
  41. data/lib/rdf/util/cache.rb +2 -3
  42. data/lib/rdf/util/file.rb +5 -15
  43. data/lib/rdf/vocab.rb +19 -20
  44. data/lib/rdf/writer.rb +5 -44
  45. metadata +12 -27
  46. data/lib/rdf/vocab/schema.rb +0 -652
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  module RDF
3
2
  ##
4
3
  # **`RDF::NQuads`** provides support for the N-Quads serialization format.
@@ -18,7 +17,7 @@ module RDF
18
17
  # RDF::Format.for(:content_type => "application/n-quads")
19
18
  # RDF::Format.for(:content_type => "text/x-nquads")
20
19
  #
21
- # @see http://www.w3.org/TR/n-quads/
20
+ # @see http://sw.deri.org/2008/07/n-quads/#mediatype
22
21
  # @since 0.4.0
23
22
  class Format < RDF::Format
24
23
  content_type 'application/n-quads', :extension => :nq, :alias => ['text/x-nquads']
@@ -39,14 +38,12 @@ module RDF
39
38
  def self.detect(sample)
40
39
  !!sample.match(%r(
41
40
  (?:\s*(?:<[^>]*>) | (?:_:\w+)) # Subject
42
- \s*
43
41
  (?:\s*<[^>]*>) # Predicate
44
42
  \s*
45
43
  (?:(?:<[^>]*>) | (?:_:\w+) | (?:"[^"\n]*"(?:^^|@\S+)?)) # Object
46
- \s*
47
- (?:\s*(?:<[^>]*>) | (?:_:\w+)) # Context
44
+ (?:\s*<[^>]*>) # Context
48
45
  \s*\.
49
- )x) && !(
46
+ )mx) && !(
50
47
  sample.match(%r(@(base|prefix|keywords)|\{)) || # Not Turtle/N3/TriG
51
48
  sample.match(%r(<(html|rdf))i) # Not HTML or XML
52
49
  )
@@ -81,7 +78,7 @@ module RDF
81
78
  subject = read_uriref || read_node || fail_subject
82
79
  predicate = read_uriref(:intern => true) || fail_predicate
83
80
  object = read_uriref || read_node || read_literal || fail_object
84
- context = read_uriref || read_node
81
+ context = read_uriref || read_node || read_literal
85
82
  if validate? && !read_eos
86
83
  raise RDF::ReaderError, "expected end of statement in line #{lineno}: #{current_line.inspect}"
87
84
  end
@@ -32,12 +32,12 @@ module RDF
32
32
  # @example Requiring the `RDF::NTriples` module explicitly
33
33
  # require 'rdf/ntriples'
34
34
  #
35
- # @see http://www.w3.org/TR/n-triples/
35
+ # @see http://www.w3.org/TR/rdf-testcases/#ntriples
36
36
  # @see http://en.wikipedia.org/wiki/N-Triples
37
+ # @see http://librdf.org/ntriples/
37
38
  #
38
39
  # @author [Arto Bendiken](http://ar.to/)
39
40
  module NTriples
40
- require 'iconv' unless "".respond_to?(:encode )# needed on Ruby 1.8.x
41
41
  require 'rdf/ntriples/format'
42
42
  autoload :Reader, 'rdf/ntriples/reader'
43
43
  autoload :Writer, 'rdf/ntriples/writer'
@@ -15,7 +15,6 @@ module RDF::NTriples
15
15
  # RDF::Format.for(:content_type => "text/plain")
16
16
  #
17
17
  # @see http://www.w3.org/TR/rdf-testcases/#ntriples
18
- # @see http://www.w3.org/TR/n-triples/
19
18
  class Format < RDF::Format
20
19
  content_type 'application/n-triples', :extension => :nt, :alias => ['text/plain']
21
20
  content_encoding 'utf-8'
@@ -40,7 +39,7 @@ module RDF::NTriples
40
39
  \s*
41
40
  (?:(?:<[^>]*>) | (?:_:\w+) | (?:"[^"\n]*"(?:^^|@\S+)?)) # Object
42
41
  \s*\.
43
- )x) && !(
42
+ )mx) && !(
44
43
  sample.match(%r(@(base|prefix|keywords)|\{)) || # Not Turtle/N3/TriG
45
44
  sample.match(%r(<(html|rdf))i) # Not HTML or XML
46
45
  ) && !RDF::NQuads::Format.detect(sample)
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  module RDF::NTriples
3
2
  ##
4
3
  # N-Triples parser.
@@ -26,7 +25,6 @@ module RDF::NTriples
26
25
  # end
27
26
  #
28
27
  # @see http://www.w3.org/TR/rdf-testcases/#ntriples
29
- # @see http://www.w3.org/TR/n-triples/
30
28
  class Reader < RDF::Reader
31
29
  format RDF::NTriples::Format
32
30
 
@@ -44,60 +42,16 @@ module RDF::NTriples
44
42
  #
45
43
  # @see http://www.w3.org/TR/n-triples/
46
44
  # @see http://www.w3.org/TR/turtle/
47
- if RUBY_VERSION >= '1.9'
48
- ##
49
- # Unicode regular expressions for Ruby 1.9+ with the Oniguruma engine.
50
- U_CHARS1 = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
51
- [\\u00C0-\\u00D6]|[\\u00D8-\\u00F6]|[\\u00F8-\\u02FF]|
52
- [\\u0370-\\u037D]|[\\u037F-\\u1FFF]|[\\u200C-\\u200D]|
53
- [\\u2070-\\u218F]|[\\u2C00-\\u2FEF]|[\\u3001-\\uD7FF]|
54
- [\\uF900-\\uFDCF]|[\\uFDF0-\\uFFFD]|[\\u{10000}-\\u{EFFFF}]
55
- EOS
56
- U_CHARS2 = Regexp.compile("\\u00B7|[\\u0300-\\u036F]|[\\u203F-\\u2040]").freeze
57
- IRI_RANGE = Regexp.compile("[[^<>\"{}|^`\\\\]&&[^\\x00-\\x20]]").freeze
58
- else
59
- ##
60
- # UTF-8 regular expressions for Ruby 1.8.x.
61
- U_CHARS1 = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
62
- \\xC3[\\x80-\\x96]| (?# [\\u00C0-\\u00D6]|)
63
- \\xC3[\\x98-\\xB6]| (?# [\\u00D8-\\u00F6]|)
64
- \\xC3[\\xB8-\\xBF]|[\\xC4-\\xCB][\\x80-\\xBF]| (?# [\\u00F8-\\u02FF]|)
65
- \\xCD[\\xB0-\\xBD]| (?# [\\u0370-\\u037D]|)
66
- \\xCD\\xBF|[\\xCE-\\xDF][\\x80-\\xBF]| (?# [\\u037F-\\u1FFF]|)
67
- \\xE0[\\xA0-\\xBF][\\x80-\\xBF]| (?# ...)
68
- \\xE1[\\x80-\\xBF][\\x80-\\xBF]| (?# ...)
69
- \\xE2\\x80[\\x8C-\\x8D]| (?# [\\u200C-\\u200D]|)
70
- \\xE2\\x81[\\xB0-\\xBF]| (?# [\\u2070-\\u218F]|)
71
- \\xE2[\\x82-\\x85][\\x80-\\xBF]| (?# ...)
72
- \\xE2\\x86[\\x80-\\x8F]| (?# ...)
73
- \\xE2[\\xB0-\\xBE][\\x80-\\xBF]| (?# [\\u2C00-\\u2FEF]|)
74
- \\xE2\\xBF[\\x80-\\xAF]| (?# ...)
75
- \\xE3\\x80[\\x81-\\xBF]| (?# [\\u3001-\\uD7FF]|)
76
- \\xE3[\\x81-\\xBF][\\x80-\\xBF]| (?# ...)
77
- [\\xE4-\\xEC][\\x80-\\xBF][\\x80-\\xBF]| (?# ...)
78
- \\xED[\\x80-\\x9F][\\x80-\\xBF]| (?# ...)
79
- \\xEF[\\xA4-\\xB6][\\x80-\\xBF]| (?# [\\uF900-\\uFDCF]|)
80
- \\xEF\\xB7[\\x80-\\x8F]| (?# ...)
81
- \\xEF\\xB7[\\xB0-\\xBF]| (?# [\\uFDF0-\\uFFFD]|)
82
- \\xEF[\\xB8-\\xBE][\\x80-\\xBF]| (?# ...)
83
- \\xEF\\xBF[\\x80-\\xBD]| (?# ...)
84
- \\xF0[\\x90-\\xBF][\\x80-\\xBF][\\x80-\\xBF]| (?# [\\u{10000}-\\u{EFFFF}])
85
- [\\xF1-\\xF2][\\x80-\\xBF][\\x80-\\xBF][\\x80-\\xBF]|
86
- \\xF3[\\x80-\\xAF][\\x80-\\xBF][\\x80-\\xBF] (?# ...)
87
- EOS
88
- U_CHARS2 = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
89
- \\xC2\\xB7| (?# \\u00B7|)
90
- \\xCC[\\x80-\\xBF]|\\xCD[\\x80-\\xAF]| (?# [\\u0300-\\u036F]|)
91
- \\xE2\\x80\\xBF|\\xE2\\x81\\x80 (?# [\\u203F-\\u2040])
92
- EOS
93
- IRI_RANGE = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
94
- \\x21| (?# ")
95
- [\\x23-\\x3b]|\\x3d| (?# < & >)
96
- [\\x3f-\\x5b]|\\x5d|\\x5f| (?# \ ^ `)
97
- [\\x61-\\x7a]| (?# { } |)
98
- [\\x7e-\\xff]
99
- EOS
100
- end
45
+ ##
46
+ # Unicode regular expressions.
47
+ U_CHARS1 = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
48
+ [\\u00C0-\\u00D6]|[\\u00D8-\\u00F6]|[\\u00F8-\\u02FF]|
49
+ [\\u0370-\\u037D]|[\\u037F-\\u1FFF]|[\\u200C-\\u200D]|
50
+ [\\u2070-\\u218F]|[\\u2C00-\\u2FEF]|[\\u3001-\\uD7FF]|
51
+ [\\uF900-\\uFDCF]|[\\uFDF0-\\uFFFD]|[\\u{10000}-\\u{EFFFF}]
52
+ EOS
53
+ U_CHARS2 = Regexp.compile("\\u00B7|[\\u0300-\\u036F]|[\\u203F-\\u2040]").freeze
54
+ IRI_RANGE = Regexp.compile("[[^<>\"{}|^`\\\\]&&[^\\x00-\\x20]]").freeze
101
55
 
102
56
  # 163s
103
57
  PN_CHARS_BASE = /[A-Z]|[a-z]|#{U_CHARS1}/.freeze
@@ -203,8 +157,7 @@ module RDF::NTriples
203
157
  # @see http://blog.grayproductions.net/articles/understanding_m17n
204
158
  # @see http://yehudakatz.com/2010/05/17/encodings-unabridged/
205
159
  def self.unescape(string)
206
- string = string.to_s
207
- string = string.dup.force_encoding(Encoding::ASCII_8BIT) if string.respond_to?(:force_encoding)
160
+ string = string.to_s.force_encoding(Encoding::ASCII_8BIT)
208
161
 
209
162
  # Decode \t|\n|\r|\"|\\ character escapes:
210
163
  ESCAPE_CHARS.each { |escape| string.gsub!(escape.inspect[1...-1], escape) }
@@ -214,25 +167,21 @@ module RDF::NTriples
214
167
  (string.sub!(ESCAPE_SURROGATE) do
215
168
  if ESCAPE_SURROGATE1.include?($1.hex) && ESCAPE_SURROGATE2.include?($2.hex)
216
169
  s = [$1, $2].pack('H*H*')
217
- s = s.respond_to?(:force_encoding) ?
218
- # for Ruby 1.9+
219
- s.force_encoding(Encoding::UTF_16BE).encode!(Encoding::UTF_8) :
220
- # for Ruby 1.8.x
221
- Iconv.conv('UTF-8', 'UTF-16BE', s)
170
+ s = s.force_encoding(Encoding::UTF_16BE).encode!(Encoding::UTF_8)
222
171
  else
223
172
  s = [$1.hex].pack('U*') << '\u' << $2
224
173
  end
225
- s.respond_to?(:force_encoding) ? s.force_encoding(Encoding::ASCII_8BIT) : s
174
+ s.force_encoding(Encoding::ASCII_8BIT)
226
175
  end)
227
176
  end
228
177
 
229
178
  # Decode \uXXXX and \UXXXXXXXX code points:
230
179
  string.gsub!(ESCAPE_CHAR) do
231
180
  s = [($1 || $2).hex].pack('U*')
232
- s.respond_to?(:force_encoding) ? s.force_encoding(Encoding::ASCII_8BIT) : s
181
+ s.force_encoding(Encoding::ASCII_8BIT)
233
182
  end
234
183
 
235
- string.force_encoding(Encoding::UTF_8) if string.respond_to?(:force_encoding)
184
+ string.force_encoding(Encoding::UTF_8)
236
185
  string
237
186
  end
238
187
 
@@ -290,8 +239,6 @@ module RDF::NTriples
290
239
  uri.canonicalize! if canonicalize?
291
240
  uri
292
241
  end
293
- rescue ArgumentError => e
294
- raise RDF::ReaderError, "invalid URI"
295
242
  end
296
243
 
297
244
  ##
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  module RDF::NTriples
3
2
  ##
4
3
  # N-Triples serializer.
@@ -36,7 +35,6 @@ module RDF::NTriples
36
35
  # end
37
36
  #
38
37
  # @see http://www.w3.org/TR/rdf-testcases/#ntriples
39
- # @see http://www.w3.org/TR/n-triples/
40
38
  class Writer < RDF::Writer
41
39
  format RDF::NTriples::Format
42
40
 
@@ -45,67 +43,53 @@ module RDF::NTriples
45
43
  ESCAPE_ASCII = /\A[\x00-\x7F]*\z/m.freeze
46
44
 
47
45
  ##
48
- # Escape Literal and URI content. If encoding is ASCII, all unicode
49
- # is escaped, otherwise only ASCII characters that must be escaped are
50
- # escaped.
51
- #
52
46
  # @param [String] string
53
- # @param [Encoding] encoding Ruby 1.9 only
47
+ # @param [Encoding] encoding
54
48
  # @return [String]
55
49
  # @see http://www.w3.org/TR/rdf-testcases/#ntrip_strings
56
50
  def self.escape(string, encoding = nil)
57
51
  ret = case
58
52
  when string =~ ESCAPE_PLAIN # a shortcut for the simple case
59
53
  string
60
- when string.respond_to?(:ascii_only?) && string.ascii_only?
54
+ when string.ascii_only?
61
55
  StringIO.open do |buffer|
62
- buffer.set_encoding(Encoding::ASCII) if buffer.respond_to?(:set_encoding)
63
- string.each_byte { |u| buffer << escape_ascii(u, encoding) }
56
+ string.each_byte { |u| buffer << escape_ascii(u) }
64
57
  buffer.string
65
58
  end
66
- when string.respond_to?(:each_char) && encoding && encoding != Encoding::ASCII
59
+ when encoding && encoding != Encoding::ASCII
67
60
  # Not encoding UTF-8 characters
68
61
  StringIO.open do |buffer|
69
- buffer.set_encoding(encoding) if buffer.respond_to?(:set_encoding)
70
62
  string.each_char do |u|
71
63
  buffer << case u.ord
72
64
  when (0x00..0x7F)
73
- escape_ascii(u, encoding)
65
+ escape_ascii(u)
74
66
  else
75
67
  u
76
68
  end
77
69
  end
78
70
  buffer.string
79
71
  end
80
- when string.respond_to?(:each_codepoint)
81
- # Encode ASCII && UTF-8 characters
72
+ else
82
73
  StringIO.open do |buffer|
83
- buffer.set_encoding(Encoding::ASCII) if buffer.respond_to?(:set_encoding)
84
74
  string.each_codepoint { |u| buffer << escape_unicode(u, encoding) }
85
75
  buffer.string
86
76
  end
87
- else # works in Ruby 1.8.x, too
88
- # Encode ASCII && UTF-8 characters
89
- StringIO.open do |buffer|
90
- buffer.set_encoding(Encoding::ASCII) if buffer.respond_to?(:set_encoding)
91
- string.scan(/./mu) { |c| buffer << escape_unicode(u = c.unpack('U*').first, encoding) }
92
- buffer.string
93
- end
94
77
  end
95
- ret.respond_to?(:encode) && encoding && ret.encoding != encoding ? ret.encode(encoding) : ret
78
+ encoding ? ret.dup.force_encoding(encoding) : ret
96
79
  end
97
80
 
98
81
  ##
99
82
  # Escape ascii and unicode characters.
83
+ # If encoding is UTF_8, only ascii characters are escaped.
100
84
  #
101
85
  # @param [Integer, #ord] u
102
- # @param [Encoding] encoding Ruby 1.9 only
86
+ # @param [Encoding] encoding
103
87
  # @return [String]
104
88
  # @see http://www.w3.org/TR/rdf-testcases/#ntrip_strings
105
89
  def self.escape_unicode(u, encoding)
106
90
  case (u = u.ord)
107
91
  when (0x00..0x7F) # ASCII 7-bit
108
- escape_ascii(u, encoding)
92
+ escape_ascii(u)
109
93
  when (0x80..0xFFFF) # Unicode BMP
110
94
  escape_utf16(u)
111
95
  when (0x10000..0x10FFFF) # Unicode
@@ -116,22 +100,15 @@ module RDF::NTriples
116
100
  end
117
101
 
118
102
  ##
119
- # Standard ASCII escape sequences. If encoding is ASCII, use Test-Cases
120
- # sequences, otherwise, assume the test-cases escape sequences. Otherwise,
121
- # the N-Triples recommendation includes `\b` and `\f` escape sequences.
122
- #
123
103
  # @param [Integer, #ord] u
124
104
  # @return [String]
125
105
  # @see http://www.w3.org/TR/rdf-testcases/#ntrip_strings
126
- # @see http://www.w3.org/TR/n-triples/
127
- def self.escape_ascii(u, encoding)
106
+ def self.escape_ascii(u)
128
107
  case (u = u.ord)
129
- when (0x00..0x07) then escape_utf16(u)
130
- when (0x08) then (encoding.nil? || encoding == Encoding::ASCII ? escape_utf16(u) : "\\b")
108
+ when (0x00..0x08) then escape_utf16(u)
131
109
  when (0x09) then "\\t"
132
110
  when (0x0A) then "\\n"
133
- when (0x0B) then escape_utf16(u)
134
- when (0x0C) then (encoding.nil? || encoding == Encoding::ASCII ? escape_utf16(u) : "\\f")
111
+ when (0x0B..0x0C) then escape_utf16(u)
135
112
  when (0x0D) then "\\r"
136
113
  when (0x0E..0x1F) then escape_utf16(u)
137
114
  when (0x22) then "\\\""
@@ -180,23 +157,6 @@ module RDF::NTriples
180
157
  end
181
158
  end
182
159
 
183
- ##
184
- # Initializes the writer.
185
- #
186
- # @param [IO, File] output
187
- # the output stream
188
- # @param [Hash{Symbol => Object}] options
189
- # any additional options. See {RDF::Writer#initialize}
190
- # @option options [Boolean] :validate (true)
191
- # whether to validate terms when serializing
192
- # @yield [writer] `self`
193
- # @yieldparam [RDF::Writer] writer
194
- # @yieldreturn [void]
195
- def initialize(output = $stdout, options = {}, &block)
196
- options = {:validate => true}.merge(options)
197
- super
198
- end
199
-
200
160
  ##
201
161
  # Outputs an N-Triples comment line.
202
162
  #
@@ -89,7 +89,7 @@ module RDF
89
89
  # @return [RDF::Query::Solutions]
90
90
  # the resulting solution sequence
91
91
  # @see RDF::Query#execute
92
- def self.execute(queryable, patterns = {}, options = {}, &block)
92
+ def self.execute(queryable, patterns = nil, options = {}, &block)
93
93
  self.new(patterns, options, &block).execute(queryable, options)
94
94
  end
95
95
 
@@ -243,9 +243,6 @@ module RDF
243
243
  # or named contexts.
244
244
  # The name of `false` will only match against the default context.
245
245
  #
246
- # If the query nas no patterns, it returns a single empty solution as
247
- # per SPARQL 1.1 _Empty Group Pattern_.
248
- #
249
246
  # @param [RDF::Queryable] queryable
250
247
  # the graph or repository to query
251
248
  # @param [Hash{Symbol => Object}] options
@@ -262,7 +259,6 @@ module RDF
262
259
  # @return [RDF::Query::Solutions]
263
260
  # the resulting solution sequence
264
261
  # @see http://www.holygoat.co.uk/blog/entry/2005-10-25-1
265
- # @see http://www.w3.org/TR/sparql11-query/#emptyGroupPattern
266
262
  def execute(queryable, options = {})
267
263
  validate!
268
264
  options = options.dup
@@ -275,9 +271,6 @@ module RDF
275
271
  # the first pattern
276
272
  @solutions = options[:solutions] || (Solutions.new << RDF::Query::Solution.new({}))
277
273
 
278
- # If there are no patterns, just return the empty solution
279
- return @solutions if empty?
280
-
281
274
  patterns = @patterns
282
275
  context = options.fetch(:context, options.fetch(:name, self.context))
283
276
 
@@ -67,6 +67,29 @@ module RDF; class Query
67
67
  subject.nil? && predicate.nil? && object.nil? && context.nil?
68
68
  end
69
69
 
70
+ ##
71
+ # Returns `true` if this is a constant pattern, with all terms being
72
+ # either URIs, blank nodes, or literals.
73
+ #
74
+ # A constant pattern is structurally and functionally equivalent to an
75
+ # RDF statement.
76
+ #
77
+ # @return [Boolean] `true` or `false`
78
+ # @since 0.3.0
79
+ def constant?
80
+ !(variable?)
81
+ end
82
+
83
+ ##
84
+ # Returns `true` if this is a variable pattern, with any term being
85
+ # `nil` or a variable.
86
+ #
87
+ # @return [Boolean] `true` or `false`
88
+ # @since 0.3.0
89
+ def variable?
90
+ subject.nil? || predicate.nil? || object.nil? || context.nil? || has_variables?
91
+ end
92
+
70
93
  ##
71
94
  # Returns `true` if this pattern contains any variables.
72
95
  #
@@ -104,7 +127,7 @@ module RDF; class Query
104
127
  # To match triples only in the default context, set context to `false`.
105
128
  #
106
129
  # @example
107
- # Pattern.new(:s, :p, :o).execute(RDF::Repository.load('etc/doap.nt'))
130
+ # Pattern.new(:s, :p, :o).execute(RDF::Repository.load('data.nt'))
108
131
  #
109
132
  # @param [RDF::Queryable] queryable
110
133
  # the graph or repository to query
@@ -156,12 +179,7 @@ module RDF; class Query
156
179
  # pattern with the corresponding terms in the given `statement`.
157
180
  #
158
181
  # @example
159
- # pattern = Pattern.new(:s, :p, :o)
160
- # solution = pattern.solution(statement)
161
- #
162
- # pattern[:s] #=> statement.subject
163
- # pattern[:p] #=> statement.predicate
164
- # pattern[:o] #=> statement.object
182
+ # pattern.solution(statement)
165
183
  #
166
184
  # @param [RDF::Statement] statement
167
185
  # an RDF statement to bind terms from
@@ -25,7 +25,7 @@ class RDF::Query
25
25
  undef_method(*instance_methods.
26
26
  map(&:to_s).
27
27
  select {|m| m =~ /^\w+$/}.
28
- reject {|m| %w(object_id dup instance_eval inspect to_s class should should_not pretty_print).include?(m) || m[0,2] == '__'}.
28
+ reject {|m| %w(object_id dup instance_eval inspect to_s class).include?(m) || m[0,2] == '__'}.
29
29
  map(&:to_sym))
30
30
 
31
31
  include Enumerable
@@ -145,7 +145,7 @@ class RDF::Query
145
145
  # @return [RDF::Term]
146
146
  # @since 0.3.0
147
147
  def []=(name, value)
148
- @bindings[name.to_sym] = value.is_a?(RDF::Term) ? value : RDF::Literal(value)
148
+ @bindings[name.to_sym] = value
149
149
  end
150
150
 
151
151
  ##
@@ -182,33 +182,17 @@ class RDF::Query
182
182
 
183
183
  ##
184
184
  # Compatible Mappings
185
- #
186
185
  # Two solution mappings u1 and u2 are compatible if, for every variable v in dom(u1) and in dom(u2), u1(v) = u2(v).
187
186
  #
188
187
  # @param [RDF::Query::Solution, #to_hash] other
189
188
  # another query solution or hash bindings
190
189
  # @return [Boolean]
191
- # @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#defn_algCompatibleMapping
192
190
  def compatible?(other)
193
191
  @bindings.all? do |k, v|
194
192
  !other.to_hash.has_key?(k) || other[k].eql?(v)
195
193
  end
196
194
  end
197
-
198
- ##
199
- # Disjoint mapping
200
- #
201
- # A solution is disjoint with another solution if it shares no common variables in their domains.
202
- #
203
- # @param [RDF::Query::Solution] other
204
- # @return [Boolean]
205
- # @see http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#defn_algMinus
206
- def disjoint?(other)
207
- @bindings.none? do |k, v|
208
- v && other.to_hash.has_key?(k) && other[k].eql?(v)
209
- end
210
- end
211
-
195
+
212
196
  ##
213
197
  # Isomorphic Mappings
214
198
  # Two solution mappings u1 and u2 are isomorphic if,