-
Notifications
You must be signed in to change notification settings - Fork 4
NeXML Elements
The following document exhaustively covers the NeXML elements. The coverage is purely technical and I have linked to the appropriate schema definitions from the NeXML site for completeness. A knowledge of the XML Schema Definition( XSD ) is unnecessary to read the document. A discussion on the schema design can be found here: NeXML schema discussion. Note that this documentation is not final yet.
The root element of NeXML is called nexml
. This element is an instance of the Nexml class.
Attributes:
-
version
- a decimal number indicating the nexml schema version. At present this value is 0.9. -
generator
- an optional attribute of type string, which is used to identify the program that generated the file.
- the xml namespace prefix that identifies xml schema semantics that might be inlined in the file. By convention this is of the format
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
so that parts of schema language used inside nexml (e.g. where a concrete subclass must be specified) are identified by thexsi
prefix. - the nexml namespace prefix, by convention of the format
xmlns:nex="http://www.nexml.org/1.0"
, so that locations where nexml specific types are referenced (e.g. data type subclasses) these are identified by theirnex
prefix. - the default namespace,
xmlns="http://www.nexml.org/1.0"
, which is necessary for namespace aware processors (such as the NeXML-to-CDAO xslt stylesheet produced by an EvoInfo subgroup at the Spring 2009 hackathon). - the xml namespace prefix, required to be of the format
xmlns:xml="http://www.w3.org/XML/1998/namespace
". This may be used, for example, to specify the base address of the document (using the xml:base attribute).
xsi:schemaLocation="http://www.nexml.org/1.0 http://www.nexml.org/1.0/nexml.xsd"
. Notice that this attribute is a schema language snippet (identified by the xsi:prefix) that identifies a namespace http://www.nexml.org/1.0) and associates it with a physical schema location (http://www.nexml.org/1.0/nexml.xsd).
An example of root element would be:
<xml> <?xml version="1.0" encoding="ISO-8859-1"?> <nex:nexml version="0.9&#10;" generator="eclipse&#10;" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&#10;" xmlns:xml="http://www.w3.org/XML/1998/namespace&#10;" xmlns:nex="http://www.nexml.org/1.0&#10;" xmlns="http://www.nexml.org/1.0&#10;" xsi:schemaLocation="http://www.nexml.org/1.0 http://www.nexml.org/1.0/nexml.xsd"> </nex:nexml> </xml>The root element can contain:
- zero or more semantic annotations
- one or more OTUs elements
- zero or more characters elements
- zero or more trees elements (in mixed order with characters elements).
OTUS means Organizational Taxonomic Units. The otus
element defines a collection of taxon. An otus
is an instance of the Taxa class.
Attributes:
-
id
- a file level unique id. -
label
- a human readable description of the otus.
otus
element can take:
-
otu
- zero or more. -
meta
- zero or more.
An otu
element defines a taxon. An otu
is an instance of the Taxon class.
Attributes:
-
id
- a file level unique id -
label
- a human readable -
class
- takes the id of aclass
element. This attribute is optional.
otu
element can take:
-
meta
- zero or more.
<xml> <otus id="taxa1" label="Primary taxa block"> <otu id="t1" label="Homo sapiens"/> <otu id="t2" label="Pan paniscus"/> <otu id="t3" label="Pan troglodytes"/> <otu id="t4" label="Gorilla gorilla"/> <otu id="t5" label="Pongo pygmaeus"/> </otus> </xml>
A set is defined in NeXML with a class
element. A class
is an instance of the Class class.
Attributes:
-
id
- a file level unique id -
label
- a human readable description of the class. A label is optional.
Trees in NeXML are described following the GraphML syntax. Nodes and edges of a tree are defined using the node
and edge
element respectively. In NeXML acyclic trees are defined with the tree
tag while cyclic trees or networks are defined with the network
tag, so that in a network indegree of a node can be more than one. A trees
element is a conatainer for both tree
and network
.
Attribute:
-
id
- a file level unique id. -
otus
- takes the id of an otus element defined previously. -
label
- a human readable description of the trees. A label is optional.
trees
element is of the [http://nexml.org/nexml/html/doc/schema-1/trees/trees/#Trees Trees]
concrete type.
A trees element can have:
- one or more
tree
- one or more
network
( in mixed order withtree
)
Phylogenetic trees are defined in NeXML with the tree
tag. Two types of tree can be defined: IntTree and FloatTree. While an IntTree can only have integer edge length a FloatTree has an IEEE 754-1985 compliant floating point number for its edge length.
Attributes:
-
id
- a file level unique id -
xsi:type
- defines the type of thetree
. It can be eitherIntTree
or aFloatTree
-
label
- a human readable description of the tree. A label is optional.
tree
must contain the following in the same order:
- one or more
node
- zero or one
rootedge
and - one or more
edge
Phylogenetic networks are defined with the network
tag.
Attributes:
-
id
- a file level unique id -
xsi:type
- defines the type of thenetwork
. It can take any of the two values:IntNetwork
,FloatNetwork
-
label
- a human readable description of the tree. A label is optional.
A network is modeled by the AbstractNetwork class and two concrete implementations exist:
Atree
must contain the following in the same order:
- one or more
node
- one or more
edge
A node
tag defines a node of a tree or a network.
Attributes:
-
id
- a file level unique id. -
otu
- id of a previously defined otu element. This is optional. -
root
- takestrue
if the node is a root node,false
otherwise.
Nodes have the following hierarchy:
An edge
tag defines an edge in a tree or a network.
Attributes:
-
id
- a file level unique id -
source
- id of the node to be served as the source -
target
- id of the node to server as the target -
length
- length of the edge
A rootedge
tag is used to indicate a time span leading up to the root( principally for coalescent trees ).
Attributes:
-
id
- a file level unique id -
target
- id of the root node -
length
- length of the edge
<xml> <trees otus="taxa1" id="Trees" label="TreesBlockFromXML"> <tree id="tree1" xsi:type="nex:FloatTree" label="tree1"> <node id="n1" label="n1" root="true"/> <node id="n2" label="n2" otu="t1"/> <node id="n3" label="n3"/> <node id="n4" label="n4"/> <node id="n5" label="n5" otu="t3"/> <node id="n6" label="n6" otu="t2"/> <node id="n7" label="n7"/> <node id="n8" label="n8" otu="t5"/> <node id="n9" label="n9" otu="t4"/> <rootedge target="n1" id="re1" length="0.34765" /> <edge source="n1" target="n3" id="e1" length="0.34534"/> <edge source="n1" target="n2" id="e2" length="0.4353"/> <edge source="n3" target="n4" id="e3" length="0.324"/> <edge source="n3" target="n7" id="e4" length="0.3247"/> <edge source="n4" target="n5" id="e5" length="0.234"/> <edge source="n4" target="n6" id="e6" length="0.3243"/> <edge source="n7" target="n8" id="e7" length="0.32443"/> <edge source="n7" target="n9" id="e8" length="0.2342"/> </tree> <tree id="tree2" xsi:type="nex:IntTree" label="tree2"> <node id="n1" label="n1"/> <node id="n2" label="n2" otu="t1"/> <node id="n3" label="n3"/> <node id="n4" label="n4"/> <node id="n5" label="n5" otu="t3"/> <node id="n6" label="n6" otu="t2"/> <node id="n7" label="n7"/> <node id="n8" label="n8" otu="t5"/> <node id="n9" label="n9" otu="t4"/> <edge source="n1" target="n3" id="e1" length="1"/> <edge source="n1" target="n2" id="e2" length="2"/> <edge source="n3" target="n4" id="e3" length="3"/> <edge source="n3" target="n7" id="e4" length="1"/> <edge source="n4" target="n5" id="e5" length="2"/> <edge source="n4" target="n6" id="e6" length="1"/> <edge source="n7" target="n8" id="e7" length="1"/> <edge source="n7" target="n9" id="e8" length="1"/> </tree> <network id="tree3" xsi:type="nex:IntNetwork" label="tree3"> <node id="n1" label="n1"/> <node id="n2" label="n2" otu="t1"/> <node id="n3" label="n3"/> <node id="n4" label="n4"/> <node id="n5" label="n5" otu="t3"/> <node id="n6" label="n6" otu="t2"/> <node id="n7" label="n7"/> <node id="n8" label="n8" otu="t5"/> <node id="n9" label="n9" otu="t4"/> <edge source="n1" target="n3" id="e1" length="1"/> <edge source="n1" target="n2" id="e2" length="2"/> <edge source="n3" target="n4" id="e3" length="3"/> <edge source="n3" target="n7" id="e4" length="1"/> <edge source="n4" target="n5" id="e5" length="2"/> <edge source="n4" target="n6" id="e6" length="1"/> <edge source="n7" target="n6" id="e7" length="1"/> <edge source="n7" target="n8" id="e7" length="1"/> <edge source="n7" target="n9" id="e8" length="1"/> </network> </trees> </xml>
The characters
element defines comparative data. NeXML dictates that the allowed parameter space for the observations be declared with a format
element and the actual observation with the matrix
element; both nested within the characters
element. Two broad observation categories are allowed: raw character sequences and granular character state observations. Under both these categories NeXML provides means of describing observed DNA, RNA, Protein, Restriction, Standard, and Conitnuous data.
Attributes:
-
id
- a file level unique id. -
otus
- takes the id of an otus element defined previously. -
xsi:type
- can be one of the following:DnaSeqs
,DnaCells
,RnaSeqs
,RnaCells
,RestrictionSeqs
,RestrictionCells
,StandardSeqs
,StandardCells
,ContinuousSeqs
,ContinuousCells
. -
label
- a human readable description of the character block. A label is optional
characters
hierarchy with the following subtypes:
- AbstractSeqs - superclass for character blocks that consist of raw character sequences
- AbstractCells - superclass for character blocks that consist of granular character state observations
characters
block must have:
-
format
- one and only one for each concrete type. -
matrix
- one and only one for each concrete type.
The format
element defines the the allowed characters and states in a matrix, and their ambiguity mapping. Within format
is enclosed states
and char
definition.
Attributes: none.
format
is modeled by the AbstractFormat type with the following concrete types:
format
element can have:
-
states
- one or more for each concrete type exceptContinuousFormat
. A Continuous type is stateless. -
char
- one or more for each concrete type.
states
is a container for defined states and their mappings.
Attributes:
-
id
- a file level unique id -
label
- a human readable description. This attribute is optional.
states
can take up one of the following concrete implementations based on the type of format
The type of states
depends on the type of its parent format
. Continuous data is stateless, hence there is no states
type corresponding to it. Restriction data implies only two states: presence( 1 ) or absence( 0 ). Naturally, two( and only two ) state
are defined for the RestrictionStates
type. All other types may have zero or more state
defined for them.
A states
can have:
state
uncertain_state_set
polymorphic_state_set
elements.
state
defines a possible observation state with its symbol
attribute.
Attributes:
-
id
- a file level unique id -
symbol
- a simple type that restricts from AbstractSymbol -
label
- a human readable description. Alabel
is optional.
state
is of the AbstractState type. A state
can be of the following kind depending on the type of the parent states
element:
-
AAState - takes a AAToken for
symbol
-
DNAState - takes a DNAToken for
symbol
-
RNAState - takes a RNAToken for
symbol
-
RestrictionState - takes a RestrictionToken for
symbol
-
StandardState - takes a StandardToken for
symbol
polymorphic_state_set
resolves ambiguous states in an "and" context. To define the possible ambiguities polymorphic_state_set
nests zero or more member
element.
Attributes: same as state
.
uncertain_state_set
resolves ambiguous states in a "or" context. To define the possible ambiguities uncertain_state_set
nests zero or more member
element.
Attributes: same as state
.
A char
specifies which states
apply to which matrix columns. A char
is of the AbstractChar type.
Attributes: With the type of the char in place, a char can take one or more of the following attributes:
-
id
- a file level unique id is a must for all the char elements -
states
- the value being the id of a pre defined states element. Except theContinuousChar
type all chars take a states attribute. -
codon
- specify the codon position. DnaChar and RnaChar optionally take the codon attribute.
format
element, a char
can be an instance of the following type:
A matrix
element holds the state observations.
Attributes: none
A matrix
can be one of twelve possible concrete types, six each sub classed under two abstract types:
- AbstractSeqMatrix - contains row which hold raw character sequences
- AbstractObsMatrix - contains rows which hold granular state observations
matrix
must have:
-
row
- one or more.
The row
element defines a single row of a matrix
.
Attributes:
-
id
- a file level unique id. -
label
- a human readable description of the row. A label is optional. -
otu
- takes the id of an otu defined previously.
row
element has the following class hierarchy:
A row
element takes:
-
seq
- one and only one for each concrete subtype of AbstractSeqRow -
cell
- one or more for each concrete subtype of AbstractObsRow
seq
defines a raw character sequence. NeXML allows for six kind of sequences.
seq
have the following hierarchy:
A cell
defines granular observation.
Attributes:
-
state
- id of astate
element defined previously. -
char
- id of achar
element defined previously.
cell
have the following hierarchy:
<xml> <characters otus="taxa1" id="standardchars6" xsi:type="nex:StandardSeqs" label="Standard sequences"> <format> <states id="standardstateset1"> <state id="standardstates1" symbol="1"/> <state id="standardstates2" symbol="2"/> <state id="standardstates3" symbol="3"/> <polymorphic_state_set symbol="4" id="standardstates4"> <member state="standardstates1"/> <member state="standardstates2"/> </polymorphic_state_set> <uncertain_state_set symbol="5" id="standardstates5"> <member state="standardstates3"/> <member state="standardstates1"/> </uncertain_state_set> </states> <char states="standardstateset1" id="standardc1"/> <char states="standardstateset1" id="standardc2"/> </format> <matrix> <row id="standardr1" otu="t1"> <seq>1 2</seq> </row> <row id="standardr2" otu="t2"> <seq>2 2</seq> </row> <row id="standardr3" otu="t3"> <seq>3 4</seq> </row> <row id="standardr4" otu="t4"> <seq>2 3</seq> </row> <row id="standardr5" otu="t5"> <seq>4 1</seq> </row> </matrix> </characters> </xml>
<xml> <characters otus="taxa1" id="m3" xsi:type="nex:ContinuousCells" label="Continuous characters"> <format> <char id="ContinuousCharacter1" label="this is character 1"/> <char id="ContinuousCharacter2"/> <char id="ContinuousCharacter3"/> <char id="ContinuousCharacter4"/> <char id="ContinuousCharacter5"/> </format> <matrix> <row id="ContinuousCellsRow1" otu="t1"> <cell char="ContinuousCharacter1" state="-1.545414144070023"/> <cell char="ContinuousCharacter2" state="-2.3905621575431044"/> <cell char="ContinuousCharacter3" state="-2.9610221833467265"/> <cell char="ContinuousCharacter4" state="0.7868662069161243"/> <cell char="ContinuousCharacter5" state="0.22968509237534918"/> </row> <row id="ContinuousCellsRow2" otu="t2"> <cell char="ContinuousCharacter1" state="-1.6259836379710066"/> <cell char="ContinuousCharacter2" state="3.649352410850134"/> <cell char="ContinuousCharacter3" state="1.778885099660406"/> <cell char="ContinuousCharacter4" state="-1.2580877968480846"/> <cell char="ContinuousCharacter5" state="0.22335354995610862"/> </row> <row id="ContinuousCellsRow3" otu="t3"> <cell char="ContinuousCharacter1" state="-1.5798979984134964"/> <cell char="ContinuousCharacter2" state="2.9548251411133157"/> <cell char="ContinuousCharacter3" state="1.522005675256233"/> <cell char="ContinuousCharacter4" state="-0.8642016921755289"/> <cell char="ContinuousCharacter5" state="-0.938129801832388"/> </row> <row id="ContinuousCellsRow4" otu="t4"> <cell char="ContinuousCharacter1" state="2.7436692306788086"/> <cell char="ContinuousCharacter2" state="-0.7151148143399818"/> <cell char="ContinuousCharacter3" state="4.592207937774776"/> <cell char="ContinuousCharacter4" state="-0.6898841440534845"/> <cell char="ContinuousCharacter5" state="0.5769509574453064"/> </row> <row id="ContinuousCellsRow5" otu="t5"> <cell char="ContinuousCharacter1" state="3.1060827493657683"/> <cell char="ContinuousCharacter2" state="-1.0453787389160105"/> <cell char="ContinuousCharacter3" state="2.67416332763427"/> <cell char="ContinuousCharacter4" state="-1.4045634106692808"/> <cell char="ContinuousCharacter5" state="0.019890469925520196"/> </row> </matrix> </characters> </xml>
<xml> <characters otus="taxa1" id="characters3" xsi:type="nex:DnaSeqs" label="DNA sequences"> <format> <states id="IUPACDNAStateSet1"> <state id="NucA" symbol="A" /> <state id="NucC" symbol="C" /> <state id="NucG" symbol="G" /> <state id="NucT" symbol="T" /> <uncertain_state_set id="SymK" symbol="K"> <member state="NucG" /> <member state="NucT" /> </uncertain_state_set> <uncertain_state_set id="SymM" symbol="M"> <member state="NucA" /> <member state="NucC" /> </uncertain_state_set> <uncertain_state_set id="SymR" symbol="R"> <member state="NucA" /> <member state="NucG" /> </uncertain_state_set> <uncertain_state_set id="SymS" symbol="S"> <member state="NucC" /> <member state="NucG" /> </uncertain_state_set> <uncertain_state_set id="SymW" symbol="W"> <member state="NucA" /> <member state="NucT" /> </uncertain_state_set> <uncertain_state_set id="SymY" symbol="Y"> <member state="NucC" /> <member state="NucT" /> </uncertain_state_set> <uncertain_state_set id="SymB" symbol="B"> <member state="NucC" /> <member state="NucG" /> <member state="NucT" /> </uncertain_state_set> <uncertain_state_set id="SymD" symbol="D"> <member state="NucA" /> <member state="NucG" /> <member state="NucT" /> </uncertain_state_set> <uncertain_state_set id="SymH" symbol="H"> <member state="NucA" /> <member state="NucC" /> <member state="NucT" /> </uncertain_state_set> <uncertain_state_set id="SymV" symbol="V"> <member state="NucA" /> <member state="NucC" /> <member state="NucG" /> </uncertain_state_set> <uncertain_state_set id="SymN" symbol="N"> <member state="NucA" /> <member state="NucC" /> <member state="NucG" /> <member state="NucT" /> </uncertain_state_set> <uncertain_state_set id="SymX" symbol="X"> <member state="NucA" /> <member state="NucC" /> <member state="NucG" /> <member state="NucT" /> </uncertain_state_set> <uncertain_state_set id="SymGap" symbol="-" /> <uncertain_state_set id="SymMiss" symbol="?"> <member state="NucA" /> <member state="NucC" /> <member state="NucG" /> <member state="NucT" /> <member state="SymK" /> <member state="SymM" /> <member state="SymR" /> <member state="SymS" /> <member state="SymW" /> <member state="SymY" /> <member state="SymB" /> <member state="SymD" /> <member state="SymH" /> <member state="SymV" /> <member state="SymN" /> <member state="SymX" /> <member state="SymGap" /> </uncertain_state_set> </states> <char id="ResidueCol1" states="IUPACDNAStateSet1" codon="2" /> <char id="ResidueCol2" states="IUPACDNAStateSet1" /> <char id="ResidueCol3" states="IUPACDNAStateSet1" /> <char id="ResidueCol4" states="IUPACDNAStateSet1" /> <char id="ResidueCol5" states="IUPACDNAStateSet1" /> <char id="ResidueCol6" states="IUPACDNAStateSet1" /> <char id="ResidueCol7" states="IUPACDNAStateSet1" /> <char id="ResidueCol8" states="IUPACDNAStateSet1" /> <char id="ResidueCol9" states="IUPACDNAStateSet1" /> <char id="ResidueCol10" states="IUPACDNAStateSet1" /> <char id="ResidueCol11" states="IUPACDNAStateSet1" /> <char id="ResidueCol12" states="IUPACDNAStateSet1" /> <char id="ResidueCol13" states="IUPACDNAStateSet1" /> <char id="ResidueCol14" states="IUPACDNAStateSet1" /> <char id="ResidueCol15" states="IUPACDNAStateSet1" /> <char id="ResidueCol16" states="IUPACDNAStateSet1" /> </format> <matrix> <row otu="t1" id="DNASequence1"><seq>A C G C T C G C A T C G C A T C</seq></row> <row otu="t2" id="DNASequence2"><seq>A C G C T C G C A T C G C A T C</seq></row> <row otu="t3" id="DNASequence3"><seq>A C G C T C G C A T C G C A T C</seq></row> </matrix> </characters> </xml>
Fundamental data objects in NeXML can be annotated using RDFa. This way, the annotationsare directly available to any off-the-shelf RDFa parser but are also simple to integrate into non- RDF-aware processing libraries. The annotations are expressed using recursively nested meta elements, and are essentially triples whose subjects are identified by the about attribute. To specify that a NeXML element such as a tree is the subject, the about attribute and the id attribute of the element must match. This way, core NeXML elements can be converted to RDF (for example by using an XSL stylesheet), RDFa annotations can be extracted from the NeXML (using another stylesheet), and the two resulting graphs can be aligned by the subjects of their respective triples.
- If the triple’s object value is a literal such as a string or a number, the exact data type is specified by the datatype attribute; these types are typically core XML schema types such as xsd:string for atomic types, or rdf:Literal for nested XML element structures that are to be parsed as opaque literals in an RDF graph. The object value is enclosed inside the meta element and the predicate is specified using the property attribute (whose value must be a CURIE). meta elements of this type are of the subclass nex:LiteralMeta.
- If the triple’s object value is a remote resource, its location is specified using the href attribute. The predicate for this class of triples is specified as a CURIE using the rel attribute. meta elements of this type are of the subclass nex:ResourceMeta.
- If the triple’s object value is a nested annotation, its predicate is specified as a CURIE using the rel attribute. Since this enclosing meta element is to be transformed into an anonymous RDF node, it needs to be identified as the subject of a reification by assigning it an about attribute (as per the RFa rules for identifying triple subjects).
<xml> <tree id="foo1" about="foo1" xmlns:eg="http://example.org/terms#" xmlns:foo=”http://foo.org”> <meta property="eg:hasLiteralTerm" xsi:type="nex:LiteralMeta" datatype="xsd:string">My Literal value</meta> <meta property="eg:hasLiteralXml" xsi:type="nex:LiteralMeta" datatype="rdf:Literal"><foo:bar/></meta> <meta rel="eg:hasReference" href="http://example.org" xsi:type="nex:ResourceMeta"/> <meta rel="eg:hasNestedAnnotations" xsi:type="nex:ResourceMeta" id=”meta1” about=”meta1”> <meta property="eg:hasLiteralTerm" xsi:type="nex:LiteralMeta" datatype="xsd:string">My Nested Literal Value</meta> </meta> </tree> </xml>