RdfPerlLib
Some hints and tips for using Rdf Perl Lib code
look in rdfapp.pm see how it prepares sax etc... v complex. or subclass RdfApp and just call prepare parser.
see the algae script for that.
algae query of an sql-backed rdf store
'We have a local RDF database (with config setup described in a .prop file) that we'd like to send (Algae) RDF queries to, and get back a table of bindings or serialize results in RDF/XML.
#!/usr/bin/perl use strict; use W3C::Rdf::RdfDB; use W3C::Rdf::Atoms; use W3C::Util::Exception; eval { my $atoms = new W3C::Rdf::Atoms(); my $db = new W3C::Rdf::RdfDB(-atomDictionary => $atoms); my $algae = $db->getAlgaeInterface; my $query = "(attach '(\"W3C::Rdf::ObjectDB\" (\"properties:../../rdf.prop\" \"name:db:rdf.prop\" limit:5)) ask '(db:rdf.prop (?p ?s ?o)) collect '(?p))"; my ($nodes, $selects, $messages, $proofs) = $algae->algae($query, undef, {-uniqueResults => 1}); for (my $rowNo = 0; $rowNo < @$nodes; $rowNo++) { for (my $colNo = 0; $colNo < @{$nodes->[$rowNo]}; $colNo++) { my $datum = $nodes->[$rowNo][$colNo]->show; my $heading = $selects->[$colNo]; print "$heading: $datum\n"; } } }; if ($@) {if (my $ex = &catch('W3C::Util::Exception')) { die $ex->toString; } else { die $@; } }
What's this 'attach' business?
<ericP> getSourceByName: if someone uses "attach" to connect algae to a database, they will specify a name, eg. 'db:rdf.prop'. You can then use the API $algae->getSourceByName to get that database as a perl object.
populate an sql-backed rdf store
You can either use Algae, or an API-based approach.
This is a sketch of what you need for the latter.
use W3C::Rdf::ObjectDB; use W3C::Util::Object; use W3C::Rdf::Atoms; use strict; # you can store database connectivity details in a properties file: #my $sqldb = new W3C::Rdf::ObjectDB(-atomDictionary => $self->{-atomDictionary}, -properties => "props file"); # or here it is inline: my $atoms = new W3C::Rdf::Atoms; my $sqldb = new W3C::Rdf::ObjectDB(-atomDictionary => $atoms, -properties => new W3C::Util::Properties({'user' => 'root', 'password' => '', 'database' => 'rdf'})); # Basic idea: $selqdb->addTriple(some triple from proofs) # creating a p/s/o to assert into the db... (or we could get these from parsing/querying RDF) my $attribUri = $atoms->getUri("http://mysource.example.com/s1"); my $attribution = $atoms->getAttribution($W3C::Rdf::Atoms::AttributionType_SOURCE, $attribUri, undef, undef, undef, 1, 1); # args: type, uri, auth, parent, source(undef!), trusted, clear # 'clear resets all triples with same attribURI' regardless of attr type or author my $predicate = $atoms->getUri("http://xmlns.com/foaf/0.1/img") ; my $subject = $atoms->createGenId($attribution) ; my $object = $atoms->getUri("http://example.com/mugshot.jpg") ; # also getUri("#foo", "http://..."), getString("text", PLAIN | XML), createGenId($attribution) $sqldb->createStatement($predicate, $subject, $object, undef, undef, $attribution); #Eric: "$auth is just a string; just use undef. An identity that tags a subgraph in the database. Used in Annotea work, not much used elsewhere. In Annotea it is a string, the Basic Auth name from HTTP. #genid takes an attribution - reason is to assign mininun bnode id for that object. # creates a BaseTriple and calls addTriple()/ reification and container can be undef. see above re attribution.
check mysql to see what got loaded...
tail -0f /var/log/mysql.log &
serialize an sql-backed rdf store to rdf/xml
How can I use the algae commandline tool to dump a database into RDF/XML?
algae -a"(attach '(\"W3C::Rdf::ObjectDB\" (\"properties:rdf.prop\" \"name:db:rdf.prop\")) ask '(db:rdf.prop (?p ?s ?o)) collect '(?p))" -sClassRDFXML -sParm-createNamespaces=1
What if the database is huge? Can I limit it to the first n (eg '100') answers?
algae -a"(attach '(\"W3C::Rdf::ObjectDB\" (\"properties:rdf.prop\" \"name:db:rdf.prop\") limit:100) ask '(db:rdf.prop (?p ?s ?o)) collect '(?p))" -sClassRDFXML -sParm-createNamespaces=1
How do I do this through an API instead? (WriteMe)
load RDF/XML from a URI
#!/usr/bin/perl use strict; package testRdfParser; use W3C::Util::Exception; use W3C::Rdf::RdfApp; use vars qw(@ISA); @ISA = qw(W3C::Rdf::RdfApp); eval { my $tester = new testRdfParser; $tester->execute(\@ARGV); }; if ($@) {if (my $ex = &catch('W3C::Util::Exception')) { die $ex->toString; } else { die $@; } } sub render { my ($self) = @_; my $queryHandler = $self->{RDF_DB}->getAlgaeInterface; foreach my $query (@{$self->{ARGS}{-algae}}) { my ($nodes, $selects, $messages, $proofs) = $queryHandler->algae($query, undef, {-uniqueResults => 1}); my $rows = @$nodes; print "\"$query\" got $rows rows.\n"; } } # ./simpleRdfApp.pm ../test/medium.rdf -a"(ask '((?p ?s ?o)) collect '(?p ?s ?o))"
random notes
<danbri> mappedtriple subclasses basetriple my ($self, $type, $uri, $auth, $parent, $source, $trusted, $clear) = @_;