03 September 2009

Building a naive Interactome Database with Hibernate.

This is my notebook for building a naive database of protein-protein interactions with Hibernate (a java object/relational persistence and query service).

Files and Directories


./project
./project/lib
./project/src
./project/src/hibernate.cfg.xml
./project/src/org
./project/src/org/lindenb
./project/src/org/lindenb/hbn01
./project/src/org/lindenb/hbn01/Journal.java
./project/src/org/lindenb/hbn01/mapping.hbm.xml
./project/src/org/lindenb/hbn01/Article.java
./project/src/org/lindenb/hbn01/Main.java
./project/src/org/lindenb/hbn01/PMID.java
./project/src/org/lindenb/hbn01/Interactor.java
./project/src/org/lindenb/hbn01/Complex.java
./project/src/org/lindenb/hbn01/Protein.java
./project/src/org/lindenb/hbn01/PMIDType.java
./project/src/log4j.properties
./project/build
./project/bin
./derby.log
./build
./build/db
./Makefile

The components / Java Classes


Interactor


An abstract class defining a protein or a complex: Just a name and an ID.
package org.lindenb.hbn01;

public class Interactor
implements java.io.Serializable
{
private Long id;
private String name;
protected Interactor()
{
}

protected Interactor(String name)
{
setName(name);
}

private void setId(Long id)
{
this.id=id;
}

public Long getId()
{
return this.id;
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name=name;
}

@Override
public boolean equals(Object o)
{
if(o==this) return true;
if(o==null || o.getClass()!=getClass()) return false;
return getId().equals(Interactor.class.cast(o).getId());
}

@Override
public String toString()
{
return getClass().getName()+":"+getName()+"("+getId()+")";
}
}

Protein

Protein is a concrete subclass of Interactor. This could be an Unigene entry.
package org.lindenb.hbn01;

public class Protein
extends Interactor
{
public Protein()
{
}

public Protein(String name)
{
super(name);
}

@Override
public String toString()
{
return "Protein:"+getName();
}
}

Complex

Complex is a concrete subclass of Interactor. It is a Set of Interactors. It also contains a Set of Articles holding the references for those interactions.
package org.lindenb.hbn01;
import java.util.*;

public class Complex
extends Interactor
{
private Set<Interactor> partners= new HashSet<Interactor>();
private Set<Article> articles= new HashSet<Article>();
public Complex()
{
}

public Complex(String name)
{
super(name);
}

public Set<Interactor> getPartners()
{
return this.partners;
}
public void setPartners(Set<Interactor> partners)
{
this.partners = partners;
}
public Set<Article> getArticles()
{
return this.articles;
}

public void setArticles(Set<Article> articles)
{
this.articles = articles;
}
@Override
public String toString()
{
String s="Complex:"+getName()+". ID:"+getId()+" interacts with";
for(Interactor i: getPartners())
{
s+=" "+i.getName();
}
return s;
}
}

Article

an Article is a reference to a paper in Pubmed. I wanted to use the custom dataType in hibernate, so I used the class PMID rather than an Integer. Each Article is linked to a Journal.
package org.lindenb.hbn01;

public class Article
implements java.io.Serializable
{
private PMID pmid;
private String title;
private Integer year;
private String doi;
private Journal journal;

public Article()
{
}

public Article(PMID pmid,Journal journal,Integer year,String title)
{
setPmid(pmid);
setJournal(journal);
setYear(year);
setTitle(title);
}

public Journal getJournal()
{
return journal;
}

public String getDoi()
{
return this.doi;
}

public void setDoi(String doi)
{
this.doi=doi;
}

public void setJournal(Journal journal)
{
this.journal=journal;
}

private void setPmid(PMID pmid)
{
this.pmid=pmid;
}
public PMID getPmid()
{
return this.pmid;
}
public void setTitle(String title)
{
this.title=title;
}
public String getTitle()
{
return this.title;
}
public void setYear(Integer year)
{
this.year=year;
}
public Integer getYear()
{
return this.year;
}

public String toString()
{
return "("+getYear()+")\""+getTitle()+"\"."+getJournal().getTitle();
}
}

PMID

A custom type holding a Pubmed identifier
package org.lindenb.hbn01;
import org.hibernate.*;
import java.io.Serializable;

public class PMID
implements java.io.Serializable
{
private long pmid;

public PMID(String pmid)
{
this(new Long(pmid));
}

public PMID(long pmid)
{
this.pmid=pmid;
}

public long value()
{
return this.pmid;
}

public int hashCode()
{
return 31+(int)this.pmid;
}

public boolean equals(Object o)
{
if(o==this) return true;
if(o==null || !(o instanceof PMID)) return false;
return PMID.class.cast(o).pmid==this.pmid;
}

public String toString()
{
return String.valueOf(this.pmid);
}
}

Journal

A Journal is a NLM-Id and a title
package org.lindenb.hbn01;

public class Journal
implements java.io.Serializable
{
private long nlmId;
private String title;


public Journal()
{
}

public Journal(long nlmId,String title)
{
setNlmId(nlmId);
setTitle(title);
}

private void setNlmId(long nlmId)
{
this.nlmId=nlmId;
}
public Long getNlmId()
{
return this.nlmId;
}
public void setTitle(String title)
{
this.title=title;
}
public String getTitle()
{
return this.title;
}

public String toString()
{
return getTitle()+"["+getNlmId()+"]";
}
}

Using a Custom Type

PMIDType implements EnhancedUserType. Hibernate will use this class to manage the class PMID (how to read/write it from/to the database).
package org.lindenb.hbn01;
import org.hibernate.*;
import org.hibernate.usertype.EnhancedUserType;
import java.sql.*;
import java.io.Serializable;

public class PMIDType
implements EnhancedUserType
{


public int[] sqlTypes() {
return new int[]{Types.INTEGER};
}


public Object assemble(Serializable cached,
Object owner)
throws HibernateException
{
return cached;
}

public Serializable disassemble(Object value)
throws HibernateException
{
return Serializable.class.cast(value);
}

public boolean isMutable() { return false;}
public Object deepCopy(Object value)
{
return value;
}
public boolean equals(Object a, Object b)
{
return a==null?b==null:a.equals(b);
}

public int hashCode(Object x) throws HibernateException
{
return x==null?0:x.hashCode();
}

public Object nullSafeGet(ResultSet rs,
String[] names,
Object owner)
throws HibernateException,
SQLException
{
Object o = rs.getObject( names[0] );
if(rs.wasNull()) return null;
if(o instanceof Number)
{
return new PMID(Number.class.cast(o).longValue());
}
else if(o instanceof String)
{
return new PMID(String.class.cast(o));
}
throw new IllegalArgumentException("Bad class "+o.getClass());
}

public void nullSafeSet(PreparedStatement st,
Object value,
int index)
throws HibernateException, SQLException
{
if(value==null)
{
st.setNull( index, Types.INTEGER );
}
else
{
st.setLong(index,PMID.class.cast(value).value());
}
}


public Object replace(Object original,
Object target,
Object owner)
throws HibernateException
{
return original;
}

public Class<?> returnedClass()
{
return PMID.class;
}


public Object fromXMLString(String xmlValue)
{
return xmlValue==null? null: new PMID(new Long(xmlValue));
}
public String objectToSQLString(Object value)
{
return value==null? null: String.valueOf(PMID.class.cast(value).
value());
}
public String toXMLString(Object value)
{
return value==null? null: String.valueOf(PMID.class.cast(value).
value());
}
}

