Ruby client for the AllegroGraph RDF graph database

The agraph gem provides a client for the RESTful interface of AllegroGraph RDF graph database version 4.x. This document should give you overview, how the client can be used. To get familiar with the database server, this documentation is strongly recommended.

The features that are exposed by this client are…

  • simple repository management

  • add / remove statements (aka triples) to / from the store

  • searching for statements by subject, predicate or object (or any combination of them)

  • searching for statements by geo-spatial queries

  • transactions

  • performing SparQL and Prolog queries

  • mapping of data type

<img src=“http://travis-ci.org/phifty/agraph.png” />

Installation

There are no special dependencies. Just type

gem install agraph

Repository management

A repository can be created by simply typing the following.

require 'allegro_graph'

server = AllegroGraph::Server.new :username => "user", :password => "pass"
repository = AllegroGraph::Repository.new server, "test_repository"
repository.create_if_missing!

The code will try to connect to a AllegroGraph server running at localhost:10035 with the credentials user and pass, and creates a repository named test_repository if it’s not already existing.

Adding and Removing triples

Once a repository is created, statements can be added.

repository.statements.create "<a_subject>", "<a_predicate>", "<an_object>", "<context>"

The last argument is optional and defines a context for the given triple. This context can be used to define named graphs inside the repository.

To delete statements, matching options can be passed to the delete method.

repository.statements.delete :predicate => "<a_predicate>"

This will delete all statements with the predicate <a_predicate>.

Searching for statements

The find method provides an easy way to find specified statements.

repository.statements.find :subject => "<a_subject>"

The result will be an array that holds arrays of all matching statements.

[
  [ "<a_subject>", "<a_predicate>", "<a_object>" ],
  [ "<a_subject>", "<another_predicate>", "<another_object>" ]
]

Searching for statements by geo-spatial queries

Adding coordinates to the database

Before coordinates can be added, a fitting type has to be requested from the database. Coordinates can have the cartesian (x and y) or spherical (latitude and longitude) type. When creating the type, also a range has to be defined.

cartesian_type = repository.geometric.cartesian_type :strip_width => 1,
                                                     :x_min       => 0,
                                                     :y_min       => 0,
                                                     :x_max       => 100,
                                                     :y_max       => 100

The first argument specifies the strip width and the last four the top-left and bottom-right corner of the rectangle that represent the boundaries for any coordinate.

Afterwards, the return type can be used add geometric nodes (subjects or objects) to the database.

repository.statements.create "<a_subject>", "<a_predicate>", "\"+20+20\"^^#{cartesian_type}"

Finding statements by geo-spatial queries

To find statements by thier assigned coordinates, the following methods are provided.

repository.statements.find_inside_box
repository.statements.find_inside_circle
repository.statements.find_inside_haversine
repository.statements.find_inside_polygon

The previously create statement will be returned by

repository.statements.find_inside_box :type      => cartesian_type,
                                      :predicate => "<a_predicate>",
                                      :x_min     => 10,
                                      :y_min     => 10,
                                      :x_max     => 30,
                                      :y_max     => 30

Transactions

agraph also allows you to perform transaction. All operations performed within a transaction will committed at once. If an error occurs during the transaction, all operations will be rolled back.

repository.transaction do
  statements.create "<a_subject>", "<a_predicate>", "<an_object>"
  statements.create "<a_subject>", "<a_predicate>", "<another_object>"
  # ... if an error is raised here, no operation will be committed
end
# ... if no error has occured, all operations will be committed

SparQL and Prolog queries

The perform a SparQL or Prolog query, simply set the language that the query is written in and pass the query string to the following method.

repository.query.language = :sparql
repository.query.perform "SELECT ?s WHERE { ?s ?p ?o . }"

At the moment only :sparql and :prolog queries are supported.

The result will look like this.

{ "names" => [ "s" ], "values" => [ [ "<a_subject>" ], [ "<another_subject>" ] ] }

Mapping of data types

To add and remove mapping between types and it’s encodings, the following methods can be used.

repository.mapping.create "<time>", "<http://www.w3.org/2001/XMLSchema#dateTime>"
repository.mapping.delete "<time>"

With such a type defined, it’s possible to perform range queries like

repository.statements.create "<event_one>", "<occurs>", "\"2010-03-29T11:40:00\"^^<time>"
repository.statements.create "<event_two>", "<occurs>", "\"2010-03-29T17:40:00\"^^<time>"

repository.statements.find :predicate => "<occurs>", :object => [ "\"2010-03-29T11:00:00\"^^<time>", "\"2010-03-29T12:00:00\"^^<time>" ]

Only the second event would be returned.

More Examples

More examples can be found in the integration specs (spec/integration)

Contribution

Any contribution - especially bug reports - is welcome.

Fork or send mail to [email protected]

Support

Apart from contribution, support via Flattr is welcome.