package esl.cuenet.ranking.network; import com.hp.hpl.jena.ontology.OntModel; import esl.cuenet.ranking.*; import org.apache.log4j.Logger; 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.Relationship; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.index.Index; import org.neo4j.graphdb.index.IndexHits; import java.util.*; public class PersistentEventEntityNetwork implements EventEntityNetwork { private final OntModel model; private final OntoInstanceFactory ontoInstanceFactory; private final NetworkTraverser traverser; private final SpatioTemporalIndex stIndex; private final TextIndex textIndex; private final GraphDatabaseService graphDb; private Logger logger = Logger.getLogger(PersistentEventEntityNetwork.class); private Transaction transaction = null; private HashMap<String, TextIndex> textIndexMap = new HashMap<String, TextIndex>(5); private List<URINode> events = null; public PersistentEventEntityNetwork(GraphDatabaseService graphDb) { this(null, null, null, new NeoSpatioTemporalIndex(graphDb), null, graphDb); } public PersistentEventEntityNetwork(OntModel model, OntoInstanceFactory factory, NetworkTraverser traverser, SpatioTemporalIndex stIndex, TextIndex textIndex, GraphDatabaseService graphDb) { this.model = model; this.ontoInstanceFactory = factory; this.traverser = traverser; this.stIndex = stIndex; this.textIndex = textIndex; this.graphDb = graphDb; Index<Node> nodeIndex = graphDb.index().forNodes(EventEntityNetwork.EVENT_INDEX); IndexHits<Node> hits = nodeIndex.get(EntityBase.TYPE, EventEntityNetwork.EVENT); events = new ArrayList<URINode>(hits.size()); for (Node n: hits) events.add(NeoCache.getInstance().lookupNode(n)); } @Override public URINode createNode() { return new NeoURINode(graphDb.createNode()); } @Override public URINode getNodeById(long id) { return NeoCache.getInstance().lookupNode(graphDb.getNodeById(id)); } @Override public EventEntityNetwork subnet(Iterator<URINode> nodeIterator) { return null; } @Override public NetworkTraverser traverser() { return traverser; } @Override public SpatioTemporalIndex stIndex(String indexName) { return stIndex; } @Override public TextIndex textIndex(String indexName) { return new NeoLuceneIndex(graphDb.index().forNodes(indexName)); } @Override public OntoInstanceFactory ontoInstanceFactory() { return ontoInstanceFactory; } @Override public void rank(Ranker ranker) { } @Override public void startBulkLoad() { transaction = graphDb.beginTx(); } @Override public void finishBulkLoad() { transaction.success(); transaction.finish(); } @Override public void flush() { finishBulkLoad(); startBulkLoad(); } @Override public String version() { return UUID.randomUUID().toString(); } @Override public Iterator<TypedEdge> getEdgesIterator() { logger.info("Loading all relations"); List<TypedEdge> edges = new ArrayList<TypedEdge>(); String query = "START r=rel(*) RETURN r"; ExecutionEngine engine = new ExecutionEngine( graphDb ); ExecutionResult results = engine.execute(query); for (Map<String, Object> result: results) { for ( Map.Entry<String, Object> column : result.entrySet() ) { NeoTypedEdge te = new NeoTypedEdge((Relationship) column.getValue()); if (column.getKey().equals("r")) edges.add(te); } } logger.info("Total Relations: " + edges.size()); return edges.iterator(); } @Override public Iterator<URINode> getEventsIterator() { return events.iterator(); } }