# RELAX NG Compact Syntax Grammar for proposed RDF/TreeTriples syntax # EXPERIMENTAL! # # David Powell - 2006-11-24 default namespace = "http://djpowell.net/schemas/treetriples/1/" # Common attributes start = rdf ## Root rdf element contains a list of triples and declarations. rdf = element rdf { s* & d* & dstmt? } ## A triple is declared by creating an 's' element for the triple's ## subject, and nesting 'p' and 'o' elements inside for the predicate ## and object of the triple. Multiple 'p' and 'o' elements can be ## nested, effectively abbreviating the common case of many statements ## with duplicate subjects, or subject/predicate pairs. ## Triples sharing the same subject MUST be represented with a single ## 's' element. s = element s { attribute id { id }, p+ } ## A predicate for the parent node's subject. Triples sharing the same ## subject and predicate MUST be represented by a single nested 's' and ## 'p' element. p = element p { attribute id { uri }, o+ } ## An object which forms a triple with the grandparent node's subject, and ## the parent node's predicate. o = element o { ## A statement id can be used to create an rdf:Statement structure ## corresponding to an asserted statement. attribute stmtId { id }?, ( (attribute id { id }, nocontent) | literal | parseXml ) } ## Literals can be typed, or have a language. For XML literals, the special ## special 'parseXml' form MUST be used. literal = ( attribute xml:lang { lang }? | attribute datatype { uri }? ), text lang = xsd:language ## ids may represent nodeIds for bnodes, or URIs for resources. id = nodeId | uri ## A nodeId is a document-scoped label for a bNode. nodeIds must ## start with the characters "_:", followed by an NCName, restricted to ## ASCII characters nodeId = xsd:Name { pattern = "_:[a-zA-Z_][a-zA-Z0-9.\-_]*" } ## An absolute RDF URI. URIs will never start with the string "_:", which ## is reserved for bNodes. ## MUST be an absolute IRI.. ## Leading and trailing spaces MUST NOT be present. uri = xsd:anyURI ## Represents an XML literal. The 'o' element and its attributes are not ## part of the content. The contained elements are expected to follow the ## same rules as RDF/XML XML literals. parseXml = attribute parse { string "xml" }, (text|anyElement)* anyElement = element * { (attribute * { text } | text | anyElement)* } nocontent = string "" ## Declarations provide a sane way of declaring lists, containers, ## and un-asserted, reified statements. d = element d { parseList | parseContainer } ## Only one un-asserted reified statement block is allowed, but it can ## contain many statements. dstmt = element d { parseStatement } ## Represents an RDF collection. The 'id' of the collection may be represented ## by a 'listId' attribute on the first member 'o' element. ## empty collections are supported. parseList = attribute parse { string "list" }, collectedo* ## Represents an RDF container. The URI represents the container type, which ## is assumed to be a subtype of rdfs:Container. The attribute value: ## container indicates that none of the explicit types are stated. ## empty containers must use SPO syntax. parseContainer = attribute parse { string "seq" | string "alt" | string "bag" | string "container" }, attribute id { id }, containedo+ ## Represents un-asserted, reified statements. parseStatement = attribute parse { string "statement" }, s+ ## NOTE there is no special support for reified containers, collections, or statements. ## Objects in containers can't contain a stmtId. containedo = element o { ( (attribute id { id }, nocontent) | literal | parseXml ) } ## Objects in collections can't contain a stmtId, but can contain a listId to ## allow the list nodes themselves to be referenced. collectedo = element o { attribute listId { id }?, ( (attribute id { id }, nocontent) | literal | parseXml ) }