Class: SPARQL::Client::Repository

Inherits:
RDF::Repository
  • Object
show all
Defined in:
lib/sparql/client/repository.rb

Overview

A read-only repository view of a SPARQL endpoint.

See Also:

  • `RDF`RDF::Repository`

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(uri: nil, **options, &block) ⇒ Repository

Returns a new instance of Repository.

Parameters:

  • uri (URI, #to_s) (defaults to: nil)

    Endpoint of this repository

  • title (String, #to_s)

    (nil)

  • options (Hash{Symbol => Object})

    passed to RDF::Repository

Raises:

  • (ArgumentError)


15
16
17
18
19
20
21
# File 'lib/sparql/client/repository.rb', line 15

def initialize(uri: nil, **options, &block)
  raise ArgumentError, "uri is a required parameter" unless uri
  @options = options.merge(uri: uri)
  @update_client = SPARQL::Client.new(options.delete(:update_endpoint), options) if options[:update_endpoint]
  @client  = SPARQL::Client.new(uri, options)
  super(@options, &block)
end

Instance Attribute Details

#clientSPARQL::Client (readonly)

Returns:



8
9
10
# File 'lib/sparql/client/repository.rb', line 8

def client
  @client
end

Instance Method Details

#clear_statementsObject

See Also:

  • RDF::Mutable#clear


188
189
190
# File 'lib/sparql/client/repository.rb', line 188

def clear_statements
  update_client.clear(:all)
end

#countInteger Also known as: size, length

Returns the number of statements in this repository.

Returns:

  • (Integer)

See Also:

  • RDF::Repository#count?


152
153
154
155
156
157
158
159
160
161
162
# File 'lib/sparql/client/repository.rb', line 152

def count
  begin
    binding = client.query("SELECT (COUNT(*) AS ?count) WHERE { ?s ?p ?o }").first.to_hash
    binding[:count].value.to_i rescue 0
  rescue SPARQL::Client::MalformedQuery => e
    # SPARQL 1.0 does not include support for aggregate functions:
    count = 0
    each_statement { count += 1 } # TODO: optimize this
    count
  end
end

#delete(*statements) ⇒ self #delete(statements) ⇒ self

Deletes RDF statements from ‘self`. If any statement contains an `RDF::Query::Variable`, it is considered to be a pattern, and used to query self to find matching statements to delete.

Overloads:

  • #delete(*statements) ⇒ self

    Parameters:

    • statements (Array<RDF::Statement>)

    Returns:

    • (self)

    Raises:

    • (TypeError)

      if ‘self` is immutable

  • #delete(statements) ⇒ self

    Parameters:

    • statements (Enumerable<RDF::Statement>)

    Returns:

    • (self)

    Raises:

    • (TypeError)

      if ‘self` is immutable

See Also:

  • RDF::Mutable#delete


209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/sparql/client/repository.rb', line 209

def delete(*statements)
  statements.map! do |value|
    if value.respond_to?(:each_statement)
      delete_statements(value)
      nil
    else
      value
    end
  end
  statements.compact!
  delete_statements(statements) unless statements.empty?
  return self
end

#each {|statement| ... } ⇒ Object

Enumerates each RDF statement in this repository.

Yields:

  • (statement)

Yield Parameters:

  • statement (RDF::Statement)

See Also:

  • RDF::Repository#each


37
38
39
# File 'lib/sparql/client/repository.rb', line 37

def each(&block)
  client.construct([:s, :p, :o]).where([:s, :p, :o]).each_statement(&block)
end

#each_object {|object| ... } ⇒ Enumerator

Iterates over each object in this repository.

Yields:

  • (object)

Yield Parameters:

  • object (RDF::Value)

Returns:

  • (Enumerator)

See Also:

  • RDF::Repository#each_object?


120
121
122
123
124
125
# File 'lib/sparql/client/repository.rb', line 120

def each_object(&block)
  if block_given?
    client.select(:o, :distinct => true).where([:s, :p, :o]).each_solution { |solution| block.call(solution[:o]) }
  end
  enum_object
end

#each_predicate {|predicate| ... } ⇒ Enumerator

Iterates over each predicate in this repository.

Yields:

  • (predicate)

Yield Parameters:

  • predicate (RDF::URI)

