Der zweite Teil der NoSQL Artikelreihe hat die Verwendung auf Shell-Ebene gezeigt. Der dritte Teil wird sich der Java-API annehmen. Dieser Teil zeigt wie Neo4j per Maven eingebunden und innerhalb eines JUnit-Tests als Embedded Server hochgefahren wird. Damit wird der in Teil 1 genannte Vorteil von Neo4j - den Wegfall der Datenbank-Schicht - demonstriert.
igcjeafcDieser Artikel nimmt stark Bezug zu einem Eclipse-Maven-Projekt das unter https://github.com/hboscandio/blog-nosql-part3.git erreichbar ist. Der Aufbau des Projektes ist wie folgt:

.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   └── resources
    │   ├── log4j.dtd
    │   └── log4j.xml
    └── test
        ├── java
        │   └── de
        │   └── scandio
        │   └── blog
        │   └── neo4j
        │   └── test
        │   └── unit
        │   ├── Neo4jBaseTest.java
        │   └── Neo4jCrudTest.java
        └── resources

Die Datei Neo4jCrudTest.java zeigt die Operationen Cread Read Update und Delete gegen den Neo4jGraph. Zu beachten ist, dass in der Klasse Neo4jBaseTest.java einige Hilfsfunktionen enthalten sind um den eigentlichen Test lesbarer zu halten. Außerdem sind die JUnit spezifischen Annotationen @BeforeClass, @AfterClass, @Before, und @After, in diese Basis-Klasse ausgelagert.

@BeforeClass - Startet den Neo4j-Server vor dem eigentlichen Test
@Before - Kopiert einige Variablen aus der statischen Variable des Servers aus @BeforeClass in lokale Variable, fügt Testdaten vor jedem Test in den Graphen ein und indiziert diese
@After - Bereinigt den Index und löscht alle Testdaten nach jedem Test
@AfterClass - Fährt den Neo4j-Server herunter

Bei den ausgelagerten Hilfsfunktionen handelt sich um:

... snip
public void doInTransaction(TransactionCallback txCallback){
		Transaction tx = api.beginTx();
		try {
			txCallback.execute(api);
			tx.success();
        } finally {
        	tx.finish();
        }
	}
snap ...
... snip
	public ExecutionResult executeQuery(String query){
		return engine.execute(query);
	}
	public Set nodeSetFromResult(ExecutionResult result, String column){
		Set nodes = new HashSet();
		Iterator columnIterator = result.columnAs(column);
		IteratorUtil.addToCollection(columnIterator, nodes);
		return nodes;
	}
snap ...

doInTransaction - lagert den Code zum öffnen, übertragen und schließen einer Transaktion aus. Per Callback kann innerhalb der Transaktion eigener Code ausgeführt werden.
executeQuery - führt eine Suche mit der übergebenen Query aus
nodeSetFromResult - gibt alle Knoten aus einem ExecutionResult als Set zurück

Das Projekt kann nach dem klonen per Maven getestet werden

hbo: ~/Development/wrk/eclipse-indigo-sr2-64bit/de.scandio.blog.nosql.part3 > mvn clean install
snip ...
... snap
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running de.scandio.blog.neo4j.test.unit.Neo4jCrudTest
snip ...
... snap
INFO: Neo4j Server shutdown initiated by kill signal
Results :
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ part2 ---
[INFO] Building jar: /Users/hbo/Development/wrk/eclipse-indigo-sr2-64bit/de.scandio.blog.neo4j.part2/target/part2-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.3.1:install (default-install) @ part2 ---
[INFO] Installing /Users/hbo/Development/wrk/eclipse-indigo-sr2-64bit/de.scandio.blog.neo4j.part2/target/part2-0.0.1-SNAPSHOT.jar to /Users/hbo/.m2/repository/de/scandio/blog/neo4j/part2/0.0.1-SNAPSHOT/part2-0.0.1-SNAPSHOT.jar
[INFO] Installing /Users/hbo/Development/wrk/eclipse-indigo-sr2-64bit/de.scandio.blog.neo4j.part2/pom.xml to /Users/hbo/.m2/repository/de/scandio/blog/neo4j/part2/0.0.1-SNAPSHOT/part2-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.212s
[INFO] Finished at: Fri Feb 15 09:30:21 CET 2013
[INFO] Final Memory: 14M/81M
[INFO] ------------------------------------------------------------------------

Bei dem Projekt handelt es sich um ein Eclipse-Projekt. Innerhalb von Eclipse kann über “File -> Import -> Existing Maven Projects” importiert werden. Der Test kann dann über Eclipse ausgeführt werden. Rechtsklick auf Neo4jCrudTest “Run as -> JUnit Test”

Das Team der Scandio GmbH hat Projekterfahrung in den Bereichen JackRabbit und neo4j. Dieser Artikel zeigte die Verwendung der Neo4j-Java-API und Neo4j als Embedded Server

Weblinks

http://www.neo4j.org/
http://docs.neo4j.org/chunked/milestone/cypher-query-lang.html

Firmenportrait:
Die Scandio GmbH ist ein IT-Beratungs- und Softwareunternehmen aus München. Wir entwickeln individuelle Web-Applikationen für Ihr Unternehmen. Zu unseren Stärken gehören Web Content Management Systeme, Suchmaschinen-Technologie (Lucene, Apache Solr), Datenbank- und eCommerce-Systeme und alle Mischformen daraus. Mehr über unsere Leistungen erfahren Sie in unserem Portfolio.