- From: Leo Sauermann <leo@gnowsis.com>
- Date: Sun, 29 Aug 2004 21:10:41 +0200
- To: Bob MacGregor <macgregor@isi.edu>
- CC: Frank Manola <fmanola@acm.org>, www-rdf-interest@w3.org
But its actually worse than that. To get decent performance while using
provenance,
> you have to make modifications at the implementation level.
> Relatively few users are going
> to build or extend an existing triple store just to get provenance
> information. So, the
> "experiment" is going to proceed relatively slowly. On the other
> hand, suppose Jena
> implemented quads. Suddenly, the opportunities for experimentation
> would increase
> 100-fold (to pick a random number). Then there would be a flurry of
> experimentation,
> probably leading to much earlier recognition of what a standard
> semantics for
> provenance (a step beyond contexts) should look like.
+1
if I had quads in Jena, I would code applications that have
- less lines of code
- are faster
- have much more functioanlity (security, triple updates, etc)
becuase with quads I would be able to to it easily, instead of
reification crux,
I don't need hot air from people who do not code. I need good ideas from
people who want to create features for people, that are affordable and
can be implemented.
YES i already implemented a "tagging" api that identifies subgraphs in
my graph by putting hte triples reification in a Bag and then for
example deleting the bag and all triples for doing updates.
BUT ITS A CLUDGE.
I will show you:
with quads it is:
(pseudocode for adding)
for (StmtIterator i = data.listStatements(); i.hasNext(); ) {
Statement s = i.nextStatement();
target.addQuad(ID, s);
}
(pseudocode for delete)
target.deletequad(ID, *, * ,*)
so thats 5 lines with imaginary quads.
WITH REIFICATION:
// extract all THETRIPLES into a vector to avoid infinite loop
problems
Vector theTriples = new Vector();
for (StmtIterator i = data.listStatements(); i.hasNext(); ) {
theTriples.add(i.next());
}
// do the tagging of THETRIPLES
// add the dataTag to the data
Resource dataTagR = tag.addTo(data);
// put all triples in a bag
Bag bag = data.createBag();
for (Iterator i = theTriples.iterator(); i.hasNext(); ) {
Statement stmt = (Statement)i.next();
bag.add(stmt.createReifiedStatement());
}
// add the bag to the datatag
dataTagR.addProperty(DATA.triples, bag);
// add THETRIPLES and the tag to the repository
server.getRepository().getModel().add(data);
// close data
data.close();
Removing it:
// buffer the model
Model model = server.getRepository().getModel();
// get all Resources of reified statments
Bag tripleBag = tag.getProperty(DATA.triples).getBag();
Vector reifications = new Vector();
NodeIterator i = tripleBag.iterator();
while (i.hasNext()){
RDFNode node = i.nextNode();
if (node.canAs(ReifiedStatement.class)) {
ReifiedStatement reified = (ReifiedStatement)
node.as(ReifiedStatement.class);
reifications.add(reified);
}
else
throw new GnowsisException("iterating through dataTag
"+tag.toString()+": node "+node.toString()+" is not a statement");
}
i.close();
// convert to array
ReifiedStatement[] reifyArray = (ReifiedStatement[])
reifications.toArray(new ReifiedStatement[reifications.size()]);
// remove everything from bag, the contents of the bag is noted in
// rdf:li_0, rdf:li_1 ...
tripleBag.removeProperties();
// remove the statements and reifications
for (int j = 0; j < reifyArray.length; j++) {
// remove reification
model.removeReification(reifyArray[j]);
// statement
Statement s = reifyArray[j].getStatement();
// remove all reifications
// model.removeAllReifications(s);
// remove statement
model.remove(s);
}
// remove the bag
tag.removeAll(DATA.triples);
quite long, eh?
>
> Right now, the people adopting your position are consigning the
> majority to a
> Gedankenexperiment, where the expected rate of progress will be about
> what it
> is in the relational database community -- nil.
exactly.
cheers
Leo
Received on Sunday, 29 August 2004 19:11:00 UTC