- From: Eric Prud'hommeaux <eric@w3.org>
- Date: Thu, 5 Jul 2001 11:38:41 -0400
- To: Dan Brickley <danbri@w3.org>
- Cc: www-rdf-perllib@w3.org
On Tue, Jun 26, 2001 at 06:01:05PM -0400, Dan Brickley wrote: > > Hi Eric, > > http://www.w3.org/1999/02/26-modules/ > http://www.w3.org/2001/Talks/0505-perl-RDF-lib/ > http://dev.w3.org/cvsweb/perl/modules/W3C/Rdf/Algae.pm?rev=1.41&content-type=text/x-cvsweb-markup > > I've been looking at W3c::RDF::Algae.pm with an eye to dropping in > alternate backend database implementations, like we discussed recently. > I've also got a wrapper for the Squish RDF query language that I'll > contrib when I've got some tests implemented to be sure it works properly. > > Anyway, a suggestion: It seems the way Algae.pm currently works, one needs > a class that implements W3C::RDF::RdfDB that can be constructed afresh by > the query engine, ie. the method W3C::RDF::Algae::checkForDBSpec() wants > to be passed a class name plus a bunch of initialisation parameters, > which'll allow it to create a new instance of some species of RDF database. > > Suggestion: > Often one's application code will *already* have its hands on a reference > to such a database object, so it'd be nice if this could just be passed > to the query engine instead. > > Currently you do: eval "require $dbSpec; \$\$pDb = new $dbSpec(\$parms);"; > > ...could you hack it to take a Perl reference instead? Would this break > anything else? That way I can create RDF database instances and initialise > them without having to have Algae do that work... The "require $dbSpec; \$\$pDb = new $dbSpec(\$parms);" is the codepath that is taken when you supply a source database as a string with parameters. The alternative is to supply a source as a uri. The common example of this is in the run.sh script (version 1.10): -d"\"W3C::Rdf::RdfDB\" (\"name:local:/ephemeral\")" \ ../test/algaeTest.rdf \ -a"(namespace '(fingerA http://finger.net/attrs/ \ finger http://finger.net/get/ \ t http://t.t/ \ a http://a.a/ \ myDb local:/) \ attach '(\"W3C::Rdf::FingerDB\" (\"cacheTimeout:1\" \"name:myDb::fred\")) \ ask '((~http://t.*/p1* ?s1 ?o1) \ (t::p2 ?o1 ?o2) \ (?o3 ?o2 ?o3) \ (t::p4 ?s1 ?o2)) \ assert '((a::p1 ?o1 #?g1) (a::p2 ?g1 ?o2)) \ ask '(myDb::fred \ (fingerA::Name finger::localhost/eric ?name)) \ collect '(?s1 ?o3 ?g1 ?o2 ?name) \ )" In this example, a finger database is fiven the name local:/fred and is queried for triples of the form: (http://finger.net/attrs/Name http://finger.net/get/localhost/eric *) The Algae interface advertises an addSource function that allows the application to supply databases. You may then select such a database by name so long as you have given it a name: if (exists $self->{-sources}[$i]{-name} && $self->{-sources}[$i]{-name} eq $name) ... The ugly part is that I think the RdfDB interface does not (currently) advertise a setName function and you have to do something like: my $db = new RdfDB(-name => "http://example.org/ephem1"); or maybe just set the name of an existing RdfDB (or derivative): $db{-name} = $atomDictionary->getUri('http://example.org/ephem1'); Let me know how this works out and we can clean up the interface. I think in the long run, the name should not be part of the RdfDB, but instead associated in the Algae object itself. -- -eric (eric@w3.org) Feel free to forward this message to any list for any purpose other than email address distribution.
Received on Thursday, 5 July 2001 11:38:41 UTC