- From: Garret Wilson <garret@globalmentor.com>
- Date: Tue, 16 Oct 2007 10:17:34 -0200
- To: Semantic Web <semantic-web@w3.org>
I'd like to announce a new semantic framework named the Uniform Resource
Framework (URF), an alternative to RDF, XML, and JSON. The complete
specification is here:
http://www.urf.name/
If you'd like to jump right in and try out URF, you can find an online
URF processor here:
http://www.guiseframework.com/demo/urfprocess
The online processor allows you to paste in any valid TURF (Text URF,
the default text format of URF) and see the resulting assertions, a TURF
representation, and an interactive URF resource tree. You can even paste
in RDF/XML, and it will be converted to URF, allowing you to see
directly how URF differs from RDF. I suggest copying some examples from
the URF specification and/or from the RDF Primer to start out.
I've also provided an entire open-source source code library for parsing
URF from TURF, parsing URF from RDF/XML, creating a Java instance tree
from URF, generating TURF from URF, generating URF from a Java instance
tree, and manipulating URF in-memory using a simple but comprehensive
API. This is not a set of hacks, but robust, thread-safe,
fully-commented production code. The source code can be retrieved from
the Subversion repository below, with corresponding online API
documentation. The Guise(TM) development library is distributed with the
URF library already compiled.
Source: https://svn.globalmentor.com/java/src/com/garretwilson/urf/
API:
http://www.guiseframework.com/api/com/garretwilson/urf/package-summary.html
Library: http://www.guiseframework.com/com.guiseframework-unlicensed.jar
A few highlights from the URF specification:
* Everything in URF is a resource---even a string, a character, an
integer, a real, a boolean, a date, or a regular expression.
* There are all the data types you need, including binary, sets, lists,
maps, date time, language, and even UTC offset.
* Resources can have scoped properties that are contextual, making
complex values an easy task.
* Resource properties can be ordered (solving the vCard name problem,
among many others).
* Say good-bye to untyped strings. URF provides classes covering
resource with existing string-based types(such as the built-in language
class, which uses RFC 4646 language tags, e.g. «"en-US"(urf.Language)»),
as well as an enum facility for creating your own such classes.
* A resource can be represented in TURF the same regardless of its context.
* Symbols in TURF have the meanings you've come to expect: <> is a URI,
"" is a string, # is a number, [] is a list, {} is a set, // is a
regular expression, and = assigns properties. One of many TURF
innovations: «URI» indicates the resource identified by the URI <URI>.
* There's even support for programming language initializers.
A little background: I've long been an advocate of RDF. On the Open
eBook Forum as early as 1999-04-27, before I fully understood RDF, I was
encouraging Microsoft to use RDF for OEBF metadata. Later I created an
RDF-based packaging format and led a long (but unsuccessful) campaign to
get it into the OEB Publication Structure. (This format, XPackage, does
appear in the RDF Primer, however.) One of my last OEBF discussions was
an OEBF member (who is now a member of semantic-web) trying to convince
him that RDF would be better than XML Schema as a basis for OEB. I
advocated the conversion of vCard to RDF, and even helped edit the new
W3C vCard RDF specification. I've created several RDF ontologies,
including MAQRO and PLOOP. I had based the configuration files of my
Guise(TM) Internet application framework on RDF, and my latest
unannounced Internet project was using RDF at its very core.
As I've worked with RDF over the years, numerous problems with RDF have
come to light, however. These include:
* A huge disparity between how resources and literals are represented by
the framework.
* Redundant semantics (e.g. string-typed literals and plain literals
with no language tags; rdf:type and the typed literal datatype).
* An inability to represent property values that may appear multiple
times but for which order is important without resorting to list-like
classes.
* No way to represent values only valid in certain contexts. (The plain
literal language tag is an exception, but is hard-coded into the
framework for one special case.)
* A lack of rigorous definitions for namespaces and namespace URI
formation, leading to namespace URIs with ending fragment identifiers,
as well as some resource URIs for which the namespace URI cannot be
determined algorithmically.
* A horribly inadequate high-profile serialization format, RDF/XML
(although admittedly there are alternatives).
So I have provided my own solution, fixing RDF's problems and updating
vCard all in one go. URF, together with its default representation
format, Text URF (TURF), it is a better RDF, data-oriented XML, and JSON
all in one package. I've already converted Guise(TM) to use URF, and
it's refreshingly elegant and consistent. (The online URF processing
demo above uses Guise.)
Here's just a quick example of URF encoded in TURF:
*declare and label the example and foaf namespaces*
|example|<http://example.com/example>,
|foaf|<http://xmlns.com/foaf/0.1/>,
*describe a FOAF person identified by the URI
<http://example.com/example#janedoe>*
example.janedoe(foaf.Person):
example.name="Jane Doe",
example.birthday=@1980-01-01,
example.salary=#1000000:
example.currency~«"usd"(example.Currency)»
;
;
The above is semantically identical to the following long-form TURF
without comments:
«http://example.com/example#janedoe»:
«http://www.urf.name/urf#type»=«http://xmlns.com/foaf/0.1/Person»,
«http://example.com/example#name»=«info:lexical/http%3A%2F%2Furf.name%2Furf%23String#Jane%20Doe»,
«http://example.com/example#birthday»=«info:lexical/http%3A%2F%2Furf.name%2Furf%23Date#1980-01-01»,
«http://example.com/example#salary»=«info:lexical/http%3A%2F%2Furf.name%2Furf%23Integer#1000000»:
«http://example.com/example#currency»~«info:lexical/http%3A%2F%2Fexample.com%2Fexample%23Currency#usd»
;
;
And for comparison with RDF, here are two sets of identical information,
first in RDF/XML and then in TURF. (Paste in the information at
http://www.guiseframework.com/demo/urfprocess and see for yourself.)
<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">]>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:example="http://example.com/example#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
>
<foaf:Person rdf:about="http://example.com/example#janedoe">
<foaf:nick xml:lang="pt-BR">Janinha</foaf:nick>
<example:age rdf:datatype="&xsd;integer">23</example:age>
<example:birthdate
rdf:datatype="&xsd;date">1980-04-05</example:birthdate>
<example:motto rdf:parseType="Literal">Do it. Do it
<xhtml:em>right</xhtml:em>.</example:motto>
<example:favoriteSites rdf:parseType="Collection">
<rdf:Description rdf:about="http://www.globalmentor.com/"/>
<rdf:Description rdf:about="http://www.garretwilson.com/"/>
</example:favoriteSites>
<example:possibleVacationDestinations>
<rdf:Alt>
<rdf:li>Paris</rdf:li>
<rdf:li>Rome</rdf:li>
</rdf:Alt>
</example:possibleVacationDestinations>
</foaf:Person>
</rdf:RDF>
|content|<http://urf.name/content>,
|dc|<http://purl.org/dc/elements/1.1/>,
|example|<http://example.com/example>,
|foaf|<http://xmlns.com/foaf/0.1/>,
|urf|<http://urf.name/urf>,
example.janedoe(foaf.Person):
example.age=#23,
example.birthdate=@1980-04-05,
example.favoriteSites=
[
«http://www.globalmentor.com/»,
«http://www.garretwilson.com/»
],
example.motto="Do it. Do it <xhtml:em
xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">right</xhtml:em>.":
content.type~«"text/xml-external-parsed-entity/xml-external-parsed-entity"(urf.MediaType)»
;,
example.possibleVacationDestinations=
{
"Paris",
"Rome"
},
nick="Janinha":
dc.language~«"pt-BR"(urf.Language)»
;
;
If there are any questions or comments; or if you find problems in the
specification, code, or online processor, let me know.
Sincerely,
Garret
Received on Tuesday, 16 October 2007 12:18:28 UTC