The mapping file

The file mapping.hbm.xml tells hibernate how the classes are linked to each others.
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.lindenb.hbn01" default-cascade="none" default-access="property" default-lazy="true" auto-import="true">

<class name="org.lindenb.hbn01.Article" table="Article" mutable="true" polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version">
<meta attribute="class-description" inherit="true">A pubmed Article</meta>
<id name="pmid" column="pmid" type="org.lindenb.hbn01.PMIDType">
<meta attribute="field-description" inherit="true">Pubmed Identifier</meta>
<generator class="assigned"/>
</id>
<property name="title" not-null="true" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
<property name="doi" unique="true" type="string" optimistic-lock="true" lazy="false" generated="never"/>
<property name="year" column="yearDate" type="integer" not-null="true" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
<many-to-one name="journal" column="nlmId" not-null="true" unique="false" update="true" insert="true" optimistic-lock="true" not-found="exception" embed-xml="true"/>
</class>

<class name="Journal" mutable="true" polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version">
<id name="nlmId" column="nlmId" type="long">
<generator class="assigned"/>
</id>
<property name="title" not-null="true" unique="false" optimistic-lock="true" lazy="false" generated="never"/>
</class>

<class name="Interactor" mutable="true" polymorphism="implicit" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version">
<id name="id" type="long">
<generator class="native"/>
</id>
<property name="name" not-null="true" unique="false" optimistic-lock="true" lazy="false" generated="never"/>

<joined-subclass name="Protein" dynamic-update="false" dynamic-insert="false" select-before-update="false">
<key column="interactorId" on-delete="noaction"/>
</joined-subclass>

<joined-subclass name="Complex" dynamic-update="false" dynamic-insert="false" select-before-update="false">
<key column="interactorId" on-delete="noaction"/>

<set name="partners" table="interactions" sort="unsorted" inverse="false" mutable="true" optimistic-lock="true" embed-xml="true">
<key column="complex_id" on-delete="noaction"/>
<many-to-many column="interactor_id" class="Interactor" embed-xml="true" not-found="exception" unique="false"/>
</set>

</joined-subclass>
</class>

</hibernate-mapping>

Configuring Hibernate


The file hibernate.cfg.xml describes the database we are using for persisting all the entities (driver, uri, login, password...). Here I've used JavaDB/Derby (Note: the 'unique' directive was ignored by Derby (?) ).
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

<session-factory>

<!-- Database connection settings -->
<property name="connection.driver_class">org.apache.derby.jdbc.EmbeddedDriver</property>
<property name="connection.url">jdbc:derby:build/db/derby/hibernate;create=true</property>
<property name="connection.username">sa</property>
<property name="connection.password"/>

<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>

<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.DerbyDialect</property>

<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>

<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>

<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>

<mapping resource="org/lindenb/hbn01/mapping.hbm.xml"/>

</session-factory>

</hibernate-configuration>

Running


Building a Session factory

sessionFactory = new Configuration().configure().buildSessionFactory();

Creating an Interacome

Session session= getSessionFactory().getCurrentSession();
session.beginTransaction();
Journal journal = new Journal(1L,"PNAS");
session.save(journal);
Article article= new Article(new PMID(12234),journal,1988,"Article title 1");
article.setDoi("1");
session.save(article);
article= new Article(new PMID(456789),journal,1989,"Article title 2");
article.setDoi("2");
session.save(article);


Protein prot1= new Protein("prot1");
session.save(prot1);
Protein prot2= new Protein("prot2");
session.save(prot2);
Protein prot3= new Protein("prot3");
session.save(prot3);
Complex c1= new Complex("cplx1");
c1.getPartners().add(prot1);
c1.getPartners().add(prot2);
session.save(c1);
Complex c2= new Complex("cplx2");
c2.getPartners().add(prot1);
c2.getPartners().add(c1);
c2.getArticles().add(article);
session.save(c2);

session.getTransaction().commit();

Querying

Listing the Journals
Session session= getSessionFactory().getCurrentSession();
session.beginTransaction();
List list = session.createQuery("from Journal").list();

for(Object o:list)
{
System.out.println(o);
}
session.getTransaction().commit();

Listing the Articles
Session session= getSessionFactory().getCurrentSession();
session.beginTransaction();
List list = session.createQuery("from Article").list();

for(Object o:list)
{
System.out.println(o);
}
session.getTransaction().commit();
Listing the Interactors
Session session= getSessionFactory().getCurrentSession();
session.beginTransaction();
List list = session.createQuery("from Interactor").list();

for(Object o:list)
{
System.out.println("\n\n###\t"+o+"\n\n");
}
session.getTransaction().commit();

Full code

package org.lindenb.hbn01;

import org.hibernate.*;
import org.hibernate.cfg.*;
import java.util.*;

public class Main
{
private static final SessionFactory sessionFactory;

static
{
try
{
sessionFactory = new Configuration().configure().buildSessionFactory();
}
catch(Throwable err)
{
err.printStackTrace();
throw new ExceptionInInitializerError(err);
}
}

public static SessionFactory getSessionFactory()
{
return Main.sessionFactory;
}

private void listJournals()
{
Session session= getSessionFactory().getCurrentSession();
session.beginTransaction();
List list = session.createQuery("from Journal").list();

for(Object o:list)
{
System.out.println(o);
}
session.getTransaction().commit();
}

private void listArticles()
{
Session session= getSessionFactory().getCurrentSession();
session.beginTransaction();
List list = session.createQuery("from Article").list();

for(Object o:list)
{
System.out.println(o);
}
session.getTransaction().commit();
}

private void listInteractors()
{
Session session= getSessionFactory().getCurrentSession();
session.beginTransaction();
List list = session.createQuery("from Interactor").list();

for(Object o:list)
{
System.out.println("\n\n###\t"+o+"\n\n");
}
session.getTransaction().commit();
}

public void run()
{
Session session= getSessionFactory().getCurrentSession();
session.beginTransaction();
Journal journal = new Journal(1L,"PNAS");
session.save(journal);
Article article= new Article(new PMID(12234),journal,1988,"Article title 1");
article.setDoi("1");
session.save(article);
article= new Article(new PMID(456789),journal,1989,"Article title 2");
article.setDoi("2");
session.save(article);


Protein prot1= new Protein("prot1");
session.save(prot1);
Protein prot2= new Protein("prot2");
session.save(prot2);
Protein prot3= new Protein("prot3");
session.save(prot3);
Complex c1= new Complex("cplx1");
c1.getPartners().add(prot1);
c1.getPartners().add(prot2);
session.save(c1);
Complex c2= new Complex("cplx2");
c2.getPartners().add(prot1);
c2.getPartners().add(c1);
c2.getArticles().add(article);
session.save(c2);

session.getTransaction().commit();

listJournals();
listArticles();
listInteractors();
}

public static void main(String args[])
{
try
{
Main app= new Main();
app.run();
}
catch(Throwable err)
{
err.printStackTrace();
}
finally
{
if(Main.sessionFactory!=null) Main.sessionFactory.close();
}
System.out.println("Done.");
}
}

