Algae
Algae
Algae is syntactically derivative of, and named after, an access-limited query language called algernon. At this point, the degree of derivation is minimal, especially with Algae2, but the name lingers. Algae2 actually derives much of its syntax from Notation3.
Algae2 syntax
First an example:
ns foaf=<http://xmlns.com/foaf/0.1/> slurp <http://www.w3.org/People/Eric/ericP-foaf.rdf> () ask (?s foaf:knows ?whom. ?whom foaf:name ?name. ?whom foaf:mbox ?mbox) collect (?name ?mbox)
This shows how to parse a simple document and look for anyone sorry enough to be known by me. The algae script requires this as a -a parameter:
./algae -a'ns foaf=<http://xmlns.com/foaf/0.1/> slurp <http://www.w3.org/People/Eric/ericP-foaf.rdf> () ask (?s foaf:knows ?whom. ?whom foaf:name ?name. ?whom foaf:mbox ?mbox) collect (?name ?mbox)'
and produces a table of output like:
+------------------+-----------------------------------+ | name| mbox| |------------------|-----------------------------------| | "Dan Brickley"| <mailto:spam@sucks.example.org>| | "Hugo Haas"| <mailto:spam@sucks.example.org>| |"Gerald Oskoboiny"| <mailto:spammers@suck.example.org>| | "Nicole Sullivan"|<mailto:get-a-real-job@example.org>| +------------------+-----------------------------------+
eBNF
<ACTIONs> input := action * actionStr := askStr | assertStr | attachStr | flagsStr | collectStr | namespaceStr | slurpStr askStr := 'ask' DbSpec ? '(' QTerm (('.' QTerm) | ('.'? '||' QTerm) | ('.'? '~' QTerm)) * '.' ? ')' assertStr := 'assert' DbSpec ? '(' decl ('.' decl) * '.' ? ')' attachStr := 'attach' urlvar urlvarlit '(' binding * ')' collectStr := 'collect' '(' variable + ')' flagsStr := 'flags' ('-' | '+') ? '(' binding * ')'; namespaceStr := 'ns' (name '=' url) | url slurpStr := 'slurp' sourceStr DbSpec ? '(' binding * ')' </ACTIONs> <ASSERTterms> decl := subject propValueList propValueList := (property valueList) | (propValueList ';' property valueList) valueList := (value constraint *) | (valueList ',' value constraint * ) </ASSERTterms> <QUERYterms> QTerm := decl | ( '(' QTermPlus dotOpt ')' ) </QUERYterms> <CONSTRAINTS> constraint := '[' expr ']' expr := ( expr op expr ) | single single := ( '-' single ) | ( '!' single ) | ( '~' single ) | ( '(' expr ')' ) | internalName | variable | literal | url op := '*' | '/' | '%' | '+' | '-' | '<' | '>' | '<=' | '>=' | '==' | '!=' | '&' | '^' | '|' | '&&' | '||' | '=' </CONSTRAINTS> <BASIC_TYPES> binding := ( name '=' urlvarlit ) | ( internalName '=' urlvarlit ) sourceStr := url | filename subject := urlvar | ( '[' nulPropValList ']' ) property := urlvar value := urlvarlit | ( '[' ( propValList ';' ? '.' ? ) ? ']' ) internalName := '%' name urlvar := url | variable; urlvarlit := urlvar | literal | internalName variable := '?' variableName dbSpec := url | variable name := VAR variableName := VAR literal := STR | NUM filename := FILE url := ( URL ) | qname qname := ( VAR ':' VAR ) | VAR </BASIC_TYPES> <LEXER> URL := <\s*([\w]+:[^\(\)\s\"\'\>\\]+)\s*\> STR := ( '"' [^"]+ '"' ) | ( "'" [^']+ "'" ) NUM := [0-9]+(?:\.[0-9]+)? VAR := [A-Za-z][A-Za-z0-9_]* FILE := [\.\;\~\|\&\w\/\-]+ </LEXER>
Further Examples
You may collect from different databases. In this case, you must attach to a database and name it, and ask queries of the database you want in particular:
# declare a handy namespace ns dc=<http://purl.org/dc/elements/1.1/> # attach to a couple namespaces attach <http://www.w3.org/1999/02/26-modules/algae#ephemeral> ?foo () attach <http://www.w3.org/1999/02/26-modules/algae#ephemeral> ?bar () # assert into one and slurp into the other assert ?foo (dc:title dc:title "title") slurp <http://www.w3.org/People/Eric/ericP-foaf.rdf> ?bar () # now ask one for all its info ask ?foo (?s ?p ?o) collect (?s ?p ?o)