- From: Garret Wilson <garret@globalmentor.com>
- Date: Mon, 06 Aug 2007 10:11:02 -0700
- To: Semantic Web <semantic-web@w3.org>
Here's one more proposal for an addition to RDF 2.0. It promised to be no less controversial than my proposal for removal of literals, but don't worry---I have no delusions that this actually has a chance of becoming part of an RDF 2.0. (I expect RDF 2.0 to come long after there is an XHTML 2.0, which will arrive when Internet Explorer supports XHTML 1.0. In short, I'm not putting any bets on there being an RDF 2.0.) I look forward to feedback---RDF 2.0 or no, this will help me put the last pieces in place of an idea that's been brewing for years. If you don't understand the proposal, or it confuses you to no end, please feel no obligation to participate. Let me lay out my proposal as a series of preludes: ***OEBPS Spines*** Back when I was leading the Open eBook Publication Structure 2 effort circa 2001/2002 and trying to get OEBPS to adopt RDF, I laid out an RDF-based proposal (the XPackage ontology that appears in the RDF Primer). The XPackage specification included a "manifest" which specified the content of a packaged book. The person from Microsoft working on OEB stressed that there should be a way to specify content properties that were only valid in the context of the manifest. In other words, if I include about-author.html in the book's manifest, I need to be able to specify that about-author.html has a stylesheet fancy.css---but only when that document appears in this book. We don't want to specify that about-author.html has a stylesheet fancy.css wherever it appears (perhaps also in another book). OEB never adopted RDF, so I never had to come to terms with the nagging question: how do I specify contextual properties in RDF? ***vCard Telephones*** We've got a significant problem in creating an RDF version of vCard. We want to be able to specify someone's telephone number with a vcard:tel property (with value <tel:+1-201-555-123>, for example). But we also need to specify if that telephone number is a mobile number, a work number, a fax number, a preferred number, etc. The current W3C vCard Ontology draft adds a vcard:homeTel property, a vcard:mobileTel property, a vcard:workTel property, etc. But that's a cumbersome solution---imagine a vcard:preferredHomeWorkFaxTel property. It's unclear to me that this even represents the semantics we desire. Aren't we really trying to say, "The resource identified by <tel:+1-201-555-123> has a vcard:phoneType of "home", but only in the context of this VCard's vcard:tel property? ***vCard Names*** And then we have vCard names. The vcard:Name class can have a vcard:familyName property. But according to the vCard specification, we need to be able to specify multiple vcard:familyName properties---but the order of them may be significant. The only way in RDF to keep track of order is to put the vcard:familyName properties in an rdf:Seq or rdf:List. But requiring an rdf:List for every vcard:familyName is overkill for what will most of the time be a single vcard:familyName value. Furthermore, are we going to require an rdf:List in every situation in which there could be multiple, ordered property values? Isn't what we're really trying to say, "This vcard:Name has multiple vcard:familyName values, but they each have an order that only has meaning in the context of this vcard:Name resource?" ***RDF xml:lang*** At this point you may be dismissing the whole idea of so-called "contextual values". But RDF already includes one contextual property that behaves exactly as I'm describing: xml:lang. The xml:lang pseudo-property can appear "on any node element or property element", according to <http://www.w3.org/TR/rdf-syntax-grammar/#section-Syntax-languages>. The semantics of xml:lang seems to be, "This resource has the specified language---but only in the context of the given property." In other words, if I use the string "mais" with an xml:lang of "fr" ("mais" means "but" in French), I don't mean that all instances of the string "mais" should have that language specified---in other contexts, "mais" may have an xml:lang of "pt" ("mais" means "more" in Portuguese). (That RDF doesn't allow xml:lang for typed literals doesn't affect the point I'm making here---don't get confused by the inconsistent and incomplete ways RDF deals with literals.) Obviously xml:lang is a hack in the RDF model for a single case, forcing the model to carry around language information that isn't a real "property". We could add other similar hacks for individual cases---perhaps creating an rdf:order property that is defined to be contextual in the same way that xml:lang is contextual. But I would prefer a general solution. ***A General Contextual Property Solution*** When I say that <http://example.com/william> has a vcard:nickname of "Bill" in the xml:lang of "en", what am I really saying? I'm saying that <http://example.com/william> uses "Bill" as a vcard:nickname, and when he does, he considers "Bill" to be in the English language. Similarly, if <http://example.com/book> has eg:content of <http://example.com/about-author.html>, which in turn has a x:stylesheet of <http://example.com/fancy.css> but only for this book, I'm trying to say that <http://example.com/book> considers <http://example.com/fancy.css> to be the x:stylesheet of <http://example.com/about-author.html>, but only as the eg:content of <http://example.com/book>. So let me reformulate xml:lang that using a general solution, in which the contextual subject has an rdf:context property with an rdf:Statement value, indicating the contextual property using rdf:of. I'm going to use RDFON because I'm still not completely up to speed on N3, but the notation is close enough so that you should be able to follow along: <http://example.com/william> { vcard#nickname : "Bill", rdf#context : rdf#Statement() { rdf#of : vcard#nickname, rdf#subject : "Bill", rdf#predicate : x#lang, rdf#object : "en" } } Similarly, the second example: <http://example.com/book> { eg#content : <http://example.com/about-author.html>, rdf#context : rdf#Statement() { rdf#of : eg#content, rdf#subject : <http://example.com/about-author.html>, rdf#predicate : x:stylesheet, rdf#object : <http://example.com/fancy.css> } } But I would also want to have a shortcut notation. Let me give the same two examples, using "~" to indicate contextual properties. These would be equivalent to the examples above <http://example.com/william> { vcard#nickname : "Bill" { ~x#lang : "en" } } http://example.com/book { eg#content : <http://example.com/about-author.html> { ~x:stylesheet : <http://example.com/fancy.css> } } Now let's talk about vcard:familyName of a vcard:Name. If we were to have an rdf:order property that could be made contextual, we could easily add multiple, ordered family names of "Jones van Buren" like this: vcard#Name() { vcard#givenName : "William", vcard#familyName : "Jones", rdf#context : rdf#Statement() { rdf#of : vcard#familyName, rdf#subject : "Jones", rdf#predicate : rdf#order, rdf#object : 0 }, vcard#familyName : "van Buren", rdf#context : rdf#Statement() { rdf#of : vcard#familyName, rdf#subject : "van Buren", rdf#predicate : rdf#order, rdf#object : 1 } } In other words, the family names have contextual orders of 0 and 1. This contextual-list like pattern would also have a shortcut syntax: the "|" delimiter or something similar: vcard#Name() { vcard#givenName : "William", vcard#familyName : |"Jones", "van Buren"| } This would automatically create two vcard:familyName properties (normal RDF 1.x properties), and would also create two rdf:context properties (again, normal RDF 1.x properties), each providing a generated a contextual order of 0 and 1, respectively. An API could query each of the properties as normal. An API would also provide a contextual property query, like this: Resource.getProperty(contextSubject, contextPredicate, property); I think that contextual properties solve a host of problems relating to modeling the world---we've ran into several of them just trying to make a vCard RDF ontology. The solution presented here is 100% RDF 1.x compatible. It's just that in RDF 2.0 we could make it a more natural part of the framework, with more natural serialization and query syntaxes. If you don't like this proposal, don't worry---it has the proverbial snowball chance of going anywhere. But it does meet what I consider to be a real need for contextual properties. If you have a better proposal, let me know. And if you have suggestions on how to make this proposal better, I'd love to hear it. Garret
Received on Monday, 6 August 2007 17:11:23 UTC