- From: Eric Prud'hommeaux <eric@w3.org>
- Date: Tue, 29 Jun 2004 05:20:24 -0400
- To: Dave Beckett <dave.beckett@bristol.ac.uk>
- Cc: public-rdf-dawg@w3.org
- Message-ID: <20040629092024.GC20261@w3.org>
On Mon, Jun 28, 2004 at 07:43:42PM +0100, Dave Beckett wrote: > > An Evaluation of Algae (or Algae2) > > [algae+] supports a requirement or design objective > [algae-] does not support it > [algea?] unknown or undeterminable > > > Algae is described at http://www.w3.org/2004/05/06-Algae/ > and is used in the W3C Annotea Server and implemented in Perl. > > In general Algae looks like: > > ns rss=<<http://purl.org/rss/1.0/> > ns prose=<http://example.org/proseInfo#> > > read <http://example.org/some-data> () > read <file:mydata.rdf> (inputlang=\"rdf\") note, the escaped '"'s are only present in shell script files (because otherwise the shell script would look for a new arg). in the actual language, it's this: read <file:mydata.rdf> (inputlang="rdf") > ask ( > ?article <http://purl.org/rss/1.0/title> ?title . > ?article <http://purl.org/rss/1.0/link> ?link . > ?article <http://purl.org/rss/1.0/description> ?description > ?article prose:wordCount ?words { ?words < 1000 }. > ) > collect (?title ?link ?description ?words) > > The execution is done in the order specified in the file so that > multiple read(...) ask(...) etc. can be performed, extending the > query graph as well as supplementing the results. this is something that really excites me about this language. i find it very useful for query federation. > There are other keywords not described here, such as attach for > connecting to a store (in a SQL database). > > > Requirements > ------------ > > [algae+] 3.1 RDF Graph Pattern Matching > > ?article <http://purl.org/rss/1.0/title> ?title > > [algae+] 3.2 Variable Binding Results > > collect (?title ?link ?description ?words) > > [algae-] 3.3 Extensible Value Testing > > an extensibility declaration "requires" exists but not for value testing. Actually, require was intended to provide a safe mechanism for all extensions, including grammar and set of functions. To test this, implemented a simply hostname() function call and created a test file [1]: ns <http://purl.org/rss/1.0/> ns da=<http://www.w3.org/2001/sw/DataAccess/> ns ex=<http://example.org/foo/bar/> # Get some data to play with. require <http://www.w3.org/2004/06/20-rules/#assert> assert ( da:UseCases title "RDF Data Access Use Cases and Requirements" ; link <http://www.w3.org/2001/sw/DataAccess/> ; description "specifies use cases, requirements, ..." . ex:someDoc title "Title of Some Document" ; link <http://example.org/foo/bar/> ; description "A more verbose description of some document." ) # Play with it. ns prov=<http://example.org/provenanceStuff#> require prov:profile ask (?article title ?title ; link ?link {hostname(?link) == "www.w3.org"} ; description ?description) collect (?title ?link ?description) and got back the expected document at W3: +-------...-------+--------------------...-------+---------...-------------+ | ... title| ... link| ... description| |-------...-------|--------------------...-------|---------...-------------| |"RDF Da...ements"|<http://www.w3.org/2...ccess/>|"specifie...rements, ..."| +-------...-------+--------------------...-------+---------...-------------+ > [algae-] 3.4 Subgraph Results This is something I think algae is especially good at. You can get back results like: +-------------------------+ | n| |-------------------------| |<http://example.org/n#A3>| |<http://example.org/n#A1>| |<http://example.org/n#A2>| +-------------------------+ or -------------------------+----------------------------------------------------+ n| | -------------------------|----------------------------------------------------| <http://example.org/n#A3>| | <http://example.org/n#A3> <http://example.org/n#p2> <http://example.org/n#C> .| <http://example.org/n#A3> <http://example.org/n#p3> <http://example.org/n#D> .| ------------------------------------------------------------------------------| <http://example.org/n#A1>| | <http://example.org/n#A1> <http://example.org/n#p2> <http://example.org/n#C> .| ------------------------------------------------------------------------------| <http://example.org/n#A2>| | <http://example.org/n#A2> <http://example.org/n#p3> <http://example.org/n#D> .| -------------------------+----------------------------------------------------+ cf [3]. > [algae+] 3.5 Local Queries > > the default is local/in-memory and can also read from file URIs, databases. > > [algae+] 3.6 Optional Match > > The ~ term inside ask(..) allows optional matches such as: > > ~?article foaf:mbox ?mbox . > > which are declared to be analogous to SQL outer joins, and > implemented as such. > > [algae+] 3.7 Limited Datatype Support > > Integers, floating point literals, strings, datatyped strings and a > variety of common numeric, boolean and comparison operators. > > ?article prose:wordCount ?words { ?words < 1000 }. > > [algae?] 3.8 Bookmarkable Queries > > [algae-] 3.10 Result Limits > > The document claims limits are implemented in the core profile but > the language does not seem to have a way to use them. > > [Typo? "required features" or "requires features" the doc has both] > > [algae-] 3.11 Iterative Query > > [algae+] 3.12 Streaming Results > > > Design Objectives > ----------------- > > [algae-] 4.1 Human-friendly Syntax > > IMHO of course: > - terse keywords ('ns', 'slurp') [although 'namespace' is also legal] > - lispy brackets in an XML world :) > - '.' triple separator versus more typical ',' and ';' > - many operators > - unfamiliar graph operators || |& |- > > [algae+] 4.2 Provenance > > After reading the explanation in > http://lists.w3.org/Archives/Public/public-rdf-dawg/2004AprJun/0519 > > algae provides this by %ATTRIB and can be constrained or assigned > to variables in a clause after a triple: > > ?an a:body ?body { %ATTRIB == <http://example.com/a1.rdf> } > > This is also used for constraining literal datatypes, languages > and XML encodings (%DATATYPE, %LANG and %ENCODING) > > [Typo? document says %ATTRIB, email says %PROV] > > [algae-] 4.3 Non-existent Triples Hmm, missing some text in the doc for the QTerm [4] production. That's the meaning of the '!' in: [17] QTerm ::= decl | '(' graphPattern '.'? ')' | '~' QTerm | '!' decl It looks basicly like: ask (?who foaf:knows ?whom. ! ?who foaf2:livesWith ?whom) > [algae-] 4.4 User-specifiable Serialization Yah, it was sort of a toss-up whether to include that in the base language. Instead I bundled it in with the rules extension [2] ask (?who foaf:first_name ?given. ?who foaf:lastName ?family. (?who foaf2:continent "Europe" || ?who foaf2:continent "North America" || ?who foaf2:continent "South America")) require <http://www.w3.org/2004/06/20-rules/#assert> assert (?who pim:given ?given. ?who gim:family ?family) > [algae+] 4.5 Aggregate Query > > Conjunction, shortcut disjunction, union disjunction and merged > union disjunction are present. > > [algae-] 4.6 Additional Semantic Information > > [algae-] 4.7 Bandwidth-efficient Protocol > > [algae-] 4.8 Literal Search > > [algae-] 4.9 Boolean Query > > But I find this design objective difficult to understand, as written. [1] http://dev.w3.org/cvsweb/perl/modules/W3C/Rdf/test/Hostname0-alg.sh?rev=HEAD&content-type=text/x-cvsweb-markup [2] http://www.w3.org/2004/06/20-rules/ [3] http://lists.w3.org/Archives/Public/public-rdf-dawg/2004AprJun/0615.html [4] http://www.w3.org/2004/05/06-Algae/#doc-algae-QTerm -- -eric office: +81.466.49.1170 W3C, Keio Research Institute at SFC, Shonan Fujisawa Campus, Keio University, 5322 Endo, Fujisawa, Kanagawa 252-8520 JAPAN +1.617.258.5741 NE43-344, MIT, Cambridge, MA 02144 USA cell: +1.857.222.5741 (does not work in Asia) (eric@w3.org) Feel free to forward this message to any list for any purpose other than email address distribution.
Received on Tuesday, 29 June 2004 05:20:24 UTC