import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.helpers.collection.MapUtil;
import org.neo4j.kernel.impl.util.FileUtils;
import org.neo4j.unsafe.batchinsert.BatchInserter;
import org.neo4j.unsafe.batchinsert.BatchInserters;
public class GraphImporter_v2 {
private long nodeIdx=0;
private Map<Long,Long> idxMap = new HashMap<Long, Long>();
enum RelType implements RelationshipType {
CALLS
}
private void createNode(long pnum, BatchInserter db) {
if(!idxMap.containsKey(pnum)) {
nodeIdx++;
idxMap.put(pnum, nodeIdx);
Map<String, Object> prop = new HashMap<String, Object>();
prop.put("Number", pnum);
db.createNode(nodeIdx, prop);
}
}
private long getNodeNum(long pnum) throws Exception {
if(idxMap.containsKey(pnum)) {
return idxMap.get(pnum);
} else {
throw new Exception("Missing number: "+pnum);
}
}
public static void main(String[] args) {
GraphImporter_v2 importer = new GraphImporter_v2();
importer.load(args[0], args[1]);
}
private void load(String inputFile, String dbpath) {
try {
File graphDb = new File(dbpath);
if (graphDb.exists()) {
FileUtils.deleteRecursively(graphDb);
}
long edges = 0;
long errorRows = 0;
Map<String, String> config = new HashMap<String, String>();
config = MapUtil.load( new File( "batch.properties" ) );
BatchInserter db = BatchInserters.inserter(dbpath, config);
BufferedReader reader = new BufferedReader(new FileReader(new File(inputFile)));
reader.readLine();
String line = null;
while ((line = reader.readLine()) != null) {
String[] lineData = line.split(",");
try {
createNode(Long.valueOf(lineData[0].replace("\"", "")), db);
createNode(Long.valueOf(lineData[1].replace("\"", "")), db);
} catch (NumberFormatException e) {
errorRows++;
}
edges++;
}
System.out.println("Total edges: "+edges);
System.out.println("Error edges: "+errorRows);
reader.close();
reader = new BufferedReader(new FileReader(new File(inputFile)));
System.out.println("Loading edges..");
long node1 = 0;
long node2 = 0;
reader.readLine();
line = null;
while ((line = reader.readLine()) != null) {
String[] lineData = line.split(",");
try {
node1 = getNodeNum(Long.valueOf(lineData[0].replace("\"", "")));
node2 = getNodeNum(Long.valueOf(lineData[1].replace("\"", "")));
Map<String, Object> prop = new HashMap<String, Object>();
prop.put("Duration", Integer.valueOf(lineData[2]));
prop.put("Cnt", Integer.valueOf(lineData[3]));
prop.put("Charge", Integer.valueOf(lineData[4]));
db.createRelationship(node1, node2, RelType.CALLS, prop);
} catch (NumberFormatException e) {}
}
db.shutdown();
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();