Compiling

LIB=${HIBERNATE_HOME}/lib
LIBS=${LIB}/antlr-2.7.6.jar:${LIB}/cglib-2.1.3.jar:${LIB}/asm.jar:${LIB}/asm-attrs.jar:${LIB}/commons-collections-2.1.1.jar:${LIB}/commons-logging-1.0.4.jar:${HIBERNATE_HOME}/hibernate3.jar:${LIB}/jta.jar:${LIB}/dom4j-1.6.1.jar:${LIB}/log4j-1.2.11.jar:${DERBY_HOME}/derby.jar
test:
cp -r project/src/* project/build
javac -cp ${LIBS} -d project/build -sourcepath project/build project/build/org/lindenb/hbn01/*.java
jar cvf project/bin/project.jar -C project/build .
java -cp ${LIBS}:project/bin/project.jar org.lindenb.hbn01.Main

Output

21:49:15,396 INFO Environment:514 - Hibernate 3.2.6
21:49:15,402 INFO Environment:547 - hibernate.properties not found
21:49:15,405 INFO Environment:681 - Bytecode provider name : cglib
21:49:15,409 INFO Environment:598 - using JDK 1.4 java.sql.Timestamp handling
21:49:15,457 INFO Configuration:1432 - configuring from resource: /hibernate.cfg.xml
21:49:15,458 INFO Configuration:1409 - Configuration resource: /hibernate.cfg.xml
21:49:15,546 INFO Configuration:559 - Reading mappings from resource : org/lindenb/hbn01/mapping.hbm.xml
21:49:15,682 INFO HbmBinder:300 - Mapping class: org.lindenb.hbn01.Article -> Article
21:49:15,751 INFO HbmBinder:300 - Mapping class: org.lindenb.hbn01.Journal -> Journal
21:49:15,752 INFO HbmBinder:300 - Mapping class: org.lindenb.hbn01.Interactor -> Interactor
21:49:15,778 INFO HbmBinder:873 - Mapping joined-subclass: org.lindenb.hbn01.Protein -> Protein
21:49:15,780 INFO HbmBinder:873 - Mapping joined-subclass: org.lindenb.hbn01.Complex -> Complex
21:49:15,781 INFO HbmBinder:1419 - Mapping collection: org.lindenb.hbn01.Complex.partners -> interactions
21:49:15,783 INFO Configuration:1547 - Configured SessionFactory: null
21:49:15,802 INFO DriverManagerConnectionProvider:41 - Using Hibernate built-in connection pool (not for production use!)
21:49:15,803 INFO DriverManagerConnectionProvider:42 - Hibernate connection pool size: 1
21:49:15,803 INFO DriverManagerConnectionProvider:45 - autocommit mode: false
21:49:16,036 INFO DriverManagerConnectionProvider:80 - using driver: org.apache.derby.jdbc.EmbeddedDriver at URL: jdbc:derby:build/db/derby/hibernate;create=true
21:49:16,036 INFO DriverManagerConnectionProvider:86 - connection properties: {user=sa, password=****}
21:49:18,144 INFO SettingsFactory:89 - RDBMS: Apache Derby, version: 10.2.2.1 - (538595)
21:49:18,145 INFO SettingsFactory:90 - JDBC driver: Apache Derby Embedded JDBC Driver, version: 10.2.2.1 - (538595)
21:49:18,158 INFO Dialect:152 - Using dialect: org.hibernate.dialect.DerbyDialect
21:49:18,165 INFO TransactionFactoryFactory:31 - Using default transaction strategy (direct JDBC transactions)
21:49:18,167 INFO TransactionManagerLookupFactory:33 - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
21:49:18,167 INFO SettingsFactory:143 - Automatic flush during beforeCompletion(): disabled
21:49:18,167 INFO SettingsFactory:147 - Automatic session close at end of transaction: disabled
21:49:18,168 INFO SettingsFactory:162 - Scrollable result sets: enabled
21:49:18,168 INFO SettingsFactory:170 - JDBC3 getGeneratedKeys(): disabled
21:49:18,169 INFO SettingsFactory:178 - Connection release mode: auto
21:49:18,169 INFO SettingsFactory:205 - Default batch fetch size: 1
21:49:18,170 INFO SettingsFactory:209 - Generate SQL with comments: disabled
21:49:18,170 INFO SettingsFactory:213 - Order SQL updates by primary key: disabled
21:49:18,170 INFO SettingsFactory:217 - Order SQL inserts for batching: disabled
21:49:18,170 INFO SettingsFactory:386 - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
21:49:18,172 INFO ASTQueryTranslatorFactory:24 - Using ASTQueryTranslatorFactory
21:49:18,173 INFO SettingsFactory:225 - Query language substitutions: {}
21:49:18,173 INFO SettingsFactory:230 - JPA-QL strict compliance: disabled
21:49:18,173 INFO SettingsFactory:235 - Second-level cache: enabled
21:49:18,173 INFO SettingsFactory:239 - Query cache: disabled
21:49:18,174 INFO SettingsFactory:373 - Cache provider: org.hibernate.cache.NoCacheProvider
21:49:18,174 INFO SettingsFactory:254 - Optimize cache for minimal puts: disabled
21:49:18,174 INFO SettingsFactory:263 - Structured second-level cache entries: disabled
21:49:18,178 INFO SettingsFactory:283 - Echoing all SQL to stdout
21:49:18,178 INFO SettingsFactory:290 - Statistics: disabled
21:49:18,178 INFO SettingsFactory:294 - Deleted entity synthetic identifier rollback: disabled
21:49:18,178 INFO SettingsFactory:309 - Default entity-mode: pojo
21:49:18,179 INFO SettingsFactory:313 - Named query checking : enabled
21:49:18,206 INFO SessionFactoryImpl:161 - building session factory
21:49:18,472 INFO SessionFactoryObjectFactory:82 - Not binding factory to JNDI, no JNDI name configured
21:49:18,477 INFO SchemaExport:154 - Running hbm2ddl schema export
21:49:18,477 DEBUG SchemaExport:170 - import file not found: /import.sql
21:49:18,478 INFO SchemaExport:179 - exporting generated schema to database
21:49:18,482 DEBUG SchemaExport:303 - alter table Article drop constraint FK379164D684F84236
21:49:18,754 DEBUG SchemaExport:303 - alter table Complex drop constraint FK9BDFFC90D86C24B8
21:49:18,798 DEBUG SchemaExport:303 - alter table Protein drop constraint FK50CD6F63D86C24B8
21:49:18,834 DEBUG SchemaExport:303 - alter table interactions drop constraint FK4F6EF4A127BFBBC5
21:49:18,903 DEBUG SchemaExport:303 - alter table interactions drop constraint FK4F6EF4A1EBB9AEEF
21:49:19,029 DEBUG SchemaExport:303 - drop table Article
21:49:19,173 DEBUG SchemaExport:303 - drop table Complex
21:49:19,276 DEBUG SchemaExport:303 - drop table Interactor
21:49:19,410 DEBUG SchemaExport:303 - drop table Journal
21:49:19,537 DEBUG SchemaExport:303 - drop table Protein
21:49:19,654 DEBUG SchemaExport:303 - drop table interactions
21:49:19,814 DEBUG SchemaExport:303 - drop table hibernate_unique_key
21:49:19,896 DEBUG SchemaExport:303 - create table Article (pmid integer not null, title varchar(255) not null, doi varchar(255), yearDate integer not null, nlmId bigint not null, primary key (pmid))
21:49:20,063 DEBUG SchemaExport:303 - create table Complex (interactorId bigint not null, primary key (interactorId))
21:49:20,224 DEBUG SchemaExport:303 - create table Interactor (id bigint not null, name varchar(255) not null, primary key (id))
21:49:20,359 DEBUG SchemaExport:303 - create table Journal (nlmId bigint not null, title varchar(255) not null, primary key (nlmId))
21:49:20,580 DEBUG SchemaExport:303 - create table Protein (interactorId bigint not null, primary key (interactorId))
21:49:20,725 DEBUG SchemaExport:303 - create table interactions (complex_id bigint not null, interactor_id bigint not null, primary key (complex_id, interactor_id))
21:49:20,858 DEBUG SchemaExport:303 - alter table Article add constraint FK379164D684F84236 foreign key (nlmId) references Journal
21:49:20,997 DEBUG SchemaExport:303 - alter table Complex add constraint FK9BDFFC90D86C24B8 foreign key (interactorId) references Interactor
21:49:21,055 DEBUG SchemaExport:303 - alter table Protein add constraint FK50CD6F63D86C24B8 foreign key (interactorId) references Interactor
21:49:21,086 DEBUG SchemaExport:303 - alter table interactions add constraint FK4F6EF4A127BFBBC5 foreign key (interactor_id) references Interactor
21:49:21,202 DEBUG SchemaExport:303 - alter table interactions add constraint FK4F6EF4A1EBB9AEEF foreign key (complex_id) references Complex
21:49:21,331 DEBUG SchemaExport:303 - create table hibernate_unique_key ( next_hi integer )
21:49:21,376 DEBUG SchemaExport:303 - insert into hibernate_unique_key values ( 0 )
21:49:21,500 INFO SchemaExport:196 - schema export complete
21:49:21,501 WARN JDBCExceptionReporter:54 - SQL Warning: 10000, SQLState: 01J01
21:49:21,501 WARN JDBCExceptionReporter:55 - Database 'build/db/derby/hibernate' not created, connection made to existing database instead.
21:49:21,724 WARN JDBCExceptionReporter:54 - SQL Warning: 10000, SQLState: 01J01
21:49:21,724 WARN JDBCExceptionReporter:55 - Database 'build/db/derby/hibernate' not created, connection made to existing database instead.
Hibernate: insert into Journal (title, nlmId) values (?, ?)
Hibernate: insert into Article (title, doi, yearDate, nlmId, pmid) values (?, ?, ?, ?, ?)
Hibernate: insert into Article (title, doi, yearDate, nlmId, pmid) values (?, ?, ?, ?, ?)
Hibernate: insert into Interactor (name, id) values (?, ?)
Hibernate: insert into Protein (interactorId) values (?)
Hibernate: insert into Interactor (name, id) values (?, ?)
Hibernate: insert into Protein (interactorId) values (?)
Hibernate: insert into Interactor (name, id) values (?, ?)
Hibernate: insert into Protein (interactorId) values (?)
Hibernate: insert into Interactor (name, id) values (?, ?)
Hibernate: insert into Complex (interactorId) values (?)
Hibernate: insert into Interactor (name, id) values (?, ?)
Hibernate: insert into Complex (interactorId) values (?)
Hibernate: insert into interactions (complex_id, interactor_id) values (?, ?)
Hibernate: insert into interactions (complex_id, interactor_id) values (?, ?)
Hibernate: insert into interactions (complex_id, interactor_id) values (?, ?)
Hibernate: insert into interactions (complex_id, interactor_id) values (?, ?)
Hibernate: select journal0_.nlmId as nlmId1_, journal0_.title as title1_ from Journal journal0_
PNAS[1]
Hibernate: select article0_.pmid as pmid0_, article0_.title as title0_, article0_.doi as doi0_, article0_.yearDate as yearDate0_, article0_.nlmId as nlmId0_ from Article article0_
Hibernate: select journal0_.nlmId as nlmId1_0_, journal0_.title as title1_0_ from Journal journal0_ where journal0_.nlmId=?
(1988)"Article title 1".PNAS
(1989)"Article title 2".PNAS

Hibernate: select interactor0_.id as id2_, interactor0_.name as name2_, case when interactor0_1_.interactorId is not null then 1 when interactor0_2_.interactorId is not null then 2 when interactor0_.id is not null then 0 else -1 end as clazz_ from Interactor interactor0_ left outer join Protein interactor0_1_ on interactor0_.id=interactor0_1_.interactorId left outer join Complex interactor0_2_ on interactor0_.id=interactor0_2_.interactorId


### Protein:prot1




### Protein:prot2




### Protein:prot3


Hibernate: select partners0_.complex_id as complex1_1_, partners0_.interactor_id as interactor2_1_, interactor1_.id as id2_0_, interactor1_.name as name2_0_, case when interactor1_1_.interactorId is not null then 1 when interactor1_2_.interactorId is not null then 2 when interactor1_.id is not null then 0 else -1 end as clazz_0_ from interactions partners0_ left outer join Interactor interactor1_ on partners0_.interactor_id=interactor1_.id left outer join Protein interactor1_1_ on interactor1_.id=interactor1_1_.interactorId left outer join Complex interactor1_2_ on interactor1_.id=interactor1_2_.interactorId where partners0_.complex_id=?


### Complex:cplx1. ID:4 interacts with prot2 prot1


Hibernate: select partners0_.complex_id as complex1_1_, partners0_.interactor_id as interactor2_1_, interactor1_.id as id2_0_, interactor1_.name as name2_0_, case when interactor1_1_.interactorId is not null then 1 when interactor1_2_.interactorId is not null then 2 when interactor1_.id is not null then 0 else -1 end as clazz_0_ from interactions partners0_ left outer join Interactor interactor1_ on partners0_.interactor_id=interactor1_.id left outer join Protein interactor1_1_ on interactor1_.id=interactor1_1_.interactorId left outer join Complex interactor1_2_ on interactor1_.id=interactor1_2_.interactorId where partners0_.complex_id=?


### Complex:cplx2. ID:5 interacts with cplx1 prot1


21:49:22,076 INFO SessionFactoryImpl:769 - closing
21:49:22,076 INFO DriverManagerConnectionProvider:147 - cleaning up connection pool: jdbc:derby:build/db/derby/hibernate;create=true
Done


That's it!
Pierre

Generating a C Pull Parser for dbSNP with XSLT



I've used the XSD schema describing dbSNP to generate a C "Pull parser" reading the content of the dbSNP XML files. To transform the schema into a C code I wrote the following XSLT stylesheet:. This stylesheet was specifically developed for dbSNP so it might not handle a more complicated schema (for example a schema that would use <xsd:elementType> ). Basically the C code generated is a scaffold for a Pull Parser using the libxml2 library. For example, here is a simplified snippet of code handling the tag <Assembly/>
/** A collection of genome sequence records (curated gene regions (NG's),
contigs (NWNT's) and chromosomes (NC/AC's) produced by a genome
sequence project. Structure is populated from ContigInfo tables. */

