package esl.cuenet.ranking; import esl.cuenet.model.Constants; import esl.cuenet.ranking.network.OntProperties; import esl.cuenet.ranking.network.PersistentEventEntityNetwork; import esl.system.SysLoggerUtils; import org.apache.log4j.Logger; import org.junit.BeforeClass; import org.junit.Test; import org.neo4j.cypher.javacompat.ExecutionEngine; import org.neo4j.cypher.javacompat.ExecutionResult; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.index.IndexHits; import org.neo4j.kernel.EmbeddedGraphDatabase; import java.util.HashSet; import java.util.Map; public class IndexConstructionTests { private String directory = "/data/graph_db/sources"; private Logger logger = Logger.getLogger(IndexConstructionTests.class); @BeforeClass public static void setup() { SysLoggerUtils.initLogger(); } @Test public void constructSpatioTemporalIxTest() { logger.info("Initiating constructSpatioTemporalIxTest"); GraphDatabaseService graphDb = new EmbeddedGraphDatabase( directory ); logger.info("Loaded Graph"); EventEntityNetwork network = new PersistentEventEntityNetwork( graphDb ); try { network.stIndex(SpatioTemporalIndex.OCCURS_DURING_IX).construct(); } catch (Exception e) { e.printStackTrace(); } finally { graphDb.shutdown(); } } @Test public void queryTemporalIndex() { logger.info("Initiating queryTemporalIndex"); GraphDatabaseService graphDb = new EmbeddedGraphDatabase( directory ); logger.info("Loaded Graph"); EventEntityNetwork network = new PersistentEventEntityNetwork( graphDb ); try { SpatioTemporalIndex txIndex = network.stIndex(SpatioTemporalIndex.OCCURS_DURING_IX); txIndex.overlaps(1327202830000L, 1327202840000L); txIndex.previous(1327202838000L); txIndex.next(1327202838000L); } catch (Exception e) { e.printStackTrace(); } finally { graphDb.shutdown(); } } @Test public void indexEventsAndEntities() { /* Index Enitities */ GraphDatabaseService graphDb = new EmbeddedGraphDatabase( directory ); logger.info("Loaded Graph"); String query = "START n=node(*) WHERE has(n." + EntityBase.TYPE + ") AND n." + EntityBase.TYPE + "= '" + EntityBase.ENTITY + "' RETURN n"; ExecutionEngine engine = new ExecutionEngine( graphDb ); ExecutionResult results = engine.execute(query); int ix = 0; Index<Node> nodeIndex = graphDb.index().forNodes(EntityBase.ENTITY_INDEX); Transaction tx = graphDb.beginTx(); try { nodeIndex.delete(); tx.success(); tx.finish(); nodeIndex = graphDb.index().forNodes(EntityBase.ENTITY_INDEX); tx = graphDb.beginTx(); for (Map<String, Object> result: results) for ( Map.Entry<String, Object> column : result.entrySet() ) { Node n = (Node) column.getValue(); nodeIndex.add(n, EntityBase.TYPE, EntityBase.ENTITY); ix++; } tx.success(); logger.info("Indexed " + ix + " entities."); } catch (Exception e) { tx.failure(); e.printStackTrace(); } finally { tx.finish(); graphDb.shutdown(); } graphDb = new EmbeddedGraphDatabase( directory ); logger.info("ReLoaded Graph"); nodeIndex = graphDb.index().forNodes(EntityBase.ENTITY_INDEX); IndexHits<Node> hits = nodeIndex.get(EntityBase.TYPE, EntityBase.ENTITY); logger.info("Entities in graph " + hits.size()); graphDb.shutdown(); /* Index Events */ graphDb = new EmbeddedGraphDatabase( directory ); logger.info("Loaded Graph for Indexing Events"); query = "START n=node(*) WHERE has(n." + OntProperties.TYPE + ") AND n." + OntProperties.TYPE + "= '" + OntProperties.INSTANCE + "' RETURN n"; engine = new ExecutionEngine( graphDb ); results = engine.execute(query); ix = 0; nodeIndex = graphDb.index().forNodes(EventEntityNetwork.EVENT_INDEX); tx = graphDb.beginTx(); try { nodeIndex.delete(); tx.success(); tx.finish(); nodeIndex = graphDb.index().forNodes(EventEntityNetwork.EVENT_INDEX); tx = graphDb.beginTx(); for (Map<String, Object> result: results) for ( Map.Entry<String, Object> column : result.entrySet() ) { Node n = (Node) column.getValue(); if ( !n.hasProperty(OntProperties.ONT_URI) ) { logger.info("WEIRD " + n); continue; } String uri = (String) n.getProperty(OntProperties.ONT_URI); if (uri.contains(Constants.CuenetNamespace + Constants.EmailExchangeEvent) || uri.contains(Constants.CuenetNamespace + Constants.PhotoCaptureEvent)) { nodeIndex.add(n, EntityBase.TYPE, EventEntityNetwork.EVENT); ix++; } } tx.success(); logger.info("Indexed " + ix + " events."); } catch (Exception e) { tx.failure(); e.printStackTrace(); } finally { tx.finish(); graphDb.shutdown(); } graphDb = new EmbeddedGraphDatabase( directory ); logger.info("ReLoaded Graph"); nodeIndex = graphDb.index().forNodes(EventEntityNetwork.EVENT_INDEX); hits = nodeIndex.get(EntityBase.TYPE, EventEntityNetwork.EVENT); logger.info("Entities in graph " + hits.size()); graphDb.shutdown(); } }