Build Status

Server-side support for Linked Data Platform (LDP) with RDF.rb. To get started with LDP, see the LDP Primer.

This software ships with the following libraries:


Lamprey is a basic LDP server. To start it, use:

$ gem install rdf-ldp
$ lamprey

Lamprey currently uses an in-memory repository, and is therefore not a persistent datastore out of the box. Backends are swappable, using any RDF::Repository implementation with named graph (#context) support. We are working to complete a recommended, default backend and introduce startup configuration. See /CONSTRAINED_BY.md and /IMPLEMENTATION.md for details.

An ldp:BasicContainer will be created at the address of your first GET request if the backend store is empty. Note that if that request is made to the server root, Sinatra will assume a trailing slash. You can also create an initial container (or other resource) with HTTP PUT.

$ curl -i http://localhost:4567

HTTP/1.1 200 OK
Content-Type: text/turtle
Link: <http://www.w3.org/ns/ldp#Resource>;rel="type",<http://www.w3.org/ns/ldp#RDFSource>;rel="type",<http://www.w3.org/ns/ldp#BasicContainer>;rel="type"
Accept-Post: application/n-triples, text/plain, application/n-quads, text/x-nquads, application/ld+json, application/x-ld+json, application/rdf+json, text/html, text/n3, text/rdf+n3, application/rdf+n3, application/rdf+xml, text/csv, text/tab-separated-values, application/csvm+json, text/turtle, text/rdf+turtle, application/turtle, application/x-turtle, application/trig, application/x-trig, application/trix
Etag: "1B2M2Y8AsgTpgAmY7PhCfg==0"
Vary: Accept
X-Content-Type-Options: nosniff
Server: WEBrick/1.3.1 (Ruby/2.1.0/2013-12-25)
Date: Mon, 27 Jul 2015 23:19:06 GMT
Content-Length: 0
Connection: Keep-Alive



Setting up a Custom Server

You can quickly create your own server with any framework supporting Rack. The simplest way to do this is with Rackup.

# ./config.ru

require 'rack/ldp'

use Rack::LDP::ContentNegotiation
use Rack::LDP::Errors
use Rack::LDP::Responses
use Rack::LDP::Requests

# Setup a repository and an initial container:
#   - You probably want some persistent repository implementation. The example
#     uses an in-memory repository.
#   - You may not need an initial "base" container, if you handle create on PUT
#     requests.
repository = RDF::Repository.new 
RDF::LDP::Container.new(RDF::URI('http://localhost:9292/'), repository)
  .create('', 'text/plain') if repository.empty?

app = proc do |env|
  # Return a Rack response, giving an `RDF::LDP::Resource`-like object as the body.
  # The `Rack::LDP` middleware marhsalls the request to the resource, builds the response,
  # and handles conneg for RDF serializations (when the body is an `RDF::LDP::RDFSource`).
  # @see http://www.rubydoc.info/github/rack/rack/master/file/SPEC#The_Response

  [200, {}, RDF::LDP::Resource.find(RDF::URI(env['REQUEST_URI']), repository)]

run app

And run your server with:

$ rackup


Current compliance reports for Lamprey are located in /reports. Reports are generated by the LDP test suite. To duplicate the results, use the testsuite branch, which contains a work-around for w3c/ldp-testsuite#224.


This software is released under a public domain waiver (Unlicense).