- From: Henry Story <henry.story@bblfish.net>
- Date: Sat, 23 Jul 2005 14:40:58 +0200
- To: SWIG <semantic-web@w3.org>
- Message-Id: <F7E9CAE4-E6E4-4E2B-88E7-2E443C45737C@bblfish.net>
Hi,
I am working on BlogEd [1] where I have developed a nice and simple
triple to OO mapping
library [2]. This makes it very easy to write a java interface that
can then act as a
proxy on an RDF database. It is really neat in that it makes it dead
easy to understand
the relation between Java and the Semantic Web. So take the
AtomPerson [3] interface
-------------8<--------------------------------------------
public interface AtomPerson {
String BASE = "https://bloged.dev.java.net/Ontology/";
String RDF_TYPE = BASE + "Person";
String RDF_name = BASE + "firstName";
public void setFirstName(String name);
public String getFirstName();
String RDF_family = BASE + "familyName";
public void setFamilyName(String name);
public String getFamilyName();
String RDF_email = BASE + "email";
public void setEmail(URI email);
public URI getEmail();
String RDF_uri = BASE + "uri";
public void setUri(URI uri);
public URI getUri();
}
----------------8<------------------------------------------
Here we define an interface which maps to a OWL class
https://bloged.dev.java.net/Ontology/Person.
This class has 4 java bean properties each of which have a
corresponding OWL relation:
- https://bloged.dev.java.net/Ontology/firstName
- https://bloged.dev.java.net/Ontology/familyName
- https://bloged.dev.java.net/Ontology/email
- https://bloged.dev.java.net/Ontology/uri
It is very easy having such a class to write a little program that
could generate a
nice corresponding xml/rdf OWL ontology. As you can see it is really
easy to understand.
It is also very easy to use. This is how one could create a
AtomPerson instance:
----------------8<------------------------------------------
AtomPerson me = (AtomPerson) factory.createObject(AtomPerson.class);
me.setFirstName("Henry");
me.setEmail(URI.create("mailto:henry.story@bblfish.net"));
me.setUri(URI.create("http://bblfish.net/"));
----------------8<------------------------------------------
That's it. Each of the above statements adds some new triples to the
database. The first
one creates an anonymous object of type AtomPerson.RDF_TYPE. The last
two add relations to
that anonymous object.
Currently I am using the Sesame Native sail which does not support
inferencing. I have gotten
very far without inferencing, but it gets in the way a *lot*.
Inferencing would (I hope) make
it very easy to push the above library much further.
Consider for example that I now create another AtomPerson x, with the
same e-mail. Clearly
the email address relation should be inverse functional, ie if two
things have that relation
to the same e-mail address then those two things are the same.
----------------8<------------------------------------------
AtomPerson x = (AtomPerson) factory.createObject(AtomPerson.class);
assert(!x.equals(me));
x.setEmail(URI.create("henry.story@bblfish.net"));
//I should not be able to conclude
assert(x.equals(me));
assert("Henry".equals(x.getFirstName()));
----------------8<------------------------------------------
Sesame has some OWL inferencing sails that should get me this far. I
could
use those to help me get an idea on what types of problems this
brings up:
one thing that will need to be solved will be how this can interact with
Java hashes, as an object's equality relations may change as data is
added to
the database, as shown above.
Functional and inverse functional properties are pretty cool, but I
have found
while writing BlogEd that I needed one more thing: Combined Inverse
Functional
Properties (CIFP) [4]. A bad example of a CIFP would be to say that
the first
name and family name are CIFPs: ie if two references to people have
the same
first name and same family name then these references refer to the
same person.
Clearly this is not true. My grandfather was also called "Henry
Story" and I am
not him. But in order to help me continue using the same example I'll
assume it is
true. [5]
----------------8<------------------------------------------
me.setFamilyName("Story");
AtomPerson y = (AtomPerson) factory.createObject(AtomPerson.class);
assert(!y.equals(me));
y.setFirstName("Henry");
assert(!y.equals(me));
y.setFamilyName("Story");
//Now the database can deduce from the CIFPs that
assert(y.equals(me));
assert(URI.create("mailto:henry.story@bblfish.net").equals(y.getEmail
()));
----------------8<------------------------------------------
If this were possible then I think it would be very easy to explain
the SemWeb to any Java programmer, and it would also make data dependent
applications much easier to write. Currently I always have to work
hard on
creating some artificial key to help me identify equal things.
Of course inferencing could do a lot more than this, but
the nice thing is that the above seems to at least to be very
feasible type of
inferencing. It feels nearly like an extension to garbage collection.
So to summarize I was looking for a database that would allow had OWL
inferencing
including CIFPs or allowed one to specify rules flexibly (preferably
N3) so that
I could get the effects needed.
Or perhaps what I am trying to do is known to be foolish, impossible,
dangerous
or better done in some other way.
Henry Story
http://bblfish.net/blog/
[1] https://bloged.dev.java.net
[2] https://bloged.dev.java.net/source/browse/bloged/src/com/sun/labs/
tools/rdf/
[3] https://bloged.dev.java.net/source/browse/bloged/src/com/sun/labs/
tools/blog/AtomPerson.java?rev=1.2&view=markup
It is a little out of date version of the Person construct in the
Atom 1.0 spec
http://atompub.org/
[4] http://www.openrdf.org/forum/mvnforum/viewthread?thread=460
[5] Other examples of CIFPs are the components of a URL:
- protocol
- host
- port
- path
(simplifying a little). If two references to URLs have the same
values for all the above then
they refer to the same URL.
Attachments
- text/directory attachment: Henry_Story.vcf
Received on Saturday, 23 July 2005 12:41:14 UTC