NWB File Format
Revision History
 	Version	Description	Author(s)	
Sept 13th, 2006 	V0.1	The first draft	NWB team	
Oct. 22nd, 2006	V0.2	Added a few details	Weixia (Bonnie) Huang	
Apr. 9th, 2007	V0.3	Major refine this file format spec	Russell Duhon, 
Weixia (Bonnie) Huang	
Apr. 12th, 2007	V0.4	Include inputs from Shashi and Soma	Shashikant Penumarthy
Soma Sanyal
Weixia (Bonnie) Huang	
Apr 16th, 2007	V0.5	Include inputs from Katy, Bruce and Bonnie	Katy, Bruce
Weixia (Bonnie) Huang	
May 18th, 2007 	V0.6	Simplify the nwb format based on the discussion with Alex.	Alex Vespignani
Weixia (Bonnie) Huang	
Legend
# comments
* new section or null/unknown value or delimiter between the attribute name and the data type
() optional

Preserved Key Words (case sensitive)
•	*
•	*Nodes
•	*DirectedEdges
•	*UndirectedEdges
•	id
•	source
•	target
•	weight
•	*int
•	*string
•	*float
NWB File Format 
From now on, there’s only one NWB format as follows:
# Comments
*Nodes	(total numbers of nodes)
id*int	label*string 	(nodeAttribute1*data_type)		(nodeAttribute2*data_type)	... 
...

*DirectedEdges	(total numbers of edges)
source*int	target*int	(edgeAttribute1*data_type)		(edgeAttribute2*data_type)
...

*UndirectedEdges	(total numbers of edges) 
source*int	target*int	((edgeAttribute1*data_type)		(edgeAttribute2*data_type)
...
example1.nwb
# This is a paper-author network. 
# Author labels are author names.
# Paper labels are titles.
# Paper weights indicate # citations.

*Nodes	4
id*int	label*string		weight*int	node_type*string	
  1 	"Joe Ann"		0		“author”
  2 	"John Smith"		0		“author”
  3	"Bio Today"		8		“paper”
  4	"Physics Tomorrow"	15	 	“paper”
*DirectedEdges	2
source*int	target*int	weight*float	edge_type*string
  1		3		0.66	 	“wrote”
  4		3		0.78		“paper-citation”

Detailed Specification
1.	There are three types of section headers and they are case sensitive:
•	*Nodes
•	*DirectedEdges
•	*UndirectedEdges
2.	There are three data types, string, integer, and floating point. 
3.	The*Nodes section header MUST NOT be omitted in the NWB file. The “total numbers of nodes” after *Nodes is optional, and should be separated only by arbitrary number of spaces and/or tabs.
4.	The list of nodes under the section of *Nodes MUST NOT be omitted and MUST provide a complete list including the node id and node label. The data type of node ids must be integer and the value must be bigger than 0; in another word, the minimum node id is 1). The data type of node labels must be string.
5.	One of *DirectedEdges section or *UndirectedEdges section is required. If desired, both may be used, but at least one must be. A graph with non-empty *DirectedEdges and *UndirectedEdges sections is a hybrid graph. “Total numbers of edges” is optional after *DirectedEdges or *UndirectEededges, and should be separated only by arbitrary number of spaces and/or tabs.
6.	All edges must be listed, none are inferred.
7.	All string values (not including the attribute names) must be surrounded by double quotation marks. " can not exist in the middle of a string surrounded by double quotation marks.
8.	* is a preserved key character. 
•	It is a pre-fix of node or edge section headers. 
•	It is used as a delimiter between an attribute name and the corresponding data type. 
•	It also represents any null/unknown value. 
•	* in strings surrounded by double quotation marks should be treated as a regular character.
9.	All integers must be represented by a positive or negative number with no decimal.
10.	All floating point numbers must include a decimal. -1.23e5 is acceptable notation, as are values such as 102.5
11.	id, source and target MUST be integers. label MUST be strings.
12.	Arbitrary number of spaces and/or tabs can exist between two columns. 
13.	After each section header, the meaning of each column MUST be specified in the next line with the format of attribute_name*data_type. Any comment line or empty is not allowed between the line of section header and the attribute line.
14.	Attribute names CANNOT contain spaces and/or * in the middle and cannot be quoted. The values of data_type can ONLY be int, string, and float. attribute_name*data_type MUST be lower case.
Example2.nwb
*Nodes	4
id*int	label*string		weight*float	node_type*string
	1	"Joe Ann"		0.66		“author”
	2	"John Smith"		0		“author”
  	3	"Bio Today"		0.78		“paper”
 		4	"Physics Tomorrow" 	1.0		“paper”

	*DirectedEdges 3
           source*int		target*int	weight*int	edge_type*string
	1		3		1		“wrote”
 		4		3		15		“paper-citation”
         2		3		1	 	“wrote”
15.	All null/unknown values (data type could be string, or integer or floating point) are always represented by *. An empty string is “” (two double quotations marks)
16.	Each comment line must start with # and comment lines must start from the beginning of a line and can not append to any node/edge section headers, attribute lines or node/edge lists.
Example3.nwb
*Nodes	4
id*int	label*string		weight*int	node_type*string
#the following node has an unknown string value.
  1	*			0		“author”		
  2	"John Smith"		0		“author”
  3	"Bio Today"		8		“paper”
#the following node has an unknown integer value.
  4	"Physics Tomorrow"	*		“paper”
	*DirectedEdges	3
            source*int		target*int	weight*float	edge_type*string
	1		3		0.66		“wrote”
 		4		3		0.78		“paper-citation”
         2		3		1.0		“wrote”
17.	Separate node and edge attribute sections will continue to NOT be supported.