Java实现Neo4j数据库的相关操作

http://qinxuye.me/article/introduction-to-neo4j/

package com.neo4j;
import java.io.File;
import java.io.IOException;

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.factory.GraphDatabaseFactory;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.index.Index;
import org.neo4j.graphdb.traversal.Evaluators;
import org.neo4j.graphdb.traversal.Traverser;
import org.neo4j.graphdb.traversal.TraversalDescription;
import org.neo4j.kernel.Traversal;
import org.neo4j.kernel.impl.util.FileUtils;
import org.neo4j.kernel.impl.util.StringLogger;
import org.neo4j.cypher.ExecutionEngine;
import org.neo4j.cypher.ExecutionResult;
import org.neo4j.graphalgo.PathFinder;
import org.neo4j.graphalgo.GraphAlgoFactory;

public class Example {
	
//	private static final String DB_PATH = "target/neo4jexample";
	private static final String DB_PATH = "testgraph.db";
	private static final String PRIMARY_KEY = "name";
	private GraphDatabaseService graphDB;
	private Index<Node> nodeIndex;
	private long startNodeId;
	
	private static enum RelTypes implements RelationshipType {
		NEO_NODE,
		KNOWS,
		CODED_BY
	}
	
	private void clearDB() {
		try {
			FileUtils.deleteRecursively(new File(DB_PATH));
		}
		catch(IOException e) {
			throw new RuntimeException(e);
		}
	}
	
	public void createDB() {
		clearDB();
		
		graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
		nodeIndex = graphDB.index().forNodes("nodes");
		registerShutdownHook(graphDB);
		
		Transaction tx = graphDB.beginTx();
		try {
            Node startNode = graphDB.createNode();
            startNodeId = startNode.getId();

            Node thomas = graphDB.createNode();
            thomas.setProperty( "name", "Thomas Anderson" );
            thomas.setProperty( "age", 29 );
            nodeIndex.add(thomas, PRIMARY_KEY, thomas.getProperty("name"));

            startNode.createRelationshipTo( thomas, RelTypes.NEO_NODE );

            Node trinity = graphDB.createNode();
            trinity.setProperty( "name", "Trinity" );
            nodeIndex.add(trinity, PRIMARY_KEY, trinity.getProperty("name"));
            Relationship rel = thomas.createRelationshipTo( trinity,
                    RelTypes.KNOWS );
            rel.setProperty( "age", "3 days" );
            Node morpheus = graphDB.createNode();
            morpheus.setProperty( "name", "Morpheus" );
            morpheus.setProperty( "rank", "Captain" );
            morpheus.setProperty( "occupation", "Total badass" );
            nodeIndex.add(morpheus, PRIMARY_KEY, morpheus.getProperty("name"));
            thomas.createRelationshipTo( morpheus, RelTypes.KNOWS );
            rel = morpheus.createRelationshipTo( trinity, RelTypes.KNOWS );
            rel.setProperty( "age", "12 years" );
            Node cypher = graphDB.createNode();
            cypher.setProperty( "name", "Cypher" );
            cypher.setProperty( "last name", "Reagan" );
            nodeIndex.add(cypher, PRIMARY_KEY, cypher.getProperty("name"));
            trinity.createRelationshipTo( cypher, RelTypes.KNOWS );
            rel = morpheus.createRelationshipTo( cypher, RelTypes.KNOWS );
            rel.setProperty( "disclosure", "public" );
            Node smith = graphDB.createNode();
            smith.setProperty( "name", "Agent Smith" );
            smith.setProperty( "version", "1.0b" );
            smith.setProperty( "language", "C++" );
            nodeIndex.add(smith, PRIMARY_KEY, smith.getProperty("name"));
            rel = cypher.createRelationshipTo( smith, RelTypes.KNOWS );
            rel.setProperty( "disclosure", "secret" );
            rel.setProperty( "age", "6 months" );
            Node architect = graphDB.createNode();
            architect.setProperty( "name", "The Architect" );
            nodeIndex.add(architect, PRIMARY_KEY, architect.getProperty("name"));
            smith.createRelationshipTo( architect, RelTypes.CODED_BY );
            
			tx.success();
		}
		finally {
			tx.finish();
		}
	}
	
	public Traverser getFriends(final Node person) {
		TraversalDescription td = Traversal.description()
			.breadthFirst()
			.relationships(RelTypes.KNOWS, Direction.OUTGOING)
			.evaluator(Evaluators.excludeStartPosition());
		return td.traverse(person);
	}
	
	public void printNodeFriends(Node node) {
//		Node neo = graphDB.getNodeById(startNodeId)
//			.getSingleRelationship(RelTypes.NEO_NODE, Direction.OUTGOING)
//			.getEndNode();
		int friendsNumbers = 0;
		System.out.println(node.getProperty(PRIMARY_KEY) + "'s friends:");
		for(Path friendPath: getFriends(node)) {
			System.out.println("At depth " + friendPath.length() + " => "
					+ friendPath.endNode().getProperty(PRIMARY_KEY));
			friendsNumbers++;
		}
		System.out.println("Number of friends found: " + friendsNumbers);
	}
	
	public void printCypherFriends(String name) {
		graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
		ExecutionEngine engine = new ExecutionEngine(graphDB, StringLogger.logger(DB_PATH));
//		ExecutionResult result = engine.execute(
//				"start n=node:nodes(name=\"" + name + "\") "
//				+ "match n-[:KNOWS*..]->f "
//				+ "return distinct f, f.name");
		ExecutionResult result = engine.execute("start n=node(500000) return n;");
		System.out.println(result.dumpToString());
	}
	
	public void printThomasFriends() {
		printNodeFriends(nodeIndex.get(PRIMARY_KEY, "Thomas Anderson").getSingle());
	}
	
	public Iterable<Path> findShortestPath(Node node1, Node node2) {
		PathFinder<Path> finder = GraphAlgoFactory.shortestPath(
				Traversal.expanderForTypes(RelTypes.KNOWS, Direction.OUTGOING), 5);
		Iterable<Path> paths = finder.findAllPaths(node1, node2);
		return paths;
	}
	
	public void printShortestPaths() {
		Node node1 = nodeIndex.get(PRIMARY_KEY, "Thomas Anderson").getSingle();
		Node node2 = nodeIndex.get(PRIMARY_KEY, "Agent Smith").getSingle();
		for(Path shortestPath: findShortestPath(node1, node2)) {
			System.out.println(shortestPath.toString());
		}
	}
	
	private static void registerShutdownHook(final GraphDatabaseService graphDB) {
		Runtime.getRuntime().addShutdownHook(new Thread() {
			@Override
			public void run() {
				graphDB.shutdown();
			}
		});
	}
	
	private void shutdown() {
		graphDB.shutdown();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Example example = new Example();
//		example.createDB();
		long t1 = System.currentTimeMillis();
//		example.printThomasFriends();
		example.printCypherFriends("Thomas Anderson");
		long t2 = System.currentTimeMillis();
		System.out.print(t2-t1);
		//example.printShortestPaths();
		example.shutdown();
	}

}


 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值