view src/wikigraph/LinkToNode.java @ 20:2c3a10047ec6 draft

add ReadWikiLink.java and LinkToNode.java
author one
date Mon, 27 Aug 2012 04:30:53 +0900
parents
children f9ef906676eb
line wrap: on
line source

package wikigraph;

import java.util.HashMap;

import org.neo4j.graphdb.Direction;
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.traversal.Evaluators;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.graphdb.traversal.Traverser;
import org.neo4j.kernel.Traversal;
import org.neo4j.tooling.GlobalGraphOperations;


public class LinkToNode {

	GraphDatabaseService graphDb;
	GlobalGraphOperations graphOpe;

	public final String PAGE_TITLE = "page_title";
//	private HashSet<String> names = new HashSet<String>();
	private HashMap<String,Long> namesTable = new HashMap<String,Long>();
	
	public enum RelTypes implements RelationshipType {
		HAS_LINK
	}

	LinkToNode(GraphDatabaseService graphDb) {
		this.graphDb = graphDb;
		this.graphOpe = GlobalGraphOperations.at(graphDb);
	}
	
	void setGraphDb(GraphDatabaseService graphDb) {
		this.graphDb = graphDb;
		this.graphOpe = GlobalGraphOperations.at(graphDb);
	}

	Long getId(String pageTitle) {
		return namesTable.get(pageTitle);
	}
	
	private Node createNode() {
		return graphDb.createNode();
	}
	
	private Node createNodeWithProperty(String key, Object value) {
		Node node = createNode();
		node.setProperty(key,value);
		return node;
	}
	
	Node createNodeWithPageTitle(String pageTitle){
		Node node = createNodeWithProperty(PAGE_TITLE, pageTitle);
		namesTable.put(pageTitle,  node.getId());
		return node;
	}

	Node getNode(String name) {
		long id = namesTable.get(name);
		return graphDb.getNodeById(id);
	}
	
	void setRelationship(Node node1, Node node2, RelTypes type) { 
		node1.createRelationshipTo(node2, type);
	}

	void setHasLink(Node node1, Node node2) {
		setRelationship(node1, node2, RelTypes.HAS_LINK);
	}
	
	void searchPageTitleAllNodes() {
		for (Node n: graphOpe.getAllNodes()) {
			if (n.hasProperty(PAGE_TITLE))
				namesTable.put((String)n.getProperty(PAGE_TITLE), n.getId());
		}
	}
	
	HashMap<String,Long> getNamesTable() {
		return namesTable;
	}
	
	public void printAllNodes() {
		for (Node n: graphOpe.getAllNodes()) {
			System.out.println("ID="+ n.getId());
			for (String key: n.getPropertyKeys()) {
				System.out.println(key + "=" + n.getProperty(key));
			}
			Iterable<Relationship> relIter = n.getRelationships(RelTypes.HAS_LINK);
			for (Relationship rel : relIter ) {
				System.out.println(rel);
			}
			System.out.println("--");
		}

	}

	public Traverser getHasLink( final Node person) {
		TraversalDescription td = Traversal.description()
				.breadthFirst()
				.relationships( RelTypes.HAS_LINK, Direction.OUTGOING )
				.evaluator( Evaluators.excludeStartPosition());
		return td.traverse( person );
	}

	public void searchHasLink(final Node node) {
		int numberOfLinkPages = 0;
		String output = node.getProperty(PAGE_TITLE) + " have link pages:\n";
		Traverser hasLinkTraverser = getHasLink( node );
		for ( Path hasLinkPath : hasLinkTraverser) {
			output += "At depth " + hasLinkPath.length() + " => "
					+ hasLinkPath.endNode()
						.getProperty(PAGE_TITLE) + "\n";
			numberOfLinkPages++;
		}
		output += "Number of link pages: " + numberOfLinkPages + "\n";
		System.out.println(output);
	}
	
}