Mercurial > hg > Members > nobuyasu > TPPageRank
view src/pagerank/LinkToVertex.java @ 17:fcf2a7b4b867 draft default tip
modify loop method
author | one |
---|---|
date | Sat, 08 Sep 2012 10:04:48 +0900 |
parents | e1d758d08e9c |
children |
line wrap: on
line source
package pagerank; import java.util.HashMap; import com.tinkerpop.blueprints.Direction; import com.tinkerpop.blueprints.Edge; import com.tinkerpop.blueprints.Graph; import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.gremlin.java.GremlinPipeline; import com.tinkerpop.pipes.util.iterators.SingleIterator; import pagerank.WikiPage; public class LinkToVertex { Graph graph; public final static String PAGE_TITLE = "pageTitle"; public final static String PAGE_RANK = "pageRank"; /* pageIdTable * key: pageTitle value: Vertex ID */ private HashMap<String, Object> pageIdTable = new HashMap<String, Object>(); /* wikiPageHash * key: pageTitle value: wikiPage(class) */ private HashMap<String, WikiPage> wikiPageHash = new HashMap<String, WikiPage>(); private long AllVertexNumber; private final double weight = 0.85; public static final String HAS_LINK = "HasLink"; public LinkToVertex(Graph graph) { this.graph = graph; AllVertexNumber = 0; } public Object getId(String pageTitle) { return pageIdTable.get(pageTitle); } public boolean isHasLink(String label) { return label.equals(HAS_LINK); } public Vertex createVertex() { return graph.addVertex(null); } public Vertex createVertex(Object id) { return graph.addVertex(id); } Vertex createVertexWithProperty(String key, Object value, Object id) { Vertex v = createVertex(id); v.setProperty(key,value); return v; } Vertex createVertexWithProperty(String key, Object value) { return createVertexWithProperty(key, value, null); } public String getPageTitle(Vertex v) { return (String) v.getProperty(PAGE_TITLE); } public Double getPageRank(Vertex v) { return (Double) v.getProperty(PAGE_RANK); } Vertex createVertexWithPageTitle(String pageTitle, Object id) { Vertex v = createVertexWithProperty(PAGE_TITLE, pageTitle, id); setPageRank(v, (Double)0.0); pageIdTable.put(pageTitle, id ); return v; } Vertex createVertexWithPageTitle(String pageTitle) { return createVertexWithPageTitle(pageTitle, null); } Vertex setPageRank(Vertex v, Double rank) { v.setProperty(PAGE_RANK, rank); return v; } Vertex getVertex(String name) { Object id = pageIdTable.get(name); return graph.getVertex(id); } Vertex getVertexById(Object id) { return graph.getVertex(id); } Edge setRelationship(Vertex v1, Vertex v2, String label) { Edge e = graph.addEdge(null, v1, v2, label); return e; } Edge setHasLink(Vertex v1, Vertex v2) { return setRelationship(v1, v2, HAS_LINK); } void initPageRankAllVertex() { for (Vertex v : graph.getVertices()) { setPageRank(v, 0.0); } } public long searchAllVertices() { AllVertexNumber = 0; for (Vertex v : graph.getVertices()) { if ( (v.getProperty(PAGE_TITLE) != null) && (v.getProperty(PAGE_RANK)) != null ) { WikiPage wiki = new WikiPage(v); pageIdTable.put((String) v.getProperty(PAGE_TITLE), v.getId()); wiki.setInHasLink(computeInHasLink(v)); wiki.setOutHasLink(computeOutHasLink(v)); wikiPageHash.put((String) v.getProperty(PAGE_TITLE), wiki); AllVertexNumber++; } } return AllVertexNumber; } void searchRegiNodes(Vertex v) { if ( (v.getProperty(PAGE_TITLE) != null) && (v.getProperty(PAGE_RANK) != null)) { WikiPage wiki = new WikiPage(v); pageIdTable.put((String) v.getProperty(PAGE_TITLE), v.getId()); wiki.setInHasLink(computeInHasLink(v)); wiki.setOutHasLink(computeOutHasLink(v)); wikiPageHash.put((String) v.getProperty(PAGE_TITLE), wiki); AllVertexNumber++; } } HashMap<String, WikiPage> getWikiPageHash() { return wikiPageHash; } HashMap<String, Object> getPageIdTable() { return pageIdTable; } public Iterable<Vertex> getAllVertices() { return graph.getVertices(); } public void printAllVertices() { for (Vertex v : graph.getVertices() ) { System.out.println("ID = "+ v.getId()); for (String key: v.getPropertyKeys()) { System.out.println(key + "=" + v.getProperty(key)); } /* for (Edge e : v.getEdges(Direction.IN, HAS_LINK) ) { System.out.println(); } */ } System.out.println("--"); } public long computeOutHasLink(Vertex v) { long count = 0; for (Edge edge : v.getEdges(Direction.OUT, HAS_LINK)) { count++; } return count; } public long computeInHasLink(Vertex v) { long count = 0; for (Edge edge : v.getEdges(Direction.IN, HAS_LINK)) { count++; } return count; } public void printOutHasLink(Vertex v, int depth) { int numberOfLinkPages = 0; String output = "title:"+v.getProperty(PAGE_TITLE) + " outHasLink pages:"; System.out.println(output); for (Edge edge : v.getEdges(Direction.OUT, HAS_LINK)) { Vertex outV = edge.getVertex(Direction.IN); String str = (String) outV.getProperty(PAGE_TITLE); System.out.println(str); numberOfLinkPages++; } String numOutput = "Number of outHaslink pages: " + numberOfLinkPages; System.out.println(numOutput); } public void printInHasLink(Vertex v, int depth) { int numberOfLinkPages = 0; String output = "title:" +v.getProperty(PAGE_TITLE) + " inHasLink pages:"; System.out.println(output); for (Edge edge : v.getEdges(Direction.IN, HAS_LINK)) { Vertex outV = edge.getVertex(Direction.OUT); String str = (String) outV.getProperty(PAGE_TITLE); System.out.println(str); numberOfLinkPages++; } String numOutput = "Number of inHaslink pages: " + numberOfLinkPages + "\n"; System.out.println(numOutput); } public double computePageRank(Vertex v) { double sum = 0.0; double pageRank = 0.0; String title = getPageTitle(v); WikiPage wiki = wikiPageHash.get(title); for (Edge edge : v.getEdges(Direction.IN, HAS_LINK) ) { Vertex linkV = edge.getVertex(Direction.OUT); assert computeOutHasLink(linkV)!=0 ; double pr = (Double)linkV.getProperty(PAGE_RANK); sum += (double) pr / computeOutHasLink(linkV) ; } pageRank = (double) 1 - weight + (double) sum * weight; wiki.setRank(pageRank); v.setProperty(PAGE_RANK, pageRank); return pageRank; } public double computePageRankUsingPipes(Object id) { double sum = 0.0; double pageRank = 0.0; Vertex v = graph.getVertex(id); GremlinPipeline<Vertex,Vertex> pipe = new GremlinPipeline<Vertex,Vertex>(); pipe.start(graph.getVertex(id)).in("HasLink"); for (Vertex inVer : pipe) { Object inVerId = inVer.getId(); GremlinPipeline<Vertex,Vertex> inPipe = new GremlinPipeline<Vertex,Vertex>(); inPipe.start(graph.getVertex(inVerId)).out("HasLink"); long linkNum = inPipe.count(); double pr = (Double) inVer.getProperty(PAGE_RANK); sum += (double) pr / linkNum; } pageRank = (double) 1 - weight + (double) sum * weight; v.setProperty(PAGE_RANK, pageRank); return pageRank; } public void printVertexInfo(Object id) { Vertex v = graph.getVertex(id); if (v == null) { System.out.println(id+" is null."); return; } printInHasLink(v, 1); printOutHasLink(v, 1); String title = getPageTitle(v); double rank = getPageRank(v); long inHasLink = computeInHasLink(v); long outHasLink = computeOutHasLink(v); System.out.println("id:"+id+" title:"+title+" rank:"+rank); System.out.println("inHasLink:"+inHasLink+" outHasLink:"+outHasLink); System.out.println(); } public void printVertexInfo(String title) { Object id = getId(title); printVertexInfo(id); } }