|
package com.raj.facebook.graph; |
|
|
|
import java.io.BufferedReader; |
|
import java.io.File; |
|
import java.io.FileReader; |
|
|
|
import org.neo4j.graphalgo.GraphAlgoFactory; |
|
import org.neo4j.graphalgo.PathFinder; |
|
import org.neo4j.graphdb.GraphDatabaseService; |
|
import org.neo4j.graphdb.Node; |
|
import org.neo4j.graphdb.Path; |
|
import org.neo4j.graphdb.Relationship; |
|
import org.neo4j.graphdb.RelationshipType; |
|
import org.neo4j.graphdb.Transaction; |
|
import org.neo4j.graphdb.factory.GraphDatabaseFactory; |
|
import org.neo4j.graphdb.index.IndexHits; |
|
import org.neo4j.kernel.Traversal; |
|
|
|
public class GraphUtils { |
|
|
|
public static final String DB_PATH="c://apps//neo4j-1.8.2//facebook"; |
|
public static GraphDatabaseService graphDb = null; |
|
public static final String ID = "id"; |
|
public static final String USER = "user:"; |
|
|
|
public static void main(String[] args) throws Exception { |
|
new GraphUtils().createGraph(); |
|
} |
|
|
|
public void createGraph() throws Exception { |
|
|
|
graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH ); |
|
registerShutdownHook( graphDb ); |
|
File file = new File("C:\\Project\\workspace\\FacebookGraph\\resources\\Raju Ramakrishna_1364522831.graphml"); |
|
BufferedReader br = new BufferedReader(new FileReader(file)); |
|
String line = br.readLine(); |
|
Node node = null; |
|
String key = null; |
|
String val = null; |
|
String source = null; |
|
String target = null; |
|
|
|
Transaction tx = graphDb.beginTx(); |
|
Node myself = graphDb.createNode(); |
|
myself.setProperty("fb_id", "Raju_Ramakrishna_100000243684316"); |
|
myself.setProperty("uid", "100000243684316"); |
|
myself.setProperty("name", "Raju Ramakrishna"); |
|
myself.setProperty("sex", "male"); |
|
myself.setProperty("mutual_friends", 27); |
|
myself.setProperty("likes", 16); |
|
myself.setProperty("friend_count", 180); |
|
|
|
graphDb.index().forNodes("myfriends").add(myself, "fb_id", "Raju_Ramakrishna_100000243684316"); |
|
while( line != null ) { |
|
if(line.indexOf("node id") != -1) { |
|
val = line.substring(line.indexOf("node id")+9, line.length()-2); |
|
System.out.println("ID=" +val); |
|
node = graphDb.createNode(); |
|
node.setProperty("fb_id", val); |
|
graphDb.index().forNodes("myfriends").add(node, "fb_id", val); |
|
Relationship relationship = myself.createRelationshipTo(node, RelTypes.FRIEND); |
|
relationship.setProperty("link", myself.getProperty("fb_id") + " <==> " +node.getProperty("fb_id")); |
|
} else if(line.indexOf("</node>") != -1) { |
|
System.out.println("----------"); |
|
} else if(line.indexOf("data key") != -1){ |
|
if(line.indexOf("uid") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Label = " +val); |
|
node.setProperty("uid", val); |
|
} else if(line.indexOf("name") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Name = " +val); |
|
node.setProperty("name", val); |
|
} else if(line.indexOf("sex") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Sex = " +val); |
|
node.setProperty("sex", val); |
|
} else if(line.indexOf("mutual_friend_count") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Mutual Friends = " +val); |
|
node.setProperty("mutual_friends", val); |
|
} else if(line.indexOf("likes_count") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Likes = " +val); |
|
node.setProperty("likes", val); |
|
} else if(line.indexOf("friend_count") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Friends = " +val); |
|
node.setProperty("friend_count", val); |
|
} else if(line.indexOf("pic_big") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("picture = " +val); |
|
// node.setProperty("picture", val); |
|
} |
|
} else if(line.indexOf("edge id") != -1) { |
|
source = line.substring(line.indexOf("source")+8, line.indexOf("target")-2); |
|
target = line.substring(line.indexOf("target")+8, line.indexOf("</edge>")-2); |
|
System.out.println(source+ " ---- " +target); |
|
Node sourceNode = graphDb.index().forNodes("myfriends").get("fb_id", source).next(); |
|
Node targetNode = graphDb.index().forNodes("myfriends").get("fb_id", target).next(); |
|
Relationship relationship = sourceNode.createRelationshipTo(targetNode, RelTypes.FRIEND); |
|
relationship.setProperty("link", sourceNode.getProperty("fb_id") + " <==> " +targetNode.getProperty("fb_id")); |
|
} |
|
line = br.readLine(); |
|
} |
|
|
|
br.close(); |
|
|
|
file = new File("C:\\Project\\workspace\\FacebookGraph\\resources\\Geeta Raj_1364532420.graphml"); |
|
br = new BufferedReader(new FileReader(file)); |
|
line = br.readLine(); |
|
|
|
boolean nodeFound = false; |
|
myself = graphDb.index().forNodes("myfriends").get("fb_id", "Geeta_Raj_556485423").next(); |
|
|
|
while( line != null ) { |
|
if(line.indexOf("node id") != -1) { |
|
val = line.substring(line.indexOf("node id")+9, line.length()-2); |
|
System.out.println("ID=" +val); |
|
IndexHits<Node> nodes = graphDb.index().forNodes("myfriends").get("fb_id", val); |
|
if( nodes.hasNext() ) { |
|
node = nodes.next(); |
|
nodeFound = true; |
|
} else { |
|
node = graphDb.createNode(); |
|
node.setProperty("fb_id", val); |
|
graphDb.index().forNodes("myfriends").add(node, "fb_id", val); |
|
Relationship relationship = myself.createRelationshipTo(node, RelTypes.FRIEND); |
|
relationship.setProperty("link", myself.getProperty("fb_id") + " <==> " +node.getProperty("fb_id")); |
|
} |
|
} else if(line.indexOf("</node>") != -1) { |
|
nodeFound = false; |
|
System.out.println("----------"); |
|
} else if( !nodeFound && line.indexOf("data key") != -1){ |
|
if(line.indexOf("uid") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Label = " +val); |
|
node.setProperty("uid", val); |
|
} else if(line.indexOf("name") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Name = " +val); |
|
node.setProperty("name", val); |
|
} else if(line.indexOf("sex") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Sex = " +val); |
|
node.setProperty("sex", val); |
|
} else if(line.indexOf("mutual_friend_count") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Mutual Friends = " +val); |
|
node.setProperty("mutual_friends", val); |
|
} else if(line.indexOf("likes_count") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Likes = " +val); |
|
node.setProperty("likes", val); |
|
} else if(line.indexOf("friend_count") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("Friends = " +val); |
|
node.setProperty("friend_count", val); |
|
} else if(line.indexOf("pic_big") != -1) { |
|
key = "CDATA"; |
|
val = line.substring(line.indexOf(key)+key.length()+1, line.indexOf("</data>")-3); |
|
System.out.println("picture = " +val); |
|
// node.setProperty("picture", val); |
|
} |
|
} else if(line.indexOf("edge id") != -1) { |
|
source = line.substring(line.indexOf("source")+8, line.indexOf("target")-2); |
|
target = line.substring(line.indexOf("target")+8, line.indexOf("</edge>")-2); |
|
System.out.println(source+ " ---- " +target); |
|
Node sourceNode = graphDb.index().forNodes("myfriends").get("fb_id", source).next(); |
|
Node targetNode = graphDb.index().forNodes("myfriends").get("fb_id", target).next(); |
|
|
|
//Only if there is no link already |
|
PathFinder<Path> finder = GraphAlgoFactory.shortestPath( |
|
Traversal.expanderForTypes( RelTypes.FRIEND ), 1 ); |
|
Iterable<Path> paths = finder.findAllPaths( sourceNode, targetNode ); |
|
if(!paths.iterator().hasNext()) { |
|
Relationship relationship = sourceNode.createRelationshipTo(targetNode, RelTypes.FRIEND); |
|
relationship.setProperty("link", sourceNode.getProperty("fb_id") + " <==> " +targetNode.getProperty("fb_id")); |
|
} |
|
} |
|
line = br.readLine(); |
|
} |
|
|
|
br.close(); |
|
|
|
tx.success(); |
|
tx.finish(); |
|
} |
|
|
|
|
|
public static enum RelTypes implements RelationshipType { |
|
FRIEND |
|
} |
|
|
|
|
|
|
|
private static void registerShutdownHook( final GraphDatabaseService graphDb ) |
|
{ |
|
// Registers a shutdown hook for the Neo4j instance so that it |
|
// shuts down nicely when the VM exits (even if you "Ctrl-C" the |
|
// running example before it's completed) |
|
Runtime.getRuntime().addShutdownHook( new Thread() |
|
{ |
|
@Override |
|
public void run() |
|
{ |
|
graphDb.shutdown(); |
|
} |
|
} ); |
|
} |
|
|
|
} |