- From: Dave Reynolds <der@hplb.hpl.hp.com>
- Date: Tue, 14 Oct 2008 16:33:44 +0100
- To: Gary Hallmark <gary.hallmark@oracle.com>
- CC: RIF WG <public-rif-wg@w3.org>
Hi Gary, Not studied this properly yet but one comment/question: Might it make sense to use the URI format from XML Schema Component Designators (the abbreviated syntax) for the class/property URIs? I realize that XSCD is still a work in progress, and has been in progress for a while, so we probably don't want a dependency. However, having our URIs compatible with their current proposals might be worth contemplating. Warning: I've very little knowledge or understanding of XSCD so this may be a stupid suggestion but at the least we probably want an answer to any future last call comment around "why not use XSCD". Dave Gary Hallmark wrote: > > This is in response to ACTION-591. > > Mapping XML Schema valid XML Data to RIF Frames > =============================================== > > This is a strawman for mapping XML documents whose structure is > described by an XML schema[1] to and > from RIF Core frames. > > An XML element has a type as defined by its schema. The type can be > simple or complex. Simple types > can be atomic, lists, or unions. Atomic types can be primitive (e.g. > xs:string), or they can be > enumerations or restrictions of atomic types. A complex type can have > attributes and content. The > content can be simple, or it can be a sequence, choice, or set of > elements. An attribute has a name and > a value. The value has a simple type. Types can be derived by > extension or restriction. > Elements and types can be named globally or locally. A local element > can be defined by referring to a > global element. An element may be defined by referring to a global type, > or can include the type > definition in the content of its own definition. There are many ways to > write the "same" schema. > > Thus, XML schema is quite complex. Here, we limit our concern to > mapping elements of complex type to > frames. The only simple types we will handle are the primitive types > supported by RIF DTB. Our > contribution is mainly to define how to construct IRIs of class > constants and slot name constants from > the XML schema. > > This is a "strawman by example", so we start with an example document > (from [2]). > > Example XML Document > -------------------- > > <shiporder orderid="889923" xmlns="http://example.org"> > <orderperson>John Smith</orderperson> > <shipto> > <name>Ola Nordmann</name> > <address>Langgt 23</address> > <city>4000 Stavanger</city> > <country>Norway</country> > </shipto> > <item> > <title>Empire Burlesque</title> > <note>Special Edition</note> > <quantity>1</quantity> > <price>10.90</price> > </item> > <item> > <title>Hide your heart</title> > <quantity>1</quantity> > <price>9.90</price> > </item> > </shiporder> > > We consider 3 ways to write a schema for the above document. > > 1. One big element > ------------------ > > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > targetNamespace="http://example.org"> > > <xs:element name="shiporder"> > <xs:complexType> > <xs:sequence> > <xs:element name="orderperson" type="xs:string"/> > <xs:element name="shipto"> > <xs:complexType> > <xs:sequence> > <xs:element name="name" type="xs:string"/> > <xs:element name="address" type="xs:string"/> > <xs:element name="city" type="xs:string"/> > <xs:element name="country" type="xs:string"/> > </xs:sequence> > </xs:complexType> > </xs:element> > <xs:element name="item" maxOccurs="unbounded"> > <xs:complexType> > <xs:sequence> > <xs:element name="title" type="xs:string"/> > <xs:element name="note" type="xs:string" minOccurs="0"/> > <xs:element name="quantity" type="xs:positiveInteger"/> > <xs:element name="price" type="xs:decimal"/> > </xs:sequence> > </xs:complexType> > </xs:element> > </xs:sequence> > <xs:attribute name="orderid" type="xs:string" use="required"/> > </xs:complexType> > </xs:element> > > </xs:schema> > > Using the above schema, we represent the shiporder using the following > RIF-PS: > > Prefix(tns http://example.org) > > _obj1#<tns:/shiporder> > _obj1[<tns:/shiporder@orderid> -> "889923" > <tns:/shiporder/orderperson> -> "John Smith" > <tns:/shiporder/shipto> -> _obj2 > <tns:/shiporder/item> -> _obj3 > <tns:/shiporder/item> -> _obj4 > ] > > _obj2#<tns:/shiporder/shipto> > _obj2[<tns:/shiporder/shipto/name> -> "Ola Nordmann" > <tns:/shiporder/shipto/address> -> "Langgt 23" > <tns:/shiporder/shipto/city> -> "4000 Stavanger" > <tns:/shiporder/shipto/country> -> "Norway" > ] > > _obj3#<tns:/shiporder/item> > _obj3[<tns:/shiporder/item/title> -> "Empire Burlesque" > <tns:/shiporder/item/note> -> "Special Edition" > <tns:/shiporder/item/quantity> -> 1 > <tns:/shiporder/item/price> -> 10.90 > ] > > _obj4#<tns:/shiporder/item> > _obj4[<tns:/shiporder/item/title> -> "Hide your heart" > <tns:/shiporder/item/quantity> -> 1 > <tns:/shiporder/item/price> -> 9.90 > ] > > > 2. Refs to Global Elements and Attributes > ----------------------------------------- > > A second equivalent schema uses the following style. > > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > targetNamespace="http://example.org"> > > <!-- definition of simple elements --> > <xs:element name="orderperson" type="xs:string"/> > <xs:element name="name" type="xs:string"/> > <xs:element name="address" type="xs:string"/> > <xs:element name="city" type="xs:string"/> > <xs:element name="country" type="xs:string"/> > <xs:element name="title" type="xs:string"/> > <xs:element name="note" type="xs:string"/> > <xs:element name="quantity" type="xs:positiveInteger"/> > <xs:element name="price" type="xs:decimal"/> > > <!-- definition of attributes --> > <xs:attribute name="orderid" type="xs:string"/> > > <!-- definition of complex elements --> > <xs:element name="shipto"> > <xs:complexType> > <xs:sequence> > <xs:element ref="name"/> > <xs:element ref="address"/> > <xs:element ref="city"/> > <xs:element ref="country"/> > </xs:sequence> > </xs:complexType> > </xs:element> > <xs:element name="item"> > <xs:complexType> > <xs:sequence> > <xs:element ref="title"/> > <xs:element ref="note" minOccurs="0"/> > <xs:element ref="quantity"/> > <xs:element ref="price"/> > </xs:sequence> > </xs:complexType> > </xs:element> > > <xs:element name="shiporder"> > <xs:complexType> > <xs:sequence> > <xs:element ref="orderperson"/> > <xs:element ref="shipto"/> > <xs:element ref="item" maxOccurs="unbounded"/> > </xs:sequence> > <xs:attribute ref="orderid" use="required"/> > </xs:complexType> > </xs:element> > > </xs:schema> > > Using the above schema, we represent the shiporder using the following > RIF-PS: > > Prefix(tns http://example.org) > > _obj1#<tns:/shiporder> > _obj1[<tns:@orderid> -> "889923" > <tns:/orderperson> -> "John Smith" > <tns:/shipto> -> _obj2 <tns:/item> -> _obj3 > <tns:/item> -> _obj4 > ] > > _obj2#<tns:/shipto> > _obj2[<tns:/name> -> "Ola Nordmann" > <tns:/address> -> "Langgt 23" > <tns:/city> -> "4000 Stavanger" > <tns:/country> -> "Norway" > ] > > _obj3#<tns:/item> > _obj3[<tns:/title> -> "Empire Burlesque" > <tns:/note> -> "Special Edition" > <tns:/quantity> -> 1 > <tns:/price> -> 10.90 > ] > > _obj4#<tns:/item> > _obj4[<tns:/title> -> "Hide your heart" > <tns:/quantity> -> 1 > <tns:/price> -> 9.90 > ] > > 3. Named Types > -------------- > > The third style of schema uses named types. > > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > targetNamespace="http://example.org"> > > <xs:simpleType name="stringtype"> > <xs:restriction base="xs:string"/> > </xs:simpleType> > > <xs:simpleType name="inttype"> > <xs:restriction base="xs:positiveInteger"/> > </xs:simpleType> > > <xs:simpleType name="dectype"> > <xs:restriction base="xs:decimal"/> > </xs:simpleType> > > <xs:simpleType name="orderidtype"> > <xs:restriction base="xs:string"> > <xs:pattern value="[0-9]{6}"/> > </xs:restriction> > </xs:simpleType> > > <xs:complexType name="shiptotype"> > <xs:sequence> > <xs:element name="name" type="stringtype"/> > <xs:element name="address" type="stringtype"/> > <xs:element name="city" type="stringtype"/> > <xs:element name="country" type="stringtype"/> > </xs:sequence> > </xs:complexType> > > <xs:complexType name="itemtype"> > <xs:sequence> > <xs:element name="title" type="stringtype"/> > <xs:element name="note" type="stringtype" minOccurs="0"/> > <xs:element name="quantity" type="inttype"/> > <xs:element name="price" type="dectype"/> > </xs:sequence> > </xs:complexType> > > <xs:complexType name="shipordertype"> > <xs:sequence> > <xs:element name="orderperson" type="stringtype"/> > <xs:element name="shipto" type="shiptotype"/> > <xs:element name="item" maxOccurs="unbounded" type="itemtype"/> > </xs:sequence> > <xs:attribute name="orderid" type="orderidtype" use="required"/> > </xs:complexType> > > <xs:element name="shiporder" type="shipordertype"/> > > </xs:schema> > > Using the above schema, we represent the shiporder using the following > RIF-PS: > > Prefix(tns http://example.org) > > _obj1#<tns:/shiporder> > <tns:/shiporder>##<tns:/shipordertype> > _obj1[<tns:/shipordertype@orderid> -> "889923" > <tns:/shipordertype/orderperson> -> "John Smith" > <tns:/shipordertype/shipto> -> _obj2 > <tns:/shipordertype/item> -> _obj3 > <tns:/shipordertype/item> -> _obj4 > ] > > _obj2#<tns:/shiptotype> > _obj2[<tns:/shiptotype/name> -> "Ola Nordmann" > <tns:/shiptotype/address> -> "Langgt 23" > <tns:/shiptotype/city> -> "4000 Stavanger" > <tns:/shiptotype/country> -> "Norway" > ] > > _obj3#<tns:/itemtype> > _obj3[<tns:/itemtype/title> -> "Empire Burlesque" > <tns:/itemtype/note> -> "Special Edition" > <tns:/itemtype/quantity> -> 1 > <tns:/itemtype/price> -> 10.90 > ] > > _obj4#<tns:/itemtype> > _obj4[<tns:/itemtype/title> -> "Hide your heart" > <tns:/itemtype/quantity> -> 1 > <tns:/itemtype/price> -> 9.90 > ] > > General Rules > ------------- > > 1. order of sequences is not preserved > > 2. cardinality (minOccurs, maxOccurs) is ignored > > 3. simple types are ignored > > 4. the IRI for an element e (IRI(e)) is given by > a. <tns:/e> if e is a global element, where tns is the targetNamespace > of the schema > b. <C:/e> otherwise, where C is the IRI of the containing complexType of e > > 5. the IRI for an attribute a (IRI(a)) is given by > a. <tns:@a> if a is a global attribute > b. <C:@a> otherwise, where C is the IRI of the containing complexType of a > > 6. the IRI for a complexType c (IRI(c)) is given by > a. <tns:/c> if c is a global complexType > b. <E:c> otherwise, where E is the IRI of the element containing c > > 7. an instance of an XML element e with complexType c maps to an object > _o that is a member of IRI(e). > I.e., _o#IRI(e). If IRI(e) != IRI(c), then additionally we have the > axiom IRI(e)##IRI(c). > > 8. an element f contained in e (whether in a sequence, choice, or all) > is a frame slot of _o named > IRI(f). E.g. _o[IRI(f)->...] > > 9. if complexType sub extends a complexType sup, then IRI(sub)##IRI(sup) > > Issues > ------ > > Slot names are not disjoint from class names. > > We could of course map much more schema information to axioms. E.g. > maxOccurs=1 could be expressed as > ?x=?y :- _o[slot1->?x slot1->?y]. But that's not Core. Are there other > things expressible in Core that > we should map? > > Should we care if the trailing char of tns is '/'? or should we use '#' > instead of the first '/' in the > curie? or should we use '/' or '/@' instead of '@' for attributes? > > Neither '#' nor '##' is legal in the conclusion in Core. Probably they > should be allowed in ground > facts. > > Because we don't capture all the schema constraints, it may be > impossible to serialize a collection of > frames computed by a seemingly consistent ruleset into a schema-valid > XML document. > > Fully-striped XML data doesn't need a schema, and probably should follow > an RDF-style mapping (not > covered here). > > > [1] http://www.w3.org/TR/xmlschema-0/ > [2] http://www.w3schools.com/Schema/schema_example.asp >
Received on Tuesday, 14 October 2008 15:35:12 UTC