static int processAssembly(StatePtr state)
{
int returnValue=EXIT_SUCCESS;
int success;
int nodeType;
const int isEmptyElement= xmlTextReaderIsEmptyElement(state -> reader);

/** Name of the group(s) or organization(s) that generated the assembly */
xmlChar* assemblySourceAttr=NULL;

//(...) declare other attributes

assemblySourceAttr= xmlTextReaderGetAttribute(
state->reader,
BAD_CAST "assemblySource"
);

//(...) other attributes

if(!isEmptyElement)
{
success = xmlTextReaderRead( state -> reader );
if(!success)
{
fprintf( state->error,"In Assembly I/O Error. xmlTextReaderRead returned \n");
returnValue = EXIT_FAILURE;
goto cleanup;
}
nodeType = xmlTextReaderNodeType( state -> reader );


/* process childNode <Component/> */

while(nodeType == XML_READER_TYPE_ELEMENT)
{
if(xmlStrcmp(
xmlTextReaderConstName(state -> reader),
BAD_CAST "Component"
)!=0)
{
break;
}

if(processComponent(state)!=EXIT_SUCCESS)
{
returnValue = EXIT_FAILURE;
goto cleanup;
}

/* read next event */
success= xmlTextReaderRead(state->reader);
if(!success)
{
returnValue = EXIT_FAILURE;
fprintf( state->error,"In Assembly/Component I/O Error.\n");
goto cleanup;
}
nodeType=xmlTextReaderNodeType(state->reader);
}

/* process childNode <SnpStat/> */
(...)

}//end of if(!isEmptyElement)

cleanup:

//free attributes
if(assemblySourceAttr!=NULL)
{
xmlFree(assemblySourceAttr);
}
//(...) other attributes
return returnValue;
}
Using this prototype I was able to quickly write a fast parser , for example echoing a JSON description of the SNPs of the Human Mitochondrial Genome (time: 0.11user 0.01system 0:00.19elapsed 66%CPU).
[
{
"rsId":8896,
"seq5":"GGTGTTGGTTCTCTTAATCTTTAACTTAAAAGGTTAATGCTAAGTTAGCTTTACAGTGGGCTCTAGAGGGGG
TAGAGGGGGTG",
"observed":"C/T",
"seq3":"TATAGGGTAAATACGGGCCCTATTTCAAAGATTTTTAGGGGAATTAATTCTAGGACGATGGGCATGAAACTGTGGTTTGCTCCACAGATTTCAGAGCATT"
}
,
{
"rsId":8936,
"seq5":"ACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGACCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTATAATAATTACATCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGT",
"observed":"A/C/T",
"seq3":"TAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGCAAACCACAGTTTCATGCCCATCGTCCTAGAATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTTACCCTATAGCACCCCCTCTACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAAC"
}
(...)
{
"rsId":72619366,
"seq5":"TGCTTACAAGCAAGTACAGCAATCAACCTTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCAC",
"observed":"C/T",
"seq3":"CTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGGGGTCCC"
}
]



