这篇blog主要和大家分享一下neo4j中是如何对节点进行遍历,和其中集成的图论的一些常用算法。
遍历
http://docs.neo4j.org.cn/tutorials-java-embedded-traversal.html 这是neo4j官方的中文教程。
private static Traverser getFriends(Node node )
{
TraversalDescription td = Traversal.description()
.breadthFirst()
.relationships( RelTypes.KNOWS, Direction.OUTGOING )
.evaluator( Evaluators.excludeStartPosition() );
return td.traverse( node );
}
TraversalDescription提供了用户遍历节点的方法,并且用户需要自己添加遍历的条件。
首先用户可以定义是使用深度优先还收广度优先 breadthFirst() 和 depthFirst();relationships定义了遍历取得节点的关系类型,是入度Direction.INCOMING还是出度Direction.OUTGOING还是both;evaluator用来定义筛选的条件,比如去掉开始节点,结束节点,遍历深度(toDepth(3))等,具体可以参照官方的API文档。
int num = 0;
String result = neoNode.getProperty( "name" ) + "'s friends:\n";
Traverser friendsTraverser = getFriends( neoNode );
for ( Path friendPath : friendsTraverser )
{
output += "At depth " + friendPath.length() + " => "
+ friendPath.endNode()
.getProperty( "name" ) + "\n";
numberOfFriends++;
}
output += "Number of friends found: " + numberOfFriends + "\n";
打印出结果
Thomas Anderson's friends:
At depth 1 => Trinity
At depth 1 => Morpheus
At depth 2 => Cypher
At depth 3 => Agent Smith
找到朋友的数量: 4
下面介绍如何按照一个预先定义好的顺序遍历图。
创建一个数据库
Node A = db.createNode();
Node B = db.createNode();
Node C = db.createNode();
Node D = db.createNode();
A.createRelationshipTo( B, REL1 );
B.createRelationshipTo( C, REL2 );
C.createRelationshipTo( D, REL3 );
A.createRelationshipTo( C, REL2 );
现在关系(REL1-->REL2-->REL), 当遍历的时候,Evaluator能够对它进行检验,确保只有该关系顺序的路径才会被包括。
ArrayList<RelationshipType> orderedPathContext = new ArrayList<RelationshipType>();
orderedPathContext.add( REL1 );
orderedPathContext.add( withName( "REL2" ) );
orderedPathContext.add( withName( "REL3" ) );
TraversalDescription td = Traversal.description()
.evaluator( new Evaluator()
{
@Override
public Evaluation evaluate( final Path path )
{
if ( path.length() == 0 )
{
return Evaluation.EXCLUDE_AND_CONTINUE;
}
RelationshipType expectedType = orderedPathContext.get( path.length() - 1 );
boolean isExpectedType = path.lastRelationship()
.isType( expectedType );
boolean included = path.length() == orderedPathContext.size()
&& isExpectedType;
boolean continued = path.length() < orderedPathContext.size()
&& isExpectedType;
return Evaluation.of( included, continued );
}
} );
打印出结果
Traverser traverser = td.traverse( A );
PathPrinter pathPrinter = new PathPrinter( "name" );
for ( Path path : traverser )
{
output += Traversal.pathToString( path, pathPrinter );
}
用户也可以通过自定义格式输出路径。
static class PathPrinter implements Traversal.PathDescriptor<Path>
{
private final String nodePropertyKey;
public PathPrinter( String nodePropertyKey )
{
this.nodePropertyKey = nodePropertyKey;
}
@Override
public String nodeRepresentation( Path path, Node node )
{
return "(" + node.getProperty( nodePropertyKey, "" ) + ")";
}
@Override
public String relationshipRepresentation( Path path, Node from,
Relationship relationship )
{
String prefix = "--", suffix = "--";
if ( from.equals( relationship.getEndNode() ) )
{
prefix = "<--";
}
else
{
suffix = "-->";
}
return prefix + "[" + relationship.getType().name() + "]" + suffix;
}
}
图算法
neo4j中集成了一些常用的图算法,包括最短路径,Dijkstra,A*算法。
最短路径
public Iterable<Path> findShortestPath(Node node1, Node node2) {
PathFinder<Path> finder = GraphAlgoFactory.shortestPath(
Traversal.expanderForTypes(RelTypes.KNOWS, Direction.BOTH), 10);
Iterable<Path> paths = finder.findAllPaths(node1, node2);
return paths;
}
for(Path shortestPath: findShortestPath(aa, ab)) {
System.out.println(shortestPath.toString());
}
Traversal.expanderForTypes用来定义遍历的深度和节点关系的出入度。
Dijkstra解决有向图中任意两个顶点之间的最短路径问题。
PathFinder<WeightedPath> finder = GraphAlgoFactory.dijkstra(
Traversal.expanderForTypes( ExampleTypes.MY_TYPE, Direction.BOTH ), "cost" );
WeightedPath path = finder.findSinglePath( nodeA, nodeB );
path.weight();
使用 A*算法是解决静态路网中求解最短路最有效的方法。
Node nodeA = createNode( "name", "A", "x", 0d, "y", 0d );
Node nodeB = createNode( "name", "B", "x", 7d, "y", 0d );
Node nodeC = createNode( "name", "C", "x", 2d, "y", 1d );
Relationship relAB = createRelationship( nodeA, nodeC, "length", 2d );
Relationship relBC = createRelationship( nodeC, nodeB, "length", 3d );
Relationship relAC = createRelationship( nodeA, nodeB, "length", 10d );
EstimateEvaluator<Double> estimateEvaluator = new EstimateEvaluator<Double>()
{
public Double getCost( final Node node, final Node goal )
{
double dx = (Double) node.getProperty( "x" ) - (Double) goal.getProperty( "x" );
double dy = (Double) node.getProperty( "y" ) - (Double) goal.getProperty( "y" );
double result = Math.sqrt( Math.pow( dx, 2 ) + Math.pow( dy, 2 ) );
return result;
}
};
PathFinder<WeightedPath> astar = GraphAlgoFactory.aStar(
Traversal.expanderForAllTypes(),
CommonEvaluators.doubleCostEvaluator( "length" ), estimateEvaluator );
WeightedPath path = astar.findSinglePath( nodeA, nodeB );
分享到:
相关推荐
Neo4jCn56 将ConceptNet5.6导入Neo4j 3.4.1。 使用Neo4j遍历框架从conceptNet提取路径。
火车路线规划师neo4j测试为火车路线计划员使用Neo4j遍历API
好用的基于Neo4j的算法开发库,里面有丰富的高级算法可以使用
Neo4j的高效图算法 Graph Data Science(GDS)库已弃用该库,现在可在我们的或通过的github存储库中找到该库。 这是对图形算法库的更新,功能包括您所有喜欢的图形算法-和一些新算法-以及新的,统一的和简化的表面...
neo4j图形数据库的计算引擎算法介绍,包括广度优先、深度优先等
第二部分,调研图神经网络算法,重点调研 graphsage 算法及其实现原理,并尝试 neo4j 跑出一班结果; 第三部分,图嵌入 graph embedding 算法调研,重点理解 node2vec 等图嵌入算法实现原理; 第四部分,以 PageRank...
蓝图 创建图形并使用 Blueprint (Neo4j) 遍历它
3. Neo4j图数据库 II. 教程 4. 在Java应用中使用Neo4j 5. Neo4j远程客户端库 6. 遍历查询框架 7. 数据模型范例 8. 多语言支持 9. 在Python应用中使用Neo4j 10. 扩展Neo4j服务器 III. 参考 11. ...
用于neo4j数据库中的算法插件包,下载后需要放入plugin文件夹下,并修改neo4j的config文件,最后重启服务可以使用
手把手教学小型金融知识图谱构建:图谱建立、图数据库neo4j、图算法、关系预测、命名实体识别等。更多详细内容见资料对应博客
大数据算法在数据分析中发挥着重要的作用,它可以提高分析工作的效率和准确性,为决策提供有力支持。具体来说,大数据算法可以分类、聚类、预测和关联规则分析等,从而发现数据之间的规律和关联关系,挖掘出潜在的...
neo4j图数据库的算法 algo jar包,从3.1至3.5版本
neo4j api neo4j学习资料 neo4j教程 │ neo4j官方API(官方各种API的文档整理).7z ...│ neo4j笔记.docx ... │ 数据分页处理系列之三:Neo4j图数据分页处理.html │ 暖暖动听.html │ 飘涯 - 简书.html
本文重点介绍了Adamic-Adar算法、Common Neighbors、PreferentialAttachment等相关内容。 本文来自简书,由火龙果软件Anna编辑、推荐。链接预测是图数据挖掘中的一个重要问题。链接预测旨在预测图中丢失的边, 或者...
neo4j社区版 用户名 neo4j 密码neo4j
springboot集成neo4j图数据库,使用java语言连接数据库mysql和neo4j,实现将mysql数据插入neo4j中。 实现的功能有对neo4j数据进行统计分析、关系遍历增删改查等 。并且使用d3对查询结果数据进行页面展示!
全部java编写的neo4j课程课件和代码,一共23张课件和20套代码,零基础到精通的neo4j使用开发,是唯一的知识图谱相关的案例代码
推荐系统教程_第7周 社交网络好友推荐,图算法,在图数据库Neo4j上的实现.rar
一个图由无数的节点和关系组成。 安装图数据库在这里就不介绍了,本篇主要介绍如何连接neo4j数据库,将知识图谱成功显示在前端页面中。 Neovis.js与Neo4j的连接非常简单明了,并且Neovis 的数据格式与那neo4j...
java11+neo4j4.3+gds1.6.rar java11+neo4j4.3+gds1.6.rar java11+neo4j4.3+gds1.6.rar java11+neo4j4.3+gds1.6.rar java11+neo4j4.3+gds1.6.rar