- From: Dmitry Borodaenko <d.borodaenko@sam-solutions.net>
- Date: Wed, 5 Nov 2003 21:29:50 +0200
- To: RDF-Ruby list <public-rdf-ruby@w3.org>
Late is better than never... :)
On Thu, Sep 11, 2003 at 04:47:18PM -0600, Aredridel wrote:
> > One thing in particular I would like to see is decoupling of all
> > these components and development of a common RDF API for Ruby. And
> > then have different projects such as RubyRdf, Redland, Samizdat, map
> > to different parts of this API.
> I, too, would like to see this.
>
> The OO Graph/Statement/Node approach is a good start. Being able to say
> RedlandStore.new("file.rdf").store(Samizdat.ask(nil, nil, nil))
>
> or equivalent would be killer -- common APIs for Node and Statement
> enough that perhaps only Graph is implementation specific, and even
> that would have enough of a common API that pretending they're the
> same would work.
I was reading "Enabling Semantic Web Programming by Integrating RDF and
Common Lisp" by Ora Lassila and thought that similar approach should
work in Ruby. That is:
class Node
def initialize(uri=nil)
@uri = uri
end
def [](property)
node = Dictionary[property] if
property.class != Node and property =~ URI::REGEXP::URI_REF
triple = db[ Triple.new(node, self, nil) ]
triple.object
end
end
class Dictionary
include Singleton
def initialize
@dict = {}
@ns = {}
end
attr_reader :ns
def [](uri)
@dict[ ns_expand(uri) ]
end
end
class Triple
def initialize(p, s, o, source=nil)
end
attr_accessor :predicate, :subject, :object, :source
end
class DB
def initialize(db=SamizdatRDF.new(nil))
@db = db
end
def [](pattern, limit=nil)
case pattern
when Triple # single-triple pattern
when Array # multi-triple pattern
when SquishQuery # parsed Squish query
when String # non-parsed Squish query
end
end
def []=(pattern, values)
end
end
I hope there are no objections to the proposed (ab)use of square
brackets :)
Most controversial part of this proposal is the ordering of (predicate,
subject, object). It seems to be more popular to put predicate in the
middle, but I like the (p, s, o) order used in Squish better: prefix
notation is more widespread in computer languages, and it reflects that
p is more restricted than s, which in turn is more restricted than o (in
non-reified statement, p is restricted to uriref, while s can also be a
blank node, and o can also be a literal).
How to deal with extensions of RDF concepts such as Triple#source and
Dictionary#ns ? This begs for an optional part of API, but it can get
really complicated to track all possible cases of when these optional
features are or aren't implemented.
Behaviour of DB#[] and DB#[]= is not as obvious as the rest of the API.
I am in favor of following DQL (DAML Query Language) semantics as the
most consistent abstract RDF query specification out there. Are there
any other suggestions?
And I don't like Ora's use of DB class name: I would rather leave DB for
SQL databases, and have this class named RDF, or KB (knowledge base), or
something else. As Matz says in his excellent talk at OSCON, choosing
right names is very important. What name would unambiguously pin down
this concept?
--
Dmitry Borodaenko
Received on Wednesday, 5 November 2003 14:29:28 UTC