That's it
Pierre

01 September 2009

First steps with BerkeleyDB-XML. My notebook.

Berkeley DB XML is an embeddable XML database engine that provides support for XQuery access to documents stored in containers and indexed based on their content. Oracle Berkeley DB XML is built on top of Oracle Berkeley DB. Berkeley DB XML is available at : http://www.oracle.com/database/berkeley-db/xml/index.html. The distribution comes with a shell command.

pierre@linux-zfgk:.../dbxml-2.4.16> ./install/bin/dbxml

Creating a DataStore

dbxml> createContainer dbsnp.dbxml
Creating node storage container

Creating a set of XML documents describing some SNPs

dbxml> putDocument snp1 '<snp id="25">
<name>rs25</name>
<class>snp</class>
<het>0.5</het>
<observed>A/G</observed>
<mapping>
<location build="36_3" label="CRA_TCAGchr7v2" chrom="7" position="11637562"/>
<location build="36_3" label="Celera" chrom="7" position="11558958"/>
<location build="36_3" label="HuRef" chrom="7" position="11442496"/>
<location build="36_3" label="reference" chrom="7" position="11550666"/>
</mapping>
</snp>' s
Document added, name = snp1

dbxml> putDocument snp2 '<snp id="26">
<name>rs26</name>
<class>mixed</class>
<het>0</het>
<observed>-/A/G</observed>
<mapping>
<location build="36_3" label="CRA_TCAGchr7v2" chrom="7" position="11636891"/>
<location build="36_3" label="Celera" chrom="7" position="11558287"/>
<location build="36_3" label="HuRef" chrom="7" position="11441825"/>
<location build="36_3" label="reference" chrom="7" position="11549995"/>
</mapping>
</snp>' s
Document added, name = snp2

dbxml> putDocument snp3 '<snp id="27">
<name>rs27</name>
<class>snp</class>
<het>0.44</het>
<observed>C/G</observed>
<mapping>
<location build="36_3" label="CRA_TCAGchr7v2" chrom="7" position="11636645"/>
<location build="36_3" label="Celera" chrom="7" position="11558041"/>
<location build="36_3" label="HuRef" chrom="7" position="11441579"/>
<location build="36_3" label="reference" chrom="7" position="11549749"/>
</mapping>
</snp>' s
Document added, name = snp3


dbxml> putDocument snp4 '<snp id="300">
<name>rs300</name>
<class>snp</class>
<het>0.01</het>
<observed>A/G</observed>
<mapping>
<location build="36_3" label="Celera" chrom="8" position="18779978"/>
<location build="36_3" label="HuRef" chrom="8" position="18357119"/>
<location build="36_3" label="reference" chrom="8" position="19861166"/>
</mapping>
</snp>'
Document added, name = snp4

dbxml> putDocument snp5 '<snp id="600">
<name>rs600</name>
<class>snp</class>
<het>0.27</het>
<observed>C/G</observed>
<mapping>
<location build="36_3" label="Celera" chrom="X" position="148984992"/>
<location build="36_3" label="HuRef" chrom="X" position="137590170"/>
<location build="36_3" label="reference" chrom="X" position="148444179"/>
<location build="36_3" label="reference" chrom="X" position="148843642"/>
</mapping>
</snp>' s
Document added, name = snp5

dbxml> putDocument snp6 '<snp id="800">
<name>rs800</name>
<class>snp</class>
<het/>
<observed>C/G/T</observed>
<mapping>
<location build="36_3" label="Celera" chrom="22" position="18365004"/>
<location build="36_3" label="HuRef" chrom="22" position="17518747"/>
<location build="36_3" label="reference" chrom="22" position="32892297"/>
</mapping>
</snp>' s
Document added, name = snp6

Getting help

dbxml> help

Command Summary
---------------

