redlander 0.3.6 → 0.4.0
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.
- data/.gitignore +20 -0
- data/ChangeLog +19 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +30 -0
- data/LICENSE +7 -0
- data/README.rdoc +85 -12
- data/Rakefile +5 -4
- data/lib/redland.rb +6 -2
- data/lib/redlander.rb +5 -3
- data/lib/redlander/model.rb +98 -16
- data/lib/redlander/model_proxy.rb +115 -58
- data/lib/redlander/node.rb +62 -59
- data/lib/redlander/parsing.rb +123 -0
- data/lib/redlander/serializing.rb +89 -0
- data/lib/redlander/statement.rb +61 -60
- data/lib/redlander/uri.rb +20 -13
- data/lib/redlander/version.rb +2 -1
- data/redlander.gemspec +28 -0
- data/spec/fixtures/doap.nt +62 -0
- data/spec/fixtures/doap.rdf +189 -0
- data/spec/fixtures/doap.ttl +53 -0
- data/spec/lib/redlander/model_spec.rb +304 -0
- data/spec/{redlander → lib/redlander}/node_spec.rb +26 -12
- data/spec/lib/redlander/statement_spec.rb +56 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +15 -4
- metadata +49 -37
- data/lib/redlander/error_container.rb +0 -42
- data/lib/redlander/parser.rb +0 -92
- data/lib/redlander/parser_proxy.rb +0 -22
- data/lib/redlander/serializer.rb +0 -85
- data/lib/redlander/storage.rb +0 -56
- data/lib/redlander/stream.rb +0 -57
- data/lib/redlander/stream_enumerator.rb +0 -17
- data/spec/redlander/model_spec.rb +0 -255
- data/spec/redlander/parser_spec.rb +0 -96
- data/spec/redlander/serializer_spec.rb +0 -52
- data/spec/redlander/statement_spec.rb +0 -77
data/lib/redlander/node.rb
CHANGED
@@ -1,86 +1,69 @@
|
|
1
1
|
module Redlander
|
2
|
+
# RDF node (usually, a part of an RDF statement)
|
2
3
|
class Node
|
4
|
+
# @api private
|
3
5
|
attr_reader :rdf_node
|
4
6
|
|
7
|
+
# Datatype URI for the literal node, or nil
|
8
|
+
attr_reader :datatype
|
9
|
+
|
5
10
|
# Create a RDF node.
|
6
|
-
#
|
11
|
+
#
|
12
|
+
# @param [Any] arg
|
7
13
|
# - an instance of URI - to create a RDF "resource",
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# -
|
11
|
-
# to create a node from subject, predicate or object
|
12
|
-
# (determined by "role" parameter) of the statement.
|
14
|
+
# Note that you cannot create a resource node from an URI string,
|
15
|
+
# it must be an instance of URI. Otherwise it is treated as a string literal.
|
16
|
+
# - nil (or absent) - to create a blank node,
|
13
17
|
# - any other Ruby object, which can be coerced into a literal.
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
|
18
|
-
def initialize(arg = nil, role = :subject)
|
19
|
-
@bound = false
|
18
|
+
# @param [Hash] options
|
19
|
+
# @option options [String] :blank_id optional ID to use for a blank node.
|
20
|
+
# @raise [RedlandError] if it fails to create a node from the given args.
|
21
|
+
def initialize(arg = nil, options = {})
|
20
22
|
@rdf_node = case arg
|
23
|
+
when FFI::Pointer
|
24
|
+
unless Redland.librdf_node_is_literal(arg).zero?
|
25
|
+
rdf_uri = Redland.librdf_node_get_literal_value_datatype_uri(arg)
|
26
|
+
@datatype = rdf_uri.null? ? XmlSchema.datatype_of("") : URI(Redland.librdf_uri_to_string(rdf_uri))
|
27
|
+
end
|
28
|
+
wrap(arg)
|
21
29
|
when NilClass
|
22
|
-
Redland.librdf_new_node_from_blank_identifier(Redlander.rdf_world,
|
30
|
+
Redland.librdf_new_node_from_blank_identifier(Redlander.rdf_world, options[:blank_id])
|
23
31
|
when URI
|
24
32
|
Redland.librdf_new_node_from_uri_string(Redlander.rdf_world, arg.to_s)
|
25
|
-
when Node
|
26
|
-
Redland.librdf_new_node_from_node(arg.rdf_node)
|
27
|
-
when Statement
|
28
|
-
# TODO: Bound nodes should better be produced
|
29
|
-
# using an explicit "factory" like Node.from_statement
|
30
|
-
# to keep the clutter in the constructor at minimum.
|
31
|
-
# (Esp. handling the "bound" stuff)
|
32
|
-
@bound = true
|
33
|
-
case role
|
34
|
-
when :subject
|
35
|
-
copy_rdf_node_on_initialize(Redland.librdf_statement_get_subject(arg.rdf_statement))
|
36
|
-
when :object
|
37
|
-
copy_rdf_node_on_initialize(Redland.librdf_statement_get_object(arg.rdf_statement))
|
38
|
-
when :predicate
|
39
|
-
copy_rdf_node_on_initialize(Redland.librdf_statement_get_predicate(arg.rdf_statement))
|
40
|
-
else
|
41
|
-
raise RedlandError.new("Invalid role specified")
|
42
|
-
end
|
43
33
|
else
|
44
34
|
value = arg.respond_to?(:xmlschema) ? arg.xmlschema : arg.to_s
|
45
|
-
datatype =
|
46
|
-
Redland.librdf_new_node_from_typed_literal(Redlander.rdf_world, value, nil, datatype.rdf_uri)
|
35
|
+
@datatype = XmlSchema.datatype_of(arg)
|
36
|
+
Redland.librdf_new_node_from_typed_literal(Redlander.rdf_world, value, nil, Uri.new(@datatype).rdf_uri)
|
47
37
|
end
|
48
|
-
if @rdf_node.null?
|
49
|
-
|
50
|
-
else
|
51
|
-
ObjectSpace.define_finalizer(self, proc { Redland.librdf_free_node(@rdf_node) })
|
52
|
-
# bound nodes cannot be added to (other) statements
|
53
|
-
freeze if @bound
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
# Bound nodes are those belonging to a statement
|
58
|
-
# (bound nodes cannot be modified or added to other statements).
|
59
|
-
def bound?
|
60
|
-
@bound
|
38
|
+
raise RedlandError, "Failed to create a new node" if @rdf_node.null?
|
39
|
+
ObjectSpace.define_finalizer(self, proc { Redland.librdf_free_node(@rdf_node) })
|
61
40
|
end
|
62
41
|
|
42
|
+
# Check whether the node is a resource (identified by a URI)
|
43
|
+
#
|
44
|
+
# @return [Boolean]
|
63
45
|
def resource?
|
64
46
|
Redland.librdf_node_is_resource(@rdf_node) != 0
|
65
47
|
end
|
66
48
|
|
67
49
|
# Return true if node is a literal.
|
50
|
+
#
|
51
|
+
# @return [Boolean]
|
68
52
|
def literal?
|
69
53
|
Redland.librdf_node_is_literal(@rdf_node) != 0
|
70
54
|
end
|
71
55
|
|
72
56
|
# Return true if node is a blank node.
|
57
|
+
#
|
58
|
+
# @return [Boolean]
|
73
59
|
def blank?
|
74
60
|
Redland.librdf_node_is_blank(@rdf_node) != 0
|
75
61
|
end
|
76
62
|
|
77
|
-
# Return the datatype URI of the node.
|
78
|
-
# Returns nil if the node is not a literal, or has no datatype URI.
|
79
|
-
def datatype
|
80
|
-
Uri.new(self).to_s if literal?
|
81
|
-
end
|
82
|
-
|
83
63
|
# Equivalency. Only works for comparing two Nodes.
|
64
|
+
#
|
65
|
+
# @param [Node] other_node Node to be compared with.
|
66
|
+
# @return [Boolean]
|
84
67
|
def eql?(other_node)
|
85
68
|
Redland.librdf_node_equals(@rdf_node, other_node.rdf_node) != 0
|
86
69
|
end
|
@@ -91,14 +74,37 @@ module Redlander
|
|
91
74
|
end
|
92
75
|
|
93
76
|
# Convert this node to a string (with a datatype suffix).
|
77
|
+
#
|
78
|
+
# @return [String]
|
94
79
|
def to_s
|
95
80
|
Redland.librdf_node_to_string(@rdf_node)
|
96
81
|
end
|
97
82
|
|
83
|
+
# Internal URI of the Node.
|
84
|
+
#
|
85
|
+
# Returns the datatype URI for literal nodes,
|
86
|
+
# nil for blank nodes.
|
87
|
+
#
|
88
|
+
# @return [URI, nil]
|
89
|
+
def uri
|
90
|
+
if resource?
|
91
|
+
URI(to_s[1..-2])
|
92
|
+
elsif literal?
|
93
|
+
datatype
|
94
|
+
else
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
98
99
|
# Value of the literal node as a Ruby object instance.
|
100
|
+
#
|
101
|
+
# Returns an instance of URI for resource nodes,
|
102
|
+
# "blank identifier" for blank nodes.
|
103
|
+
#
|
104
|
+
# @return [URI, Any]
|
99
105
|
def value
|
100
106
|
if resource?
|
101
|
-
|
107
|
+
uri
|
102
108
|
else
|
103
109
|
XmlSchema.instantiate(to_s)
|
104
110
|
end
|
@@ -107,13 +113,10 @@ module Redlander
|
|
107
113
|
|
108
114
|
private
|
109
115
|
|
110
|
-
|
116
|
+
# @api private
|
117
|
+
def wrap(n)
|
111
118
|
if n.null?
|
112
|
-
|
113
|
-
n
|
114
|
-
else
|
115
|
-
raise RedlandError.new("Failed to create a new node")
|
116
|
-
end
|
119
|
+
raise RedlandError, "Failed to create a new node"
|
117
120
|
else
|
118
121
|
Redland.librdf_new_node_from_node(n)
|
119
122
|
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module Redlander
|
2
|
+
# Syntax parsing methods.
|
3
|
+
# "self" is assumed to be an instance of Redlander::Model
|
4
|
+
module Parsing
|
5
|
+
# Core parsing method for non-streams
|
6
|
+
#
|
7
|
+
# @note
|
8
|
+
# If a block is given, the extracted statements will be yielded into
|
9
|
+
# the block and inserted into the model depending on the output
|
10
|
+
# of the block (if true, the statement will be added,
|
11
|
+
# if false, the statement will not be added).
|
12
|
+
#
|
13
|
+
# @param [String, URI] content
|
14
|
+
# - Can be a String,
|
15
|
+
# causing the statements to be extracted
|
16
|
+
# directly from it, or
|
17
|
+
# - URI
|
18
|
+
# causing the content to be first pulled
|
19
|
+
# from the specified URI (or a local file,
|
20
|
+
# if URI schema == "file:")
|
21
|
+
# @param [Hash] options
|
22
|
+
# @option options [String] :format name of the parser to use,
|
23
|
+
# @option options [String] :mime_type MIME type of the syntax, if applicable,
|
24
|
+
# @option options [String, URI] :type_uri URI of syntax, if applicable,
|
25
|
+
# @option options [String, URI] :base_uri base URI,
|
26
|
+
# to be applied to the nodes with relative URIs.
|
27
|
+
# @yieldparam [Statement]
|
28
|
+
# @raise [RedlandError] if it fails to create a parser or stream
|
29
|
+
# @return [Model]
|
30
|
+
def from(content, options = {})
|
31
|
+
format = options[:format].to_s
|
32
|
+
mime_type = options[:mime_type] && options[:mime_type].to_s
|
33
|
+
type_uri = options[:type_uri] && options[:type_uri].to_s
|
34
|
+
base_uri = options[:base_uri] && options[:base_uri].to_s
|
35
|
+
content = Uri.new(content) if content.is_a?(URI)
|
36
|
+
|
37
|
+
# FIXME: to be fixed in librdf:
|
38
|
+
# ntriples parser absolutely needs "\n" at the end of the input
|
39
|
+
if format == "ntriples" && !content.is_a?(Uri) && !content.end_with?("\n")
|
40
|
+
content << "\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
rdf_parser = Redland.librdf_new_parser(Redlander.rdf_world, format, mime_type, type_uri)
|
44
|
+
raise RedlandError, "Failed to create a new '#{format}' parser" if rdf_parser.null?
|
45
|
+
|
46
|
+
begin
|
47
|
+
if block_given?
|
48
|
+
rdf_stream =
|
49
|
+
if content.is_a?(Uri)
|
50
|
+
Redland.librdf_parser_parse_as_stream(rdf_parser, content.rdf_uri, base_uri)
|
51
|
+
else
|
52
|
+
Redland.librdf_parser_parse_string_as_stream(rdf_parser, content, base_uri)
|
53
|
+
end
|
54
|
+
raise RedlandError, "Failed to create a new stream" if rdf_stream.null?
|
55
|
+
|
56
|
+
begin
|
57
|
+
while Redland.librdf_stream_end(rdf_stream).zero?
|
58
|
+
statement = Statement.new(Redland.librdf_stream_get_object(rdf_stream))
|
59
|
+
statements.add(statement) if yield statement
|
60
|
+
Redland.librdf_stream_next(rdf_stream)
|
61
|
+
end
|
62
|
+
ensure
|
63
|
+
Redland.librdf_free_stream(rdf_stream)
|
64
|
+
end
|
65
|
+
else
|
66
|
+
if content.is_a?(Uri)
|
67
|
+
Redland.librdf_parser_parse_into_model(rdf_parser, content.rdf_uri, base_uri, @rdf_model).zero?
|
68
|
+
else
|
69
|
+
Redland.librdf_parser_parse_string_into_model(rdf_parser, content, base_uri, @rdf_model).zero?
|
70
|
+
end
|
71
|
+
end
|
72
|
+
ensure
|
73
|
+
Redland.librdf_free_parser(rdf_parser)
|
74
|
+
end
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
# Parse input in RDF/XML format.
|
79
|
+
# Shortcut for {#from}(content, :format => "rdfxml").
|
80
|
+
#
|
81
|
+
# @param (see #from)
|
82
|
+
# @yieldparam [Statement]
|
83
|
+
# @return [void]
|
84
|
+
def from_rdfxml(content, options = {}, &block)
|
85
|
+
from(content, options.merge(:format => "rdfxml"), &block)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Parse input in NTriples format.
|
89
|
+
# Shortcut for {#from}(content, :format => "ntriples").
|
90
|
+
#
|
91
|
+
# @param (see #from)
|
92
|
+
# @yieldparam [Statement]
|
93
|
+
# @return [void]
|
94
|
+
def from_ntriples(content, options = {}, &block)
|
95
|
+
from(content, options.merge(:format => "ntriples"), &block)
|
96
|
+
end
|
97
|
+
|
98
|
+
# Parse input in Turtls format.
|
99
|
+
# Shortcut for {#from}(content, :format => "turtle").
|
100
|
+
#
|
101
|
+
# @param (see #from)
|
102
|
+
# @yieldparam [Statement]
|
103
|
+
# @return [void]
|
104
|
+
def from_turtle(content, options = {}, &block)
|
105
|
+
from(content, options.merge(:format => "turtle"), &block)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Parse input as stream from URI (or File)
|
109
|
+
#
|
110
|
+
# @param [URI, String] uri URI of the endpoint or file path
|
111
|
+
# @param [Hash] options (see {#from})
|
112
|
+
# @yieldparam [Statement]
|
113
|
+
# @return [void]
|
114
|
+
def from_uri(uri, options = {}, &block)
|
115
|
+
if uri.is_a?(String)
|
116
|
+
uri = URI.parse(uri)
|
117
|
+
uri = URI.parse("file://#{File.expand_path(uri.to_s)}") if uri.scheme.nil?
|
118
|
+
end
|
119
|
+
from(uri, options, &block)
|
120
|
+
end
|
121
|
+
alias_method :from_file, :from_uri
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Redlander
|
2
|
+
# Syntax parsing methods.
|
3
|
+
# "self" is assumed to be an instance of Redlander::Model
|
4
|
+
module Serializing
|
5
|
+
# Serialize model into a string
|
6
|
+
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# @option options [String] :format name of the serializer to use,
|
9
|
+
# @option options [String] :mime_type MIME type of the syntax, if applicable,
|
10
|
+
# @option options [String, URI] :type_uri URI of syntax, if applicable,
|
11
|
+
# @option options [String, URI] :base_uri base URI,
|
12
|
+
# to be applied to the nodes with relative URIs.
|
13
|
+
# @raise [RedlandError] if it fails to create a serializer
|
14
|
+
def to(options = {})
|
15
|
+
format = options[:format].to_s
|
16
|
+
mime_type = options[:mime_type] && options[:mime_type].to_s
|
17
|
+
type_uri = options[:type_uri] && options[:type_uri].to_s
|
18
|
+
base_uri = options[:base_uri] && options[:base_uri].to_s
|
19
|
+
|
20
|
+
rdf_serializer = Redland.librdf_new_serializer(Redlander.rdf_world, format, mime_type, type_uri)
|
21
|
+
raise RedlandError, "Failed to create a new serializer" if rdf_serializer.null?
|
22
|
+
|
23
|
+
begin
|
24
|
+
if options[:file]
|
25
|
+
Redland.librdf_serializer_serialize_model_to_file(rdf_serializer, options[:file], base_uri, @rdf_model).zero?
|
26
|
+
else
|
27
|
+
Redland.librdf_serializer_serialize_model_to_string(rdf_serializer, base_uri, @rdf_model)
|
28
|
+
end
|
29
|
+
ensure
|
30
|
+
Redland.librdf_free_serializer(rdf_serializer)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Serialize the model in RDF/XML format.
|
35
|
+
# Shortcut for {#to}(:format => "rdfxml").
|
36
|
+
#
|
37
|
+
# @param (see #to)
|
38
|
+
# @return [String]
|
39
|
+
def to_rdfxml(options = {})
|
40
|
+
to(options.merge(:format => "rdfxml"))
|
41
|
+
end
|
42
|
+
|
43
|
+
# Serialize the model in NTriples format.
|
44
|
+
# Shortcut for {#to}(:format => "ntriples").
|
45
|
+
#
|
46
|
+
# @param (see #to)
|
47
|
+
# @return [String]
|
48
|
+
def to_ntriples(options = {})
|
49
|
+
to(options.merge(:format => "ntriples"))
|
50
|
+
end
|
51
|
+
|
52
|
+
# Serialize the model in Turtle format.
|
53
|
+
# Shortcut for {#to}(:format => "turtle").
|
54
|
+
#
|
55
|
+
# @param (see #to)
|
56
|
+
# @return [String]
|
57
|
+
def to_turtle(options = {})
|
58
|
+
to(options.merge(:format => "turtle"))
|
59
|
+
end
|
60
|
+
|
61
|
+
# Serialize the model in JSON format.
|
62
|
+
# Shortcut for {#to}(:format => "json").
|
63
|
+
#
|
64
|
+
# @param (see #to)
|
65
|
+
# @return [String]
|
66
|
+
def to_json(options = {})
|
67
|
+
to(options.merge(:format => "json"))
|
68
|
+
end
|
69
|
+
|
70
|
+
# Serialize the model in Dot format.
|
71
|
+
# Shortcut for {#to}(:format => "dot").
|
72
|
+
#
|
73
|
+
# @param (see #to)
|
74
|
+
# @return [String]
|
75
|
+
def to_dot(options = {})
|
76
|
+
to(options.merge(:format => "dot"))
|
77
|
+
end
|
78
|
+
|
79
|
+
# Serialize the model to a file.
|
80
|
+
# Shortcut for {#to}(:format => "rdfxml").
|
81
|
+
#
|
82
|
+
# @param [String] filename path to the output file
|
83
|
+
# @param [Hash] options (see {#to} options)
|
84
|
+
# @return [void]
|
85
|
+
def to_file(filename, options = {})
|
86
|
+
to(options.merge(:file => filename))
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
data/lib/redlander/statement.rb
CHANGED
@@ -1,72 +1,80 @@
|
|
1
|
-
require 'redlander/stream'
|
2
|
-
require "redlander/error_container"
|
3
|
-
|
4
1
|
module Redlander
|
2
|
+
# RDF statement
|
5
3
|
class Statement
|
6
|
-
|
7
|
-
|
4
|
+
# @api private
|
8
5
|
attr_reader :rdf_statement
|
9
6
|
|
10
7
|
# Create an RDF statement.
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
8
|
+
#
|
9
|
+
# @param [Hash] source
|
10
|
+
# @option source [Node, String, URI, nil] :subject
|
11
|
+
# @option source [Node, String, URI, nil] :predicate
|
12
|
+
# @option source [Node, String, URI, nil] :object
|
13
|
+
# @raise [NotImplementedError] if cannot create a Statement from the given source.
|
14
|
+
# @raise [RedlandError] if it fails to create a Statement.
|
17
15
|
def initialize(source = {})
|
18
16
|
@rdf_statement = case source
|
19
|
-
when
|
20
|
-
|
21
|
-
copy_rdf_statement_on_initialize(Redland.librdf_stream_get_object(source.rdf_stream))
|
17
|
+
when FFI::Pointer
|
18
|
+
wrap(source)
|
22
19
|
when Hash
|
23
20
|
# Create a new statement from nodes
|
24
|
-
s =
|
25
|
-
p =
|
26
|
-
o =
|
21
|
+
s = rdf_node_from(source[:subject])
|
22
|
+
p = rdf_node_from(source[:predicate])
|
23
|
+
o = rdf_node_from(source[:object])
|
27
24
|
Redland.librdf_new_statement_from_nodes(Redlander.rdf_world, s, p, o)
|
28
25
|
else
|
29
|
-
#
|
30
|
-
raise NotImplementedError.new
|
26
|
+
raise NotImplementedError, "Cannot create Statement from '#{source.inspect}'"
|
31
27
|
end
|
32
|
-
raise RedlandError
|
28
|
+
raise RedlandError, "Failed to create a new statement" if @rdf_statement.null?
|
33
29
|
ObjectSpace.define_finalizer(self, proc { Redland.librdf_free_statement(@rdf_statement) })
|
34
30
|
end
|
35
31
|
|
32
|
+
# Subject of the statment.
|
33
|
+
#
|
34
|
+
# @return [Node, nil]
|
36
35
|
def subject
|
37
|
-
|
38
|
-
|
36
|
+
rdf_node = Redland.librdf_statement_get_subject(@rdf_statement)
|
37
|
+
rdf_node.null? ? nil : Node.new(rdf_node)
|
39
38
|
end
|
40
39
|
|
40
|
+
# Predicate of the statement.
|
41
|
+
#
|
42
|
+
# @return [Node, nil]
|
41
43
|
def predicate
|
42
|
-
|
43
|
-
|
44
|
+
rdf_node = Redland.librdf_statement_get_predicate(@rdf_statement)
|
45
|
+
rdf_node.null? ? nil : Node.new(rdf_node)
|
44
46
|
end
|
45
47
|
|
48
|
+
# Object of the statement.
|
49
|
+
#
|
50
|
+
# @return [Node, nil]
|
46
51
|
def object
|
47
|
-
|
48
|
-
|
52
|
+
rdf_node = Redland.librdf_statement_get_object(@rdf_statement)
|
53
|
+
rdf_node.null? ? nil : Node.new(rdf_node)
|
49
54
|
end
|
50
55
|
|
51
|
-
#
|
56
|
+
# Set the subject of the statement
|
57
|
+
#
|
58
|
+
# @param [Node, nil] node
|
59
|
+
# @return [void]
|
52
60
|
def subject=(node)
|
53
|
-
|
54
|
-
Redland.librdf_statement_set_subject(@rdf_statement, node.rdf_node)
|
55
|
-
}
|
61
|
+
Redland.librdf_statement_set_subject(@rdf_statement, rdf_node_from(node))
|
56
62
|
end
|
57
63
|
|
58
|
-
#
|
64
|
+
# Set the predicate of the statement
|
65
|
+
#
|
66
|
+
# @param [Node, nil] node
|
67
|
+
# @return [void]
|
59
68
|
def predicate=(node)
|
60
|
-
|
61
|
-
Redland.librdf_statement_set_predicate(@rdf_statement, node.rdf_node)
|
62
|
-
}
|
69
|
+
Redland.librdf_statement_set_predicate(@rdf_statement, rdf_node_from(node))
|
63
70
|
end
|
64
71
|
|
65
|
-
#
|
72
|
+
# Set the object of the statement
|
73
|
+
#
|
74
|
+
# @param [Node, nil] node
|
75
|
+
# @return [void]
|
66
76
|
def object=(node)
|
67
|
-
|
68
|
-
Redland.librdf_statement_set_object(@rdf_statement, node.rdf_node)
|
69
|
-
}
|
77
|
+
Redland.librdf_statement_set_object(@rdf_statement, rdf_node_from(node))
|
70
78
|
end
|
71
79
|
|
72
80
|
def eql?(other_statement)
|
@@ -84,36 +92,29 @@ module Redlander
|
|
84
92
|
Redland.librdf_statement_to_string(@rdf_statement)
|
85
93
|
end
|
86
94
|
|
87
|
-
# A valid statement satisfies the following:
|
88
|
-
# URI or blank subject, URI predicate and URI or blank or literal object (i.e. anything).
|
89
|
-
def valid?
|
90
|
-
attributes_satisfy? ? errors.clear : errors.add("is invalid")
|
91
|
-
errors.empty?
|
92
|
-
end
|
93
|
-
|
94
95
|
|
95
96
|
private
|
96
97
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
def binding_to_statement(node)
|
104
|
-
if node.frozen?
|
105
|
-
raise RedlandError.new("Cannot assign a bound node")
|
98
|
+
# @api private
|
99
|
+
def wrap(s)
|
100
|
+
if s.null?
|
101
|
+
raise RedlandError, "Failed to create a new statement"
|
106
102
|
else
|
107
|
-
|
108
|
-
yield
|
103
|
+
Redland.librdf_new_statement_from_statement(s)
|
109
104
|
end
|
110
105
|
end
|
111
106
|
|
112
|
-
|
113
|
-
|
114
|
-
|
107
|
+
# Create a Node from the source
|
108
|
+
# and get its rdf_node, or return nil
|
109
|
+
# @api private
|
110
|
+
def rdf_node_from(source)
|
111
|
+
case source
|
112
|
+
when NilClass
|
113
|
+
nil
|
114
|
+
when Node
|
115
|
+
source.rdf_node
|
115
116
|
else
|
116
|
-
|
117
|
+
Node.new(source).rdf_node
|
117
118
|
end
|
118
119
|
end
|
119
120
|
end
|