- From: Jos De_Roo <jos.deroo@agfa.com>
- Date: Sat, 12 Jun 2004 15:55:16 +0200
- To: eric@w3.org
- Cc: public-rdf-dawg@w3.org, Rob Shearer <Rob.Shearer@networkinference.com>
Eric, [I couldn't find "dork" in my dictionary, but http://www.google.be/search?hl=en&ie=UTF-8&edition=us&q=define%3Adork&meta= helped :)] I've been testing your test case i.e. http://eulersharp.sourceforge.net/2004/04test/ericP.n3 -- filter http://eulersharp.sourceforge.net/2004/04test/ericF.n3 cwm --think gave back ##################### @prefix : <http://example.org/n#> . ( :A1 ) :isBindingFor <ericF.n3> . ( :A2 ) :isBindingFor <ericF.n3> . ( :A3 ) :isBindingFor <ericF.n3> . euler --think --nope gave back ############################## @prefix log: <http://www.w3.org/2000/10/swap/log#>. @prefix : <http://example.org/n#>. @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. (:A1) :isBindingFor <http://eulersharp.sourceforge.net/2004/04test/ericF.n3>. (:A3) :isBindingFor <http://eulersharp.sourceforge.net/2004/04test/ericF.n3>. (:A2) :isBindingFor <http://eulersharp.sourceforge.net/2004/04test/ericF.n3>. euler --think gave back ####################### @prefix log: <http://www.w3.org/2000/10/swap/log#>. (<http://eulersharp.sourceforge.net/2004/04test/ericP.n3>.log:semantics <http://eulersharp.sourceforge.net/2004/04test/ericF.n3>.log:semantics).log:conjunction => { @prefix log: <http://www.w3.org/2000/10/swap/log#>. @prefix : <http://example.org/n#>. @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>. @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>. {# <http://eulersharp.sourceforge.net/2004/04test/ericF.n3> line 7. :A1 :p2 :C} => {(:A1) :isBindingFor <http://eulersharp.sourceforge.net/2004/04test/ericF.n3>}. {# <http://eulersharp.sourceforge.net/2004/04test/ericF.n3> line 7. :A3 :p2 :C} => {(:A3) :isBindingFor <http://eulersharp.sourceforge.net/2004/04test/ericF.n3>}. {# <http://eulersharp.sourceforge.net/2004/04test/ericF.n3> line 8. :A2 :p3 :D} => {(:A2) :isBindingFor <http://eulersharp.sourceforge.net/2004/04test/ericF.n3>}. {# <http://eulersharp.sourceforge.net/2004/04test/ericF.n3> line 8. :A3 :p3 :D} => {(:A3) :isBindingFor <http://eulersharp.sourceforge.net/2004/04test/ericF.n3>}. so indeed, for the "proofs" we have 4 paths from the given facts to the 3 results -- Jos De Roo, AGFA http://www.agfa.com/w3c/jdroo/ "Eric Prud'hommeaux" <eric@w3.org> Sent by: public-rdf-dawg-request@w3.org 12/06/2004 05:38 To: public-rdf-dawg@w3.org, Rob Shearer <Rob.Shearer@networkinference.com> cc: Subject: disjunction implementation I'm a dork. I sent out an optional arcs impelementation. I was supposed to send disjunction implementation. Fortunately, there are those near me who are willing to point out these things. The algae code: package W3C::Rdf::AlgaeCompileTree::UnionDisjunction; sub evaluateQTerm { my ($self, $resultSet, $db, $modifier) = @_; for (my $e = $resultSet->elements; $e->hasMoreElements;) { my $row = $e->nextElement; foreach my $term ($self->{LEFT}, $self->{RIGHT}) { my $miniResultSet = $row->makeResultSet; $term->evaluateQTerm($miniResultSet, $db, $modifier); for (my $miniE = $miniResultSet->elements; $miniE->hasMoreElements;) { my $miniRow = $miniE->nextElement; my $newRow = $row->duplicate; $newRow->assumeNewBindings($miniRow); } } $row->eliminate; } } which, as advertised is really a UNION op. I also have package W3C::Rdf::AlgaeCompileTree::UnionDisjunctionMerge; sub evaluateQTerm { my ($self, $resultSet, $db, $modifier) = @_; for (my $e = $resultSet->elements; $e->hasMoreElements;) { my $row = $e->nextElement; my $keepRow = 0; foreach my $term ($self->{LEFT}, $self->{RIGHT}) { my $miniResultSet = $row->makeResultSet; $term->evaluateQTerm($miniResultSet, $db, $modifier); for (my $miniE = $miniResultSet->elements; $miniE->hasMoreElements;) { my $miniRow = $miniE->nextElement; if (my $foundRow = $row->getCousinWithBindings($miniRow)) { $foundRow->assumeNewProofs($miniRow); if ($foundRow == $row) { $keepRow = 1; } } else { my $newRow = $row->duplicate; $newRow->assumeNewBindings($miniRow); } } } if (!$keepRow) { $row->eliminate; } } } which is kind of like sticking a DISTINCT on the result set except the proofs get tacked together. This is NOT streamable. The last form is inspired by Matlab (and SQL, I guess) which provides shortcut operators: package W3C::Rdf::AlgaeCompileTree::ShortcutDisjunction; sub evaluateQTerm { my ($self, $resultSet, $db, $modifier) = @_; for (my $e = $resultSet->elements; $e->hasMoreElements;) { my $row = $e->nextElement; my $empty = 1; foreach my $term ($self->{LEFT}, $self->{RIGHT}) { my $miniResultSet = $row->makeResultSet; $term->evaluateQTerm($miniResultSet, $db, $modifier); for (my $miniE = $miniResultSet->elements; $miniE->hasMoreElements;) { $empty = 0; my $miniRow = $miniE->nextElement; my $newRow = $row->duplicate; $newRow->assumeNewBindings($miniRow); } last if (!$empty); } $row->eliminate; } } TEST CASE: ns <http://example.org/n#> assert ( A0 p1 B . # A0 p2 C . # A0 p3 D . # A1 p1 B . A1 p2 C . # A1 p3 D . # A2 p1 B . # A2 p2 C . A2 p3 D . # A3 p1 B . A3 p2 C . A3 p3 D ) ask ( ( ?n p2 C || ?n p3 D )) collect (?n) TEST RUN OUTPUT: For W3C::Rdf::AlgaeCompileTree::UnionDisjunction: +-------------------------+ | n| |-------------------------| |<http://example.org/n#A1>| |<http://example.org/n#A3>| |<http://example.org/n#A3>| |<http://example.org/n#A2>| +-------------------------+ or with "proofs" +-------------------------+----------------------------------------------------+ | n| | |-------------------------|----------------------------------------------------| |<http://example.org/n#A3>| | |<http://example.org/n#A3> <http://example.org/n#p2> <http://example.org/n#C> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | |------------------------------------------------------------------------------| |<http://example.org/n#A1>| | |<http://example.org/n#A1> <http://example.org/n#p2> <http://example.org/n#C> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | |------------------------------------------------------------------------------| |<http://example.org/n#A2>| | |<http://example.org/n#A2> <http://example.org/n#p3> <http://example.org/n#D> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | |------------------------------------------------------------------------------| |<http://example.org/n#A3>| | |<http://example.org/n#A3> <http://example.org/n#p3> <http://example.org/n#D> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | +-------------------------+----------------------------------------------------+ For W3C::Rdf::AlgaeCompileTree::UnionDisjunctionMerge: +-------------------------+ | n| |-------------------------| |<http://example.org/n#A3>| |<http://example.org/n#A1>| |<http://example.org/n#A2>| +-------------------------+ or with "proofs" +-------------------------+----------------------------------------------------+ | n| | |-------------------------|----------------------------------------------------| |<http://example.org/n#A3>| | |<http://example.org/n#A3> <http://example.org/n#p2> <http://example.org/n#C> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | |<http://example.org/n#A3> <http://example.org/n#p3> <http://example.org/n#D> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | |------------------------------------------------------------------------------| |<http://example.org/n#A1>| | |<http://example.org/n#A1> <http://example.org/n#p2> <http://example.org/n#C> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | |------------------------------------------------------------------------------| |<http://example.org/n#A2>| | |<http://example.org/n#A2> <http://example.org/n#p3> <http://example.org/n#D> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | +-------------------------+----------------------------------------------------+ For W3C::Rdf::AlgaeCompileTree::ShortcutDisjunction: +-------------------------+ | n| |-------------------------| |<http://example.org/n#A1>| |<http://example.org/n#A3>| +-------------------------+ or with "proofs" +-------------------------+----------------------------------------------------+ | n| | |-------------------------|----------------------------------------------------| |<http://example.org/n#A3>| | |<http://example.org/n#A3> <http://example.org/n#p2> <http://example.org/n#C> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | |------------------------------------------------------------------------------| |<http://example.org/n#A1>| | |<http://example.org/n#A1> <http://example.org/n#p2> <http://example.org/n#C> .| | -->{<file://na/home/eric/sources/public/perl/modules/W3C/Rdf/bin/run.sh>} | +-------------------------+----------------------------------------------------+ Stuff repeated from optional arc impelementation mail follows: The interface to the result set is: for each row for each new solution duplicate the row add the bindings to the new row eliminate the original row ala: sub evaluateQTerm { for (my $e = $resultSet->elements; $e->hasMoreElements;) { my $row = $e->nextElement; for each solution my $newRow = $row->duplicate; $newRow->assumeNewBindings(solution); } $row->eliminate; } } -- -eric office: +1.617.258.5741 NE43-344, MIT, Cambridge, MA 02144 USA cell: +1.857.222.5741 (eric@w3.org) Feel free to forward this message to any list for any purpose other than email address distribution.
Received on Saturday, 12 June 2004 09:55:55 UTC