# - Comment. Does nothing
abort - Aborts the current transaction
addAlias - Add an alias to the default container
addIndex - Add an index to the default container
append - Append to nodes specified in the query expression
commit - Commits the current transaction, and starts a new one
compactContainer - Compact a container to shrink it's size
contextQuery - Execute query expression using the last results as the context item
cquery - Execute an expression in the context of the default container
createContainer - Creates a new container, which becomes the default container
debug - Debug command -- internal use only
delIndex - Delete an index from the default container
echo - Echo to output
getDocuments - Gets document(s) by name from default container
getMetaData - Get a metadata item from the named document
help - Print help information. Use 'help commandName' for extended help
info - Get info on default container
insertAfter - Insert new content after nodes selected by the query expression
insertBefore - Insert new content before nodes selected by the query expression
listIndexes - List all indexes in the default container
lookupEdgeIndex - Performs an edge index lookup in the default container
lookupIndex - Performs an index lookup in the default container
lookupStats - Look up index statistics on the default container
openContainer - Opens a container, and uses it as the default container
preload - Pre-loads (opens) a container
prepare - Prepare the given query expression as the default pre-parsed query
print - Prints most recent results, optionally to a file
putDocument - Insert a document into the default container
query - Execute the given query expression, or the default pre-parsed query
queryPlan - Prints the query plan for the specified query expression
quit - Exit the program
reindexContainer - Reindex a container, optionally changing index type
removeAlias - Remove an alias from the default container
removeContainer - Removes a container
removeDocument - Remove a document from the default container
removeNodes - Remove content from documents specified by the query expression
renameNodes - Rename nodes specified by the query expression
run - Runs the given file as a script
setBaseUri - Set/get the base uri in the default context
setIgnore - Tell the shell to ignore script errors
setLazy - Sets lazy evaluation on or off in the default context
setMetaData - Set a metadata item on the named document
setNamespace - Create a prefix->namespace binding in the default context
setProjection - Enables or disables the use of the document projection optimization
setQueryTimeout - Set a query timeout in seconds in the default context
setReturnType - Sets the return type on the default context
setTypedVariable - Set a variable to the specified type in the default context
setVariable - Set a variable in the default context
setVerbose - Set the verbosity of this shell
sync - Sync current container to disk
time - Wrap a command in a wall-clock timer
transaction - Create a transaction for all subsequent operations to use
updateNodes - Update node content based on query expression and new content
upgradeContainer - Upgrade a container to the current container format

Printing the names of all the SNP

dbxml> query 'collection("dbsnp.dbxml")/snp/name/string()'
6 objects returned for eager expression 'collection("dbsnp.dbxml")/snp/name/string()'


dbxml> print
rs25
rs26
rs27
rs300
rs600
rs800

Finding the observed bases for the SNPs having het>0.3

dbxml> query 'collection("dbsnp.dbxml")/snp[number(het) > 0.3 ]/observed/string()'
2 objects returned for eager expression 'collection("dbsnp.dbxml")/snp[number(het) > 0.3 ]/observed/string()'


dbxml> print
A/G
C/G

Printing a HTML table of all the SNPs on chrom7

dbxml> query '<html><body><table><tr><th>Name</th><th>Chrom</th><th>Position</th></tr>
{ for $location in collection("dbsnp.dbxml")/snp/mapping/location[@chrom="7" and @label="reference"]
return
<tr><th>{$location/../../name/string()}</th><td>7</td><td>{$location/@position/string()}</td></tr>
}
</table></body></html>'
1 objects returned for eager expression '<html><body><table><tr><th>Name</th><th>Chrom</th><th>Position</th></tr> { for $location in collection("dbsnp.dbxml")/snp/mapping/location[@chrom="7" and @label="reference"]
return
<tr><th>{$location/../../name/string()}</th><td>7</td><td>{$location/@position/string()}</td></tr>}</table></body></html>'


dbxml> print
<html><body><table><tr><th>Name</th><th>Chrom</th><th>Position</th></tr><tr><th>rs25</th><td>7</td><td>11550666</td></tr><tr><th>rs26</th><td>7</td><td>11549995</td></tr><tr><th>rs27</th><td>7</td><td>11549749</td></tr></table></body></html>

Result viewed in a browser:
NameChromPosition
rs25711550666
rs26711549995
rs27711549749


That's it
Pierre

Using the BerkeleyDB Direct Persistence Layer: my notebook

In this post I show how I've used the Java BerkeleyDB API / Direct Persistence Layer to store a set of individuals in a BerkeleyDB database.


In a prevous post, I've shown how to use the BerkeleyDB API, a key/value database, to store some RDF statements. In this example, a set of TupleBinding was created to read and write the java Objects from/to the BerkeleyDB database.
Via Oracle: The Direct Persistence Layer (DPL) is one of two APIs that BerkeleyDB provides for interaction with databases. The DPL provides the ability to cause any Java type to be persistent without implementing special interfaces. The only real requirement is that each persistent class have a default constructor. No hand-coding of bindings is required. A binding is a way of transforming data types into a format which can be stored in a JE database. No external schema is required to define primary and secondary index keys. Java annotations are used to define all metadata.

OK, say you want to store a set of individuals in a BerkeleyDB database. The class Individual will be annotated with the @Entity annotation to tell the DPL that it should save this class. The primary key will be annotated with @PrimaryKey and will be automatically filled by the BerkeleyDB engine.
@Entity //Indicates a persistent entity class.
public class Individual
{
@PrimaryKey(sequence="individual") //Indicates the primary key field of an entity class
private long id;
(...)
}
. We also want to have a quick access to the family names, to the fathers and to the mothers. A @SecondaryKey is used to create those secondary indexes. Those secondary indexes also act as a constraint: references to the parents are allowed only if their ID already exist in the database.
@Entity
public class Individual
{
@PrimaryKey(sequence="individual")
private long id;
private String firstName=null;
@SecondaryKey(relate=Relationship.MANY_TO_ONE)
private String lastName=null;
@SecondaryKey(relate=Relationship.MANY_TO_ONE,
relatedEntity=Individual.class,
onRelatedEntityDelete=DeleteAction.NULLIFY
)
private Long fatherId=null;
@SecondaryKey(relate=Relationship.MANY_TO_ONE,
relatedEntity=Individual.class,
onRelatedEntityDelete=DeleteAction.NULLIFY)
private Long motherId=null;
(...)
}

At the end, here is the full source code of the class Individual.
package dpl;
import com.sleepycat.persist.model.DeleteAction;
import com.sleepycat.persist.model.Entity;
import com.sleepycat.persist.model.PrimaryKey;
import com.sleepycat.persist.model.Relationship;
import com.sleepycat.persist.model.SecondaryKey;

@Entity
public class Individual
{
@PrimaryKey(sequence="individual")
private long id;
private String firstName=null;
@SecondaryKey(relate=Relationship.MANY_TO_ONE)
private String lastName=null;
@SecondaryKey(relate=Relationship.MANY_TO_ONE,
relatedEntity=Individual.class,
onRelatedEntityDelete=DeleteAction.NULLIFY
)
private Long fatherId=null;
@SecondaryKey(relate=Relationship.MANY_TO_ONE,
relatedEntity=Individual.class,
onRelatedEntityDelete=DeleteAction.NULLIFY)
private Long motherId=null;
private int gender=0;

public Individual()
{

}

public Individual(String firstName,String lastName,int gender)
{
this.firstName=firstName;
this.lastName=lastName;
this.gender=gender;
}

public long getId() {
return id;
}



public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}

