view src/pagerank/LinkToVertex.java @ 8:4d1885a2fa36 draft

fix method of calculation for computing PageRank.
author one
date Wed, 05 Sep 2012 17:19:59 +0900
parents c7b139ff27e2
children 9787663edb54
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 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(String 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);
		}
	}
	
	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); 
			if (computeInHasLink(linkV) == 0) {
				sum += (Double) linkV.getProperty(PAGE_RANK);
			} else {
				sum += ((Double) linkV.getProperty(PAGE_RANK)) / computeInHasLink(linkV) ;
			}
		}
		pageRank = (double) (1 - weight) / AllVertexNumber
				+ (double) sum * weight;

		wiki.setRank(pageRank);
		v.setProperty(PAGE_RANK, pageRank);
		return pageRank;
	}
	
	public void printVertexInfo(int nodeId) {
		Vertex v = graph.getVertex(nodeId);
		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:"+nodeId+" title:"+title+" rank:"+rank);
		System.out.println("inHasLink:"+inHasLink+" outHasLink:"+outHasLink);
		System.out.println();
	
	}

}