Re: Intellidimension RDF Gateway Package for URI Query Agent (URIQA) Specification

> I've got a few preliminary comments/questions (more sure to be coming):
>
> 1. One thing I noted when going through the online documentation for your
> URIQA package, in the definition
>
> function Package_OnPutDescription()
> {
>     if (Request.serverVariables["HTTP_URI_RESOLUTION_MODE"] !=
> "Description")
>     {
>         Response.statusCode = 501;
>         return; // Not a URIQA request
>     }
>
>     // Get the URI of the resource from the request
>     var id = new Resource(Request.serverVariables["REQUEST_URL"]);
>
>     // Read the resource description from the request and parse the
contents
>     // as RDF/XML using the Inet data service.
>     var data = Request.binaryRead();
>
>     var ds = new DataSource("inet?parsetype=rdf&src=" +
> Server.urlEncode(data));
>
>     // Add only the statements about the resource to the description
table.
>     var rs = (INSERT {?p ?s ?o} INTO uriqa USING #ds RULEBASE uriqa
>         WHERE (?s=#id OR getAnon(#id, ?s)) AND {?p ?s ?o});
>
>     Response.addHeader("URI-Resolution-Mode", "Description");
> }
>
> your implementation would fail to commit any reifications or
> statements about any anonymous node values.
> Ideally, there would exist as part of the URIQA package, a generic
> method akin to getDescription() in my Java implementation, which
> given a URI and a knowledge base, would extract a concise bounded
> description of the resource from the knowledge base. The input RDF/XML
> could then be parsed and loaded into a temporary knowledge base, the
> description extracted, and then committed to the persistent knowledge
> base. Of course, that same function would find use throughout all of
> the URIQA defined behavior of the package, for the other methods as well.
>

The implementation above makes use of two tables. The first table "ds" is a
local in-memory table that is loaded by parsing the posted RDF/XML. The
second table "uriqa" is a global disk-based table that acts as the
application's knowledge repository. The INSERT command shown above copies
all of the statements about the request URI ("id") from the request into the
repository. This command makes use of an inference rule "getAnon" (see
below) that recursively returns the uri's of all embedded anonymous nodes.
This ensures that all statements about the anonymous node are also inserted
into the knowlege repository.

INFER getAnon(?s, ?anon) FROM ({?p ?s ?anon} AND (substr(?anon, 0,
5)="guid:") OR getAnon(?s, ?anon));


> 2. Does/Will the RDF Gateway provide for the equivalent of servlets,
> where I can map a particular URI prefix to a function? I see that RSPs
> act that way, but I wouldn't want to tie that behavior to a particular
> syntax. I.e., can one have http://sw.nokia.com/foo be bound to a script
> so that http://sw.nokia.com/foo?bar=blargh would be executed as a call
> to foo(bar=blargh)?
>
> If http://sw.nokia.com/foo is an RDFQL script, will the server execute
> that script when the request URI is http://sw.nokia.com/foo?bar=blargh?

Both of the above URI's will cause the same RSP to be executed for a
presentation request. However URIQA description requests are handled
differently. A description request causes the appropriate event handler
function (Package_OnXxxDescription) to be called for the Package. You can
think of a Package as a virtual directory, so if you created a Package named
"foo" all of the following description requests would cause the same event
handler function to be called.

http://sw.nokia.com/foo
http://sw.nokia.com/foo?bar=blargh
http://sw.nokia.com/foo/dir
http://sw.nokia.com/foo/dir/subdir

Your event handler function can get the request URI by calling
Request.serverVariables["REQUEST_URL"]. RDFQL (like-ECMA Script) supports
both maps and function pointers so I would imagine it would not be too
difficult to implement something like this.

// build a function map
var funcs = new Array();
funcs["http://sw.nokia.com/foo"] = func1;
funcs["http://sw.nokia.com/foo/dir"] = func2;

// call the appropriate handler and pass it the query string
funcs[Request.serverVariables["REQUEST_URL"]]
(Request.serverVariables["QUERY_STRING"]] );

>
> 3. Does RDF Gateway already provide, or would it be difficult to provide
> a means to filter query results based on security considerations? E.g.
> rather than flag an error and return nothing if a given user does not
> have the right to view a few statements in the results, simply filter
> out all statements that are disallowed by their access rights when
returning
> the results. One thing we do in the Nokia ontologies is qualify particular
> resources by confidentiality or even explicit access rights, and ideally
> the query processes would work the same for all users for all knowledge,
> differing only in what is allowed to be exposed to the user. Given the
> complexity of our ontologies, it would be prohibitively burdensome to
> try to manage accessibility per source, knowledgebase, server, etc.

RDF Gateway has context-based security. The context is the fourth member of
all statements and is ideal for implementing statement level security.
Simply store your statements using different context URIs and then assign
role or user permissions to the context. If a user does not have access to a
context then statements are "quietly" filtered from queries. This includes
INSERTs, DELETEs and SELECTs based on read, write, and delete permissions.

>
> PS: Is Intellidimension a member of the W3C? If so, would you folks be
> interested in partnering with Nokia in publishing a W3C Note promoting
> URIQA?
>

Intellidimension is not currently a W3C member but we feel we can bring
substantial value to the table in developing such a specification.

Received on Tuesday, 1 July 2003 13:28:03 UTC