bolt在java,java neo4j bolt

java neo4j bolt

您好,很高兴为您解答:

neo4j是一个嵌入式,基于磁盘的,支持完整事务的java持久化引擎,它在图像中而不是表中存储数据。neo4j提供了大规模可扩展性,在一台机器上可以处理数十亿节点/关系/属性的图像,可以扩展到多台机器并行运行。

相对于关系数据库来说,图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。

neo4j重点解决了拥有大量连接的传统rdbms在查询时出现的性能衰退问题。通过围绕图形进行数据建模,neo4j会以相同的速度遍历节点与边,其遍历速度与构成图形的数据量没有任何关系。

此外,neo4j还提供了非常快的图形算法、推荐系统和olap风格的分析,而这一切在目前的rdbms系统中都是无法实现的。

转载,仅供参考。

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 IndexnodeIndex;

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 IterablefindShortestPath(Node node1, Node node2) {

PathFinderfinder = GraphAlgoFactory.shortestPath(

Traversal.expanderForTypes(RelTypes.KNOWS, Direction.OUTGOING), 5);

Iterablepaths = 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();

}

}

0

0

0

0

b4220bf761c1e6d35f6ada31fee712c4.png

评论(0)

“还没有人发表评论,快去抢占沙发吧”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值