// two kinds of primary nodes: term and gene_product
Term (
	id		INTEGER PRIMARY KEY,
	name		VARCHAR,
	term_type	VARCHAR,
	definition	VARCHAR
);

Gene_product (
	id		INTEGER PRIMARY KEY,
	name		VARCHAR,
	species_id	INTEGER REFERENCES SEPECIES(ID)
);

// species table is used to show many-to-one relationship.
Species (
	id		INTEGER PRIMARY KEY,
	lineage		VARCHAR,
	genus		VARCHAR,
	species		VARCHAR
);

// gene_product_properties is another kind of property table. The property is already
// stored in name-value pair.
Gene_product_properties (
	gene_product_id	INTEGER REFERENCES gene_product (id),
	property_name	VARCHAR,
	property_value	VARCHAR
);

// one-to-many relationship
Gene_product_synonyms (
	gene_product_id	INTEGER REFERENCES gene_product (id),
	synonym		VARCHAR
);

// analogous to complex data. A family has one or more members.
// column gene_product_id refers to member’s id.
Gene_product_family (
	gene_product_family_name	VARCHAR,
	gene_product_id		INTEGER REFERENCES gene_product (id),
	putative			BOOLEAN  // it is a property on the member
);

// edge table
Term2term (
	term1_id		INTEGER REFERENCES term (id),
	term2_id		INTEGER REFERENCES term (id),
	label			VARCHAR
);

// another edge table
Term2GeneProduct (
	term_id		INTEGER REFERENCES term (id),
	gene_product_id	INTEGER REFERENCES gene_product (id)
);