public long getFatherId() {
return fatherId;
}
public void setFatherId(long fatherId) {
this.fatherId = fatherId;
}
public long getMotherId() {
return motherId;
}
public void setMotherId(long motherId) {
this.motherId = motherId;
}

public void setGender(int gender) {
this.gender = gender;
}
public int getGender() {
return gender;
}

@Override
public int hashCode() {
return 31 + (int) (id ^ (id >>> 32));
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Individual))
return false;
Individual other = (Individual) obj;
if (id != other.id)
return false;
return true;
}

@Override
public String toString() {
return getFirstName()+" "+getLastName();
}
}

Opening the Database


The database, the datastore, and the indexes are opened:
EnvironmentConfig EnvironmentConfig envCfg= new EnvironmentConfig();
StoreConfig storeCfg= new StoreConfig();
envCfg.setAllowCreate(true);
envCfg.setTransactional(true);
storeCfg.setAllowCreate(true);
storeCfg.setTransactional(true);
this.environment= new Environment(dataDirectory,envCfg);
this.store= new EntityStore(this.environment,"StoreName",storeCfg);
this.individualById = this.store.getPrimaryIndex(Long.class, Individual.class);
this.individualByLastName= this.store.getSecondaryIndex(this.individualById, String.class, "lastName");

Creating a few Individuals


A transaction is opened, some individuals of Charles Darwin's family are inserted in the datastore and the transaction is commited.
Transaction txn;
//create a transaction
txn= environment.beginTransaction(null, null);

Individual gp1= new Individual("Robert","Darwin",1);
individualById.put(gp1);
Individual gm1= new Individual("Susannah","Wedgwood",2);
individualById.put(gm1);
Individual gp2= new Individual("Josiah","Wedgwood",1);
individualById.put(gp2);
Individual gm2= new Individual("Elisabeth","Allen",2);
individualById.put(gm2);

Individual father= new Individual("Charles","Darwin",1);
father.setFatherId(gp1.getId());
father.setMotherId(gm1.getId());
individualById.put(father);
Individual mother= new Individual("Emma","Wedgwood",2);
mother.setFatherId(gp2.getId());
mother.setMotherId(gm2.getId());
individualById.put(mother);


Individual c1= new Individual("William","Darwin",1);
c1.setFatherId(father.getId());
c1.setMotherId(mother.getId());
individualById.put(c1);
Individual c2= new Individual("Anne Elisabeth","Darwin",2);
c2.setFatherId(father.getId());
c2.setMotherId(mother.getId());
individualById.put(c2);

txn.commit();

Using the secondary indexes


An EntityCursor obtained from the secondary index individualByLastName is used to iterate over all the individuals named "Darwin":
EntityCursor<Individual> cursor = individualByLastName.entities("Darwin", true, "Darwin", true);
for(Individual indi:cursor)
{
System.out.println(indi.getLastName()+"\t"+indi.getFirstName()+"\t"+indi.getId());
}
cursor.close();


Output

###Listing all Darwin
Darwin Robert 1
Darwin Charles 5
Darwin William 7
Darwin Anne Elisabeth 8


Source code



package dpl;

import java.io.File;
import java.util.logging.Logger;

import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.je.EnvironmentConfig;
import com.sleepycat.je.Transaction;
import com.sleepycat.persist.EntityCursor;
import com.sleepycat.persist.EntityStore;
import com.sleepycat.persist.PrimaryIndex;
import com.sleepycat.persist.SecondaryIndex;
import com.sleepycat.persist.StoreConfig;

public class DirectPersistenceLayerTest
{
private static Logger LOG= Logger.getLogger(DirectPersistenceLayerTest.class.getName());
private Environment environment=null;
private EntityStore store;
private PrimaryIndex<Long, Individual> individualById;
private SecondaryIndex<String, Long, Individual> individualByLastName;


public void open(File dir) throws DatabaseException
{
close();
EnvironmentConfig envCfg= new EnvironmentConfig();
StoreConfig storeCfg= new StoreConfig();
envCfg.setAllowCreate(true);
envCfg.setTransactional(true);
storeCfg.setAllowCreate(true);
storeCfg.setTransactional(true);
LOG.info("opening "+dir);
this.environment= new Environment(dir,envCfg);
this.store= new EntityStore(this.environment,"StoreName",storeCfg);
this.individualById = this.store.getPrimaryIndex(Long.class, Individual.class);
this.individualByLastName= this.store.getSecondaryIndex(this.individualById, String.class, "lastName");
}

public void close()
{
if(this.store!=null)
{
LOG.info("close store");
try {
this.store.close();
}
catch (DatabaseException e)
{
LOG.warning(e.getMessage());
}
this.store=null;
}

if(this.environment!=null)
{
LOG.info("close env");
try {
this.environment.cleanLog();
this.environment.close();
}
catch (DatabaseException e)
{
LOG.warning(e.getMessage());
}
this.environment=null;
}
}

void run() throws DatabaseException
{
Transaction txn;
LOG.info("count.individuals="+ individualById.count());
//create a transaction
txn= environment.beginTransaction(null, null);

Individual gp1= new Individual("Robert","Darwin",1);
individualById.put(gp1);
Individual gm1= new Individual("Susannah","Wedgwood",2);
individualById.put(gm1);
Individual gp2= new Individual("Josiah","Wedgwood",1);
individualById.put(gp2);
Individual gm2= new Individual("Elisabeth","Allen",2);
individualById.put(gm2);

Individual father= new Individual("Charles","Darwin",1);
father.setFatherId(gp1.getId());
father.setMotherId(gm1.getId());
individualById.put(father);
Individual mother= new Individual("Emma","Wedgwood",2);
mother.setFatherId(gp2.getId());
mother.setMotherId(gm2.getId());
individualById.put(mother);


Individual c1= new Individual("William","Darwin",1);
c1.setFatherId(father.getId());
c1.setMotherId(mother.getId());
individualById.put(c1);
Individual c2= new Individual("Anne Elisabeth","Darwin",2);
c2.setFatherId(father.getId());
c2.setMotherId(mother.getId());
individualById.put(c2);

txn.commit();



System.out.println("###Listing all Darwin");
EntityCursor<Individual> cursor = individualByLastName.entities("Darwin", true, "Darwin", true);
for(Individual indi:cursor)
{
System.out.println(indi.getLastName()+"\t"+indi.getFirstName()+"\t"+indi.getId());
}
cursor.close();

LOG.info("count.individuals="+individualById.count());
}

public static void main(String[] args)
{
DirectPersistenceLayerTest app= new DirectPersistenceLayerTest();
try
{
int optind=0;
while(optind< args.length)
{
if(args[optind].equals("-h"))
{
System.err.println("");
}
else if(args[optind].equals("--"))
{
optind++;
break;
}
else if(args[optind].startsWith("-"))
{
System.err.println("Unknown option "+args[optind]);
}
else
{
break;
}
++optind;
}
app.open(new File("/tmp/bdb"));
app.run();
}
catch(Throwable err)
{
err.printStackTrace();
}
finally
{
app.close();
}
LOG.info("done.");
}
}

That's it.
Pierre

05 August 2009

300th

