Skip to content

Commit

Permalink
Modified to add only unique nodes.
Browse files Browse the repository at this point in the history
  • Loading branch information
keiono committed May 30, 2013
1 parent bc63088 commit 56794f4
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 73 deletions.
Expand Up @@ -20,8 +20,11 @@
import org.cytoscape.work.ProvidesTitle;
import org.cytoscape.work.TaskMonitor;
import org.cytoscape.work.Tunable;
import org.neo4j.cypher.internal.parser.v1_7.MatchClause.NodeNamer;
import org.neo4j.index.impl.lucene.LowerCaseKeywordAnalyzer;

import scala.xml.NodeSeq;

import com.tinkerpop.blueprints.Edge;
import com.tinkerpop.blueprints.Element;
import com.tinkerpop.blueprints.Graph;
Expand All @@ -41,13 +44,16 @@ public class ExportNetworkToDatabaseTask extends AbstractNetworkTask {
@Tunable(description = "Export to DB:")
public String databaseLocation;

@Tunable(description = "Swap Edge Directions:")
public boolean swapEdgeDirections = false;

@ProvidesTitle
public String getTitle() {
return "Export Network to Graph Database";
}

private final Map<CyNode, Object> node2ID = new HashMap<CyNode, Object>();
private final Map<CyEdge, Object> edge2ID = new HashMap<CyEdge, Object>();
// private final Map<CyNode, Vertex> node2ID = new HashMap<CyNode, Vertex>();
// private final Map<CyEdge, Object> edge2ID = new HashMap<CyEdge, Object>();

public ExportNetworkToDatabaseTask(CyApplicationManager appManager) {
super(appManager.getCurrentNetwork());
Expand All @@ -60,6 +66,18 @@ public ExportNetworkToDatabaseTask(CyNetwork network) {
@Override
public void run(TaskMonitor taskMonitor) throws Exception {
final Graph graph = new Neo4jGraph(databaseLocation);

// Build vertex name map
final Map<String, Vertex> name2VertexMap = new HashMap<String, Vertex>();
Iterator<Vertex> allExistingNodeItr = graph.getVertices().iterator();
while(allExistingNodeItr.hasNext()) {
final Vertex node = allExistingNodeItr.next();
final String nodeName = node.getProperty("name");
if(nodeName != null)
name2VertexMap.put(nodeName, node);
}


final BatchGraph<?> bgraph = BatchGraph.wrap(graph);

final List<CyEdge> allEdges = network.getEdgeList();
Expand All @@ -74,27 +92,34 @@ public void run(TaskMonitor taskMonitor) throws Exception {
final CyNode source = edge.getSource();
final CyNode target = edge.getTarget();

// String sourceName = network.getRow(source).get(CyNetwork.NAME,
// String.class);
// String targetName = network.getRow(target).get(CyNetwork.NAME,
// String.class);

Vertex sourceV = bgraph.getVertex(source.getSUID());
if (sourceV == null)
sourceV = bgraph.addVertex(source.getSUID());
String sourceName = network.getRow(source).get(CyNetwork.NAME, String.class);

Vertex sourceV = name2VertexMap.get(sourceName);
if (sourceV == null) {
sourceV = bgraph.addVertex(sourceName);
name2VertexMap.put(sourceName, sourceV);
}
createProperties(nodeColumns, source, sourceV);
node2ID.put(source, sourceV.getId());

Vertex targetV = bgraph.getVertex(target.getSUID());
if (targetV == null)
targetV = bgraph.addVertex(target.getSUID());
String targetName = network.getRow(target).get(CyNetwork.NAME, String.class);
Vertex targetV = name2VertexMap.get(targetName);
if (targetV == null) {
targetV = bgraph.addVertex(targetName);
name2VertexMap.put(targetName, targetV);
}
createProperties(nodeColumns, target, targetV);
node2ID.put(target, targetV.getId());

final String interactionType = network.getRow(edge).get(CyEdge.INTERACTION, String.class);
final Edge tEdge = bgraph.addEdge(edge.getSUID(), sourceV, targetV, interactionType);
String interactionType = network.getRow(edge).get("NeXO relation type", String.class);
if (interactionType == null)
interactionType = network.getRow(edge).get(CyEdge.INTERACTION, String.class);

Edge tEdge = null;
if (swapEdgeDirections)
tEdge = bgraph.addEdge(edge.getSUID(), targetV, sourceV, interactionType);
else
tEdge = bgraph.addEdge(edge.getSUID(), sourceV, targetV, interactionType);

createProperties(edgeColumns, edge, tEdge);
edge2ID.put(edge, tEdge.getId());
}
bgraph.commit();
bgraph.shutdown();
Expand All @@ -108,7 +133,7 @@ public void run(TaskMonitor taskMonitor) throws Exception {

private Collection<CyColumn> createValidColumns(CyTable table) {
final Collection<CyColumn> originalColumns = table.getColumns();

final Set<CyColumn> columns = new HashSet<CyColumn>();
for (CyColumn col : originalColumns) {
// Filter unnecessary columns
Expand All @@ -124,63 +149,63 @@ private Collection<CyColumn> createValidColumns(CyTable table) {

private void createIdx(Collection<CyColumn> columns, final IndexableGraph graph, Class<? extends Element> type) {

Map<String, String> idx2colName = new HashMap<String, String>();

Iterator<Index<? extends Element>> idxItr = graph.getIndices().iterator();

final Set<String> existingIdx = new HashSet<String>();
while (idxItr.hasNext()) {
Index<? extends Element> idx = idxItr.next();
String originalIdxName = idx.getIndexName();
existingIdx.add(originalIdxName);
}
Index index = graph.getIndex(type.getSimpleName(), type);
if (index == null)
index = graph.createIndex(type.getSimpleName(), type, new Parameter("analyzer",
LowerCaseKeywordAnalyzer.class.getName()));

final Set<String> columnNamesSet = new HashSet<String>();
for (final CyColumn column : columns) {
final String idxName = type.getSimpleName() + "." + column.getName();
System.out.println("New Name = " + idxName);
if (existingIdx.contains(idxName)) {
continue;
}

Index<? extends Element> idx = graph.createIndex(type.getSimpleName() + "." + column.getName(), type,
new Parameter("analyzer", LowerCaseKeywordAnalyzer.class.getName()));
idx2colName.put(idx.getIndexName(), column.getName());
columnNamesSet.add(column.getName());
}

Iterator<? extends Element> elementItr = null;

for (String idxName : idx2colName.keySet()) {
Index idx = graph.getIndex(idxName, type);
for (final CyColumn column : columns) {

if (column.getName().equals(CyIdentifiable.SUID))
continue;

final String colName = idx2colName.get(idxName);
CyTable table = null;
if (type == Vertex.class) {
elementItr = graph.getVertices().iterator();
table = network.getDefaultNodeTable();
} else {
elementItr = graph.getEdges().iterator();
table = network.getDefaultEdgeTable();
}

while (elementItr.hasNext()) {

final Element elm = elementItr.next();
final Long suid = elm.getProperty(CyIdentifiable.SUID);
// System.out.println(suid.getClass() + " ### SUID = " + suid);

if (suid == null)
continue;

CyIdentifiable graphObj = null;
if (type == Vertex.class)
graphObj = network.getNode(suid);
else
graphObj = network.getEdge(suid);

final Object val = network.getRow(graphObj).get(colName, table.getColumn(colName).getType());
final Object val = network.getRow(graphObj).get(column.getName(), column.getType());
if (val == null)
continue;

idx.put(idxName, val, elm);
// System.out.println("######## Adding: " + column.getName() +
// " ==== " + val);
index.put(column.getName(), val, elm);
}
}

// TODO: REMOVE SUID

if (type == Vertex.class) {
elementItr = graph.getVertices().iterator();
} else {
elementItr = graph.getEdges().iterator();
}
while (elementItr.hasNext()) {
final Element elm = elementItr.next();
elm.removeProperty(CyIdentifiable.SUID);
}
}

private final void createProperties(Collection<CyColumn> columns, final CyIdentifiable graphObject,
Expand Down
44 changes: 27 additions & 17 deletions src/test/java/org/cytoscape/blueprints/ExportGraphTaskTest.java
Expand Up @@ -208,38 +208,48 @@ private final void testGraphTopology(IndexableGraph graph) {
nList.contains(out.getProperty(CyNetwork.NAME)) );
}

Iterable<Index<? extends Element>> allIdx = graph.getIndices();
Iterator<Index<? extends Element>> idxitr = allIdx.iterator();
while(idxitr.hasNext()) {
Index<? extends Element> idx = idxitr.next();
System.out.println("Index: " + idx.getIndexName());
}

// Test case sensitivity
final Index<Vertex> idx = graph.getIndex("Vertex.name", Vertex.class);
assertEquals("Vertex.name", idx.getIndexName());
CloseableIterable<Vertex> searchResult = idx.query("Vertex.name", "YNL216W");
final Index<Vertex> idx = graph.getIndex("Vertex", Vertex.class);
assertEquals("Vertex", idx.getIndexName());
CloseableIterable<Vertex> searchResult = idx.get("name", "YNL216W");
Set<Vertex> nodesFound = checkHits(searchResult);
assertEquals(1, nodesFound.size());

CloseableIterable<Vertex> searchResult2 = idx.query("Vertex.name", "YN*");
searchResult = idx.query("name", "YNL216W");
nodesFound = checkHits(searchResult);
assertEquals(1, nodesFound.size());

CloseableIterable<Vertex> searchResult2 = idx.query("name", "YN*");
Set<Vertex> nodesFound2 = checkHits(searchResult2);
assertEquals(26, nodesFound2.size());

CloseableIterable<Vertex> searchResult3 = idx.query("Vertex.name", "ynL216w");
CloseableIterable<Vertex> searchResult3 = idx.query("name", "ynL216w");
Set<Vertex> nodesFound3 = checkHits(searchResult3);
assertEquals(1, nodesFound3.size());

final Index<Edge> edgeIdx = graph.getIndex("Edge.interaction", Edge.class);
assertEquals("Edge.interaction", edgeIdx.getIndexName());
CloseableIterable<Edge> edgeSearchResult = edgeIdx.query("Edge.interaction", "p*");
final Index<Edge> edgeIdx = graph.getIndex("Edge", Edge.class);
assertEquals("Edge", edgeIdx.getIndexName());
assertEquals(Edge.class, edgeIdx.getIndexClass());
CloseableIterable<Edge> edgeSearchResult = edgeIdx.query("interaction", "p*");
Set<Edge> eHits = checkHits(edgeSearchResult);
assertEquals(362, eHits.size());

final Index<Edge> edgeIdx2 = graph.getIndex("Edge.name", Edge.class);
assertEquals("Edge.name", edgeIdx2.getIndexName());

Iterable<Edge> edgeSearchResult4 = edgeIdx.query("interaction", "*d");
Set<Edge> eHits4 = checkHits(edgeSearchResult4);
assertEquals(111, eHits4.size());

Iterable<Edge> edgeSearchResult2 = graph.getEdges("name", "YNL216W (pd) YOL086C");
// CloseableIterable<Edge> edgeSearchResult2 = edgeIdx.query("Edge.name", "Y*");
Set<Edge> eHits2 = checkHits(edgeSearchResult2);
assertEquals(1, eHits2.size());

final Index<Edge> edgeIdx3 = graph.getIndex("Edge.name", Edge.class);
assertEquals("Edge.name", edgeIdx3.getIndexName());
assertEquals(Edge.class, edgeIdx3.getIndexClass());
CloseableIterable<Edge> edgeSearchResult3 = edgeIdx3.query("Edge.name", "*YnL*");
CloseableIterable<Edge> edgeSearchResult3 = edgeIdx.query("name", "*yNl*");
Set<Edge> eHits3 = checkHits(edgeSearchResult3);
assertEquals(56, eHits3.size());
}
Expand All @@ -266,7 +276,7 @@ private final long countResult(Iterator<?> itr) {

private final void clearDB() {
TransactionalGraph graph = new Neo4jGraph(DATABASE_LOCATION);

Iterable<Edge> edges = graph.getEdges();
Iterator<Edge> itr2 = edges.iterator();

Expand Down
16 changes: 8 additions & 8 deletions src/test/java/org/cytoscape/blueprints/SPARQLEndpointTest.java
Expand Up @@ -30,14 +30,14 @@ public void testConnection() throws Exception {
String q2 = "CONSTRUCT{" + "?p <http://dbpedia.org/ontology/influenced> ?influenced." + "} WHERE {" + "?p a"
+ "<http://dbpedia.org/ontology/Philosopher> ."
+ "?p <http://dbpedia.org/ontology/influenced> ?influenced." + "} LIMIT 10000";
final SPARQLRepository dbPediaEndPoint = new SPARQLRepository(dbPedia, "");
dbPediaEndPoint.initialize();
final RepositoryConnection conn2 = dbPediaEndPoint.getConnection();
final GraphQuery gQuery = conn2.prepareGraphQuery(QueryLanguage.SPARQL, q2);
final GraphQueryResult result2 = gQuery.evaluate();

assertNotNull(result2);
System.out.println(result2);
// final SPARQLRepository dbPediaEndPoint = new SPARQLRepository(dbPedia, "");
// dbPediaEndPoint.initialize();
// final RepositoryConnection conn2 = dbPediaEndPoint.getConnection();
// final GraphQuery gQuery = conn2.prepareGraphQuery(QueryLanguage.SPARQL, q2);
// final GraphQueryResult result2 = gQuery.evaluate();
//
// assertNotNull(result2);
// System.out.println(result2);
}

}

0 comments on commit 56794f4

Please sign in to comment.