package esl.cuenet.ranking; import esl.system.SysLoggerUtils; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.neo4j.cypher.javacompat.ExecutionEngine; import org.neo4j.cypher.javacompat.ExecutionResult; import org.neo4j.graphdb.*; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.index.IndexHits; import org.neo4j.graphdb.traversal.Evaluators; import org.neo4j.graphdb.traversal.TraversalDescription; import org.neo4j.kernel.EmbeddedGraphDatabase; import org.neo4j.kernel.Traversal; import java.io.File; import java.util.HashSet; import java.util.Map; public class NeoGraphTest { private static String directory = "/data/graph_db/tests"; private Logger logger = Logger.getLogger(NeoGraphTest.class); enum MysteriousRelations implements RelationshipType { KNOWS, CREATED } @BeforeClass public static void setUp() { SysLoggerUtils.initLogger(); System.out.println("Deleting Files in " + directory); File[] files = (new File(directory)).listFiles(); if (files == null) files = new File[]{}; for (File file: files) FileUtils.deleteQuietly(file); } @AfterClass public static void tearDown() { File[] files = (new File(directory)).listFiles(); if (files == null) files = new File[]{}; for (File file: files) FileUtils.deleteQuietly(file); } @Test public void createSimpleGraph() { GraphDatabaseService graphDb = new EmbeddedGraphDatabase( directory ); Transaction tx = graphDb.beginTx(); Node n1 = graphDb.createNode(); n1.setProperty("name", "Agatha"); logger.info("ID n1 = " + n1.getId()); Node n2 = graphDb.createNode(); n2.setProperty("name", "Poirot"); logger.info("ID n2 = " + n2.getId()); Node n3 = graphDb.createNode(); n3.setProperty("name", "Marple"); logger.info("ID n3 = " + n3.getId()); n1.createRelationshipTo(n2, MysteriousRelations.CREATED); n1.createRelationshipTo(n3, MysteriousRelations.CREATED); n2.createRelationshipTo(n3, MysteriousRelations.KNOWS); n3.createRelationshipTo(n2, MysteriousRelations.KNOWS); tx.success(); tx.finish(); graphDb.shutdown(); } @Test public void loadAndTraverseGraph() { GraphDatabaseService graphDb = new EmbeddedGraphDatabase( directory ); //Transaction tx = graphDb.beginTx(); // Look ma, no transactions! Node n = graphDb.getNodeById(1L); logger.info("LOOKUP: " + n.getProperty("name")); n = graphDb.getNodeById(2L); logger.info("LOOKUP: " + n.getProperty("name")); n = graphDb.getNodeById(3L); logger.info("LOOKUP: " + n.getProperty("name")); n = graphDb.getNodeById(1L); String output = n.getProperty("name") + "'s relations\n"; TraversalDescription td = Traversal.description() .depthFirst() .relationships(MysteriousRelations.CREATED, Direction.OUTGOING) .evaluator(Evaluators.excludeStartPosition()); for (Path path: td.traverse(n)) { output += "At depth " + path.length() + " => " + path.endNode().getProperty( "name" ) + "\n"; } logger.info("\n" + output); //tx.finish(); // Look ma, no transactions! graphDb.shutdown(); } @Test public void createIndexedGraph() { tearDown(); GraphDatabaseService graphDb = new EmbeddedGraphDatabase( directory ); Transaction tx = graphDb.beginTx(); Node n1 = graphDb.createNode(); n1.setProperty("name", "Agatha"); logger.info("n1.id = " + n1.getId()); Node n2 = graphDb.createNode(); n2.setProperty("name", "Poirot"); Node n3 = graphDb.createNode(); n3.setProperty("name", "Marple"); n1.createRelationshipTo(n2, MysteriousRelations.CREATED); n1.createRelationshipTo(n3, MysteriousRelations.CREATED); n2.createRelationshipTo(n3, MysteriousRelations.KNOWS); n3.createRelationshipTo(n2, MysteriousRelations.KNOWS); Index<Node> nameIx = graphDb.index().forNodes("nameIx"); nameIx.add(n1, "name", n1.getProperty("name")); nameIx.add(n2, "name", n2.getProperty("name")); nameIx.add(n2, "fictional", "true"); nameIx.add(n3, "name", n3.getProperty("name")); nameIx.add(n3, "fictional", "true"); tx.success(); tx.finish(); graphDb.shutdown(); graphDb = new EmbeddedGraphDatabase( directory ); nameIx = graphDb.index().forNodes("nameIx"); IndexHits<Node> hits = nameIx.get("name", "Agatha"); logger.info("hits size = " + hits.size()); logger.info("n1.id = " + hits.getSingle().getId()); hits = nameIx.get("fictional", "true"); logger.info("hits size = " + hits.size()); logger.info("n2.id = " + hits.next().getId() + ", " + hits.next().getId()); graphDb.shutdown(); } @Test public void countNodesAndEdgesInGraph() { logger.info("Counting Nodes and Edges in: " + directory); GraphDatabaseService graphDb = new EmbeddedGraphDatabase( directory ); String query = "START n=node(*) RETURN COUNT(n)"; ExecutionEngine engine = new ExecutionEngine( graphDb ); ExecutionResult results = engine.execute(query); for (Map<String, Object> result: results) { for ( Map.Entry<String, Object> column : result.entrySet() ) { logger.info(column.getKey() + " " + column.getValue()); } } query = "START r=rel(*) RETURN COUNT(r)"; results = engine.execute(query); for (Map<String, Object> result: results) { for ( Map.Entry<String, Object> column : result.entrySet() ) { logger.info(column.getKey() + " " + column.getValue()); } } graphDb.shutdown(); } }