Returns:

  • (Enumerator)

See Also:

  • RDF::Repository#each_predicate?


106
107
108
109
110
111
# File 'lib/sparql/client/repository.rb', line 106

def each_predicate(&block)
  if block_given?
    client.select(:p, :distinct => true).where([:s, :p, :o]).each_solution { |solution| block.call(solution[:p]) }
  end
  enum_predicate
end

#each_subject {|subject| ... } ⇒ Enumerator

Iterates over each subject in this repository.

Yields:

  • (subject)

Yield Parameters:

  • subject (RDF::Resource)

Returns:

  • (Enumerator)

See Also:

  • RDF::Repository#each_subject?


92
93
94
95
96
97
# File 'lib/sparql/client/repository.rb', line 92

def each_subject(&block)
  if block_given?
    client.select(:s, :distinct => true).where([:s, :p, :o]).each_solution { |solution| block.call(solution[:s]) }
  end
  enum_subject
end

#empty?Boolean

Returns ‘true` if this repository contains no statements.

Returns:

  • (Boolean)

See Also:

  • RDF::Repository#empty?


172
173
174
# File 'lib/sparql/client/repository.rb', line 172

def empty?
  client.ask.whether([:s, :p, :o]).false?
end

#has_object?(object) ⇒ Boolean

Returns ‘true` if this repository contains the given object.

Parameters:

  • object (RDF::Value)

Returns:

  • (Boolean)

See Also:

  • RDF::Repository#has_object?


81
82
83
# File 'lib/sparql/client/repository.rb', line 81

def has_object?(object)
  client.ask.whether([:s, :p, object]).true?
end

#has_predicate?(predicate) ⇒ Boolean

Returns ‘true` if this repository contains the given predicate.

Parameters:

  • predicate (RDF::URI)

Returns:

  • (Boolean)

See Also:

  • RDF::Repository#has_predicate?


71
72
73
# File 'lib/sparql/client/repository.rb', line 71

def has_predicate?(predicate)
  client.ask.whether([:s, predicate, :o]).true?
end

#has_statement?(statement) ⇒ Boolean

Returns ‘true` if this repository contains the given `statement`.

Parameters:

  • statement (RDF::Statement)

Returns:

  • (Boolean)

See Also:

  • RDF::Repository#has_statement?


143
144
145
# File 'lib/sparql/client/repository.rb', line 143

def has_statement?(statement)
  has_triple?(statement.to_triple)
end

#has_subject?(subject) ⇒ Boolean

Returns ‘true` if this repository contains the given subject.

Parameters:

  • subject (RDF::Resource)

Returns:

  • (Boolean)

See Also:

  • RDF::Repository#has_subject?


61
62
63
# File 'lib/sparql/client/repository.rb', line 61

def has_subject?(subject)
  client.ask.whether([subject, :p, :o]).true?
end

#has_triple?(triple) ⇒ Boolean

Returns ‘true` if this repository contains the given `triple`.

Parameters:

  • triple (Array<RDF::Resource, RDF::URI, RDF::Value>)

Returns:

  • (Boolean)

See Also:

  • RDF::Repository#has_triple?


133
134
135
# File 'lib/sparql/client/repository.rb', line 133

def has_triple?(triple)
  client.ask.whether(triple.to_a[0...3]).true?
end

#supports?(feature) ⇒ Boolean

Returns:

  • (Boolean)

See Also:

  • RDF::Enumerable#supports?


44
45
46
47
48
49
50
51
52
53
# File 'lib/sparql/client/repository.rb', line 44

def supports?(feature)
  case feature.to_sym
    # statement contexts / named graphs
    when :context     then false
    when :graph_name  then false
    when :inference   then false  # forward-chaining inference
    when :validity    then false
    else false
  end
end

#update_clientSPARQL::Client

Returns the client for the update_endpoint if specified, otherwise the #client.

Returns:



28
29
30
# File 'lib/sparql/client/repository.rb', line 28

def update_client
  @update_client || @client
end

#writable?Boolean

Returns ‘false` to indicate that this is a read-only repository.

Returns:

  • (Boolean)

See Also:

  • RDF::Mutable#mutable?


181
182
183
# File 'lib/sparql/client/repository.rb', line 181

def writable?
  true
end