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
statementsMatching
for users of that
interface
- implements
processQuerySet
for 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
statementsMatching
for each
constraint of the algae query
- Algae's
interpretAlgae
uses results from
statementsMatching
to constrain calls for subsequent
calls
- ObjectDB (the SQL-backed DB) implements
interpretAlgae
to
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_maker
to apply RDF structure to any
SQL database.
- moves all data into the semantic web
all your database belong to us*)
- SqlDB implements only
triplesMatching
right 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/