This is my 300th post. This blog started in november 2005 and I want to thank all the people who helped me and contributed to write those posts. I want to thank particularly the Biogang, my followers/following on Twitter and the Life-Scientists on FriendFeed.
Here is a timeline of this blog created on dipity.com.

This timeline was built without giving my blogger username+password: I just added the RSS feed of this blog but asked the blogger API to return a high number of items in the RSS feed (max-result=300), so all the posts have been inserted.

That's it !
pierre

04 August 2009

A Treemap for FriendFeed

I've resurrected an old Treemap algorithm I described three years ago, and I've used it to plot the activity of the "Life Scientists Room" on FriendFeed.

The source of the packing algorithm is available here, and the source of the tool scanning FriendFeed is available here.

In the end, here is a clickable treemap of the top 'commentators' in the "Life Scientists Room" of FriendFeed:


Deepak SinghBill HookerNeil SaundersMaxineEric JainMr. GunnAttila CsordasCameron NeylonPaulo NuinJim HardyPierrePawel SzczesnyAndrew SuAndrew CleggBjörn BrembsSally ChurchBora ZivkovicGraham SteelIddo FriedbergEgon WillighagenSteve KochShirley WuChris LasherDonnie BerkholzAlexeyChris MillerAbhishek TiwariAndrew PerryDaniel MietchenDuncan HullJean-Claude BradleyPedro BeltraoRicardo VidalRajarshi GuhaChris CotsapasMichael NielsenMaureen'Mummi' ThorissonMichael KuhnBenjamin TsengNoah GrayKhader ShameerMartin FennerNtinoMichael BartonHope LemanRichard P GrantHeatherChris PatilDaniel SwanAllyson ListerMatthew ToddJan AertsdKPaul J. DavisMike ChelenNils ReintonEuanFrankBob O'HaraMickey SchaferimaboneheadRuchira S. DattaAnders NorgaardTodd HarrisgeneregJason StajichWalter JessenMatt WoodIan HolmesDaniel JurczakPaul BacchusjoergkurtwegnerThomas LembergerBrian Krueger - LabSpacesnovoseekWladimir LabeikovskyKevin ZAarthyJason WingetCesar SanchezJack H. PincusEnroHilarylauraJoe DunckleyMary CanadyLars Juhl JensenRoland KrauseChristina PikasYaroslav NikolaevHysell OviedoDaniel MacArthurtimsofarsoShawnBarbara DuckAnthony PhanZaki ManianNir LondonJo BrodieD0r0th34General KafkaAdam KrautNextBioHariMichael R. BernsteinOliver HofmannRichard AkermanChristopher HarrisIan YorkKevin D. White_alfSutee DeeNatBlairJoe FitzsimonsarekChrisJereBrad ChapmanMikaelarfonmarcinJohn DupuisTodd HoffJill O'NeillMitchell J Stanton-CookSimon CockellAndreas Maternsteffi suhrBerci MeskoPiotr ByziaAntony WilliamsdsbreakLisa GreenYann AbrahamKaitlin ThaneyBosco HoJason TsaiAJCannAlejandroLucas BrouwersCass JohnstonVictor / Mendeley TeamEthan GahngMelanieAndy MaloneySusan BeebeNealMackenzie CowellStephen CurryFrançois DongierColbygeorgeTom WalshAdrianoDavid Bradleyfidel ramirezAlexander KruelAlexander GriekspoorRicardo Almeidajean-francois GuilbertJohn CumbersDavid CaplanRichard KlancerCarl FulpAndrew LangClare DudmanCarlos Granier-PhelpsRickSung W. LimMitchell Tsaitag:LindsaymocostColin AshePeter BinfieldDaniel Brownj1mWilka HudsonTom TulliusKonrad FörstnerAndrew SpongJason MillerDavid AdamJeff HabigHenry GeePedro MatosnicefishfilmsNeil SwainstonRafael SidiJames WatsonStevenJake FudgeBettinaJordan MFossil HuntressArnaldo M PereirasuelibrarianWilliam MooreDarek KedraMassimo PintoAnil ThomasClaudia KoltzenburgAlan KodzasovDomCarey LumengMichael HabibIan TindaleDaniel LemireColin ArcherMadhu PandeyAnselm Levskayavictor_linYunusYAMANER(CITRIL)Matt LeiferThomas MailundKristen FortneyRoyKaren JamesChet AwesomelaserJason KellyJWSChris EdwardsJohn DelacruzMarcinThe NeurocriticDan FreemanAnthony SalvagnoWubin QuKol TregaskesA RoyDavid HC SoulLouis SimoneauThomas Patrick ChunaYuval LangerRishabh Mishra (p248)Andrew WarrenJim TillVedran RodicJillis ter HoveMathew A. KoenekerRebecca HolzdelagoyaChristianShannon McWeeneyexador23carolhAdrian Heilbutmad -Walt RupparKrishna MohanAllen DodsonTapio KulmalaMatthewrnaworldBrian HaugenDilip DandDean JohnsJohn MatherlyIan MulvanyJason WehmhoenerOlivia LovagAndrew WalkingshawSandeep GautamTad, Anti-ImmanentizerHeather PiwowarJohn MajorGENiEChristopher GranadeSasha Kovaliov = ♂♥♫☺NashPeter MurrayFergus GallagherChris LoftTye ArnettGinger Campbell, MDPhilAlejandro MontenegroOlaDan Morrill AKA TechwagAndrew LemonPepe JGBill AndersonDave JohnstonscientifkSteveBioJobBlogSam JackMicah WittmanaliebBruno C. VellutiniEmrah Doğan (winmaker)Matthew D. SmithJo BadgeBronwen DekkerHans-Martin WillRajeshVincent RacanielloDaveJoe BonnerpostlinearityCraig RowellMiss ElleMatthew DeVries© D/\\/IIID ℠ ®MarkBranwen HideTyson KeyEric MiltschRoberto BoniniJohn DuffChris SuspectPatricia F. AndersonFergus GallagherKostis MamassisnossenigmaRob DayJamie McQuayKMSSteve LevinDanielle FongGregg CameronDave BridgesLiz SladeMatt Harwoodcheranfriendfeed.com/walshtpAngela HamiltonvijayalfcoMeryn StolGladstoneJoel BennettMounir ErramiNaz DemirelhalwaWhitney HoffmanKyle WellerChristyivananderssonPeter DavenportRoderic PageTony RamosDave LuntEric BardesRussell WagnerLindsey Dragun/لندزي تنينRobert ScobleJason HoytJoan Koerber-WalkerMickey KosloffPeter AnsellThomas SharptonAbby MartinKubkeJeroen Van GoeyAlex CovicOpen Science InformationJasonRob SchonbergerBrian ReidDGentryRusty BishopChristopher DyerJack PowersFrank BruhnsMarian SiwiakKen MorleyKevin GambleRichard C YehFFing Enigma (aka Tina)TanathMichael FidlerTom TubbsWobblerSarahSteJulesRich MeiselɛƶqʋɛӽBrian Bishoperic silbersteinDawnJonJeffJeffraChris LeonardPeter MillerCaleb ElstonSebastianDhanuPeter MenzelLane RappAmir Moghaddamzephyrlily


Two other maps: here and here.

That's it

Pierre