Libraries
  - RDF Parser - multiple RDF syntaxes
- RDF Databases - triple stores
- Algae - generalized RDF query
RDF Databases
  - RdfDB - in memory triple store
- ObjectDB - persistent triple store over SQL
- SqlDB - interface to SQL DB with arbitrary structure
- FingerDB - cute toy to query over finger protocol
RdfDB
  - defined by an interface (API)
- scratch space for graph manipulations
- typed node with specific interfaces (for instance, String has an
    encoding)
- elementary search capabilities
 statementsMatching[p s o]
- advanced search capabilities
 processQuerySet(array of constraints)
ObjectDB
  - persistent SQL graph store
- space efficient for scalability
 each string and URL appears only once (atomic)
 statements use external keys (integers) for (p s o)
- some rewrite functionality (AKA rules)
- implements statementsMatchingfor users of that
  interface
- implements processQuerySetfor optimized algae queries
Algae
generalized RDF statement queries
  - describes a graph with variables in some node positions
- s-expression syntax
    
      
        
          | query :: | "(ask '(" contstraints+ ") :collect '(" variable+ "))" |  
          | contstraint :: | urlvar ' ' urlvar ' ' urlvarstr |  
          | urlvar :: | URL | variable |  
          | urlvarstr :: | URL | variable | string |  
          | variable :: | '?' name |  
          | string :: | '"' text '"' |  
 (ask '(
 (http://...#type ?annot http://...#Annotation)
 (http://...#Author ?annot "Joe")
 (http://...#Annotates ?annot ?doc)
 ):collect '(?doc))
- inspired by algernon - principal difference:
    
      - algae is not access-limited - algernon assumes triples are accessed
        by subject only
 
Algae Query Data Structure
  - algae parser produces a data structure to represent the graph query
- all triples-store queries langauges represent a graph
- other query formats can produce the same structure and leverage off the
    database query support
- for example, there is support ILRT strawman (prolog inspired query
    format)
    {http://...#type} (FRIEND , http://...#Friend)
{http://...#Address} (FRIEND , ADDRESS)
{http://...#Street} (ADDRESS , STREET)
Algae is SQL-like
combinatorial solution set
yields every combination that matches query:
  
    
      | 
          
            
              | Friend |  
              | id | name |  
              | 586 | Dick |  
              | 14 | Jane |  
              | 703 | Spot |  | 
          
            
              | Address |  
              | id | street |  
              | 586 | 218 12th Street West |  
              | 14 | 6219 6th Avenue |  
              | 586 | 123 Elmstraas |  | 
  
SELECT Friend.name,Address.street
FROM Friend,Address
WHERE Friend.id=Address.id
  
    
      | query results | 
    
      | name | street | 
    
      | Dick | 218 12th Street West | 
    
      | Jane | 6219 6th Avenue | 
    
      | Dick | 123 Elmstraas | 
  
Algae Query on Repeated Property
  
    
      |  |  |  | 
    
      | predicate | subject | object | 
    
      | rdf:type | myFriends:Dick | Rolodex:Friend | 
    
      | Rolodex:Address | myFriends:Dick | [anoymous node 23] | 
    
      | Rolodex:Street | [anoymous node 23] | 218 12th Street West | 
    
      | Rolodex:Address | myFriends:Dick | [anoymous node 614] | 
    
      | Rolodex:Street | [anoymous node 614] | 123 Elmstraas | 
    
      | rdf:type | myFriends:Jane | Rolodex:Friend | 
    
      | Rolodex:Address | myFriends:Jane | [anoymous node 218] | 
    
      | Rolodex:Street | [anoymous node 218] | 6219 6th Avenue | 
    
      | rdf:type | myFriends:Spot | Rolodex:Friend | 
  
(ask '((rdf:type ?friend Rolodex:Friend)
       (Rolodex:Address ?friend ?addrNode)
       (Rolodex:Street ?addrNode ?street)
       ) :collect '(?friend ?street))
  
    
      | query results | 
    
      | ?friend | ?street | 
    
      | myFriends:Dick | 218 12th Street West | 
    
      | myFriends:Dick | 123 Elmstraas | 
    
      | myFriends:Jane | 6219 6th Avenue | 
  
Database Support for Algae
  - database support comes from implementing
  statementsMatching
- Algae calls the database's statementsMatchingfor each
    constraint of the algae query
- Algae's interpretAlgaeuses results fromstatementsMatchingto constrain calls for subsequent
  calls
- ObjectDB (the SQL-backed DB) implements interpretAlgaeto
    move the join off the the SQL server
- other databases may support statementsMatching, like a
    finger-backed RDF datasource
 statementsMatching(finger:lastReadMail myFriend:spot NULL)would return the statement asserting the last time Spot read his
  mail.
SqlDB
  - combined with object_makerto apply RDF structure to any
    SQL database.
- moves all data into the semantic web 
 all your database belong to us*)
- SqlDB implements only triplesMatchingright now
* silly popular culture reference
SqlDB Example: ACLs Query to W3C Site
algae(namespace '(a http://localhost/SqlDB#) 
    attach '("W3C::Rdf::SqlDB" ("properties:/usr/local/perl/modules/Conf/chacl.prop" "name:a::W3Cacls")) 
    ask '(a::W3Cacls
     (a::uris.uri ?uri0 http://www.w3.org/Member/Overview.html)
     (a::uris.acl ?uri0 ?t1)
     (a::acls.acl ?acl0 ?t1)
     (a::ids.value ?id0 "eric")
     (a::idInclusions.id ?idInc0 ?id0)
     (a::acls.id ?acl0 ?t0)
     (a::idInclusions.groupId ?idInc0 ?t0)
    )
    collect '(?t0) 
   ) -> 
("100")
("102")
Cost
010505  7:39:24             71 Query       SELECT id FROM uris WHERE uri="http://www.w3.org/Member/Overview.html"
                     71 Query       SELECT acl FROM uris WHERE uris.id=1
                     71 Query       SELECT access FROM acls WHERE acl="6"
                     71 Query       SELECT id FROM ids WHERE value="eric"
                     71 Query       SELECT id FROM ids WHERE value="eric"
                     71 Query       SELECT groupId FROM idInclusions WHERE idInclusions.id=2112
                     71 Query       SELECT groupId FROM idInclusions WHERE idInclusions.id=2112
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3122
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
                     71 Query       SELECT id FROM acls WHERE acls.access=3955
010505  7:39:25             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=100
010505  7:39:30             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=102
010505  7:39:31             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=103
                     71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=104
010505  7:39:32             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=105
010505  7:39:38             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=106
                     71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=115
010505  7:39:44             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=117
                     71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=120
010505  7:39:45             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=2112
                     71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=7756
010505  7:39:46             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=9546
010505  7:39:47             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=100
010505  7:39:52             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=102
010505  7:39:53             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=103
                     71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=104
010505  7:39:54             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=105
010505  7:40:00             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=106
                     71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=115
010505  7:40:06             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=117
                     71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=120
010505  7:40:07             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=2112
010505  7:40:08             71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=7756
                     71 Query       SELECT 1 FROM idInclusions WHERE idInclusions.groupId=9546
ProcessQuerySet: Algae Query
algae(namespace '(a http://localhost/SqlDB#) 
    attach '("W3C::Rdf::SqlDB" ("properties:/usr/local/perl/modules/Conf/chacl.prop" "name:a::W3Cacls")) 
    ask '(a::W3Cacls
     (a::uris.uri ?uri0 http://www.w3.org/Member/Overview.html)
     (a::uris.acl ?uri0 ?t1)
     (a::acls.acl ?acl0 ?t1)
     (a::ids.value ?id0 "eric")
     (a::idInclusions.id ?idInc0 ?id0)
     (a::acls.id ?acl0 ?t0)
     (a::idInclusions.groupId ?idInc0 ?t0)
    )
    collect '(?t0) 
   )
ProcessQuerySet: SQL Query
SELECT idInc0.groupId FROM
    uris as uri0,acls as acl0,ids as id0,idInclusions as idInc0 WHERE
    uri0.uri='http://www.w3.org/Member/Overview.html' AND
    acl0.acl=uri0.acl AND
    id0.value='eric' AND
    idInc0.id=id0.id AND
    idInc0.groupId=acl0.id
+---------+
| groupId |
+---------+
|     100 |
|     102 |
+---------+
Contacts
discuss this and other library-related stuff on www-rdf-perllib@w3.org
These slides will be available at
http://www.w3.org/2001/Talks/0505-perl-RDF-lib/