Neo4j3.5学习笔记——Traversal遍历之黑客帝国
跟着官网代码学习.jpg–jdk 1.8.0 & neo4j 3.5
https://neo4j.com/docs/java-reference/current/java-embedded/
目标:查找朋友以及朋友的朋友 + 找最终的Hacker
- 待实现节点关系图: 1. 节点以及关系建立 实现代码:
1)matrixNodeID = matrix.getId();
matrixNodeI是一个private long变量->仅用于存放Node matrix的ID,不是每新建一个Node都要更新一下;
2)Relationship rel2 = morpheus.createRelationshipTo(cypher, RelTypes.KNOWS); rel.setProperty("disclosure","public");
给relationship添加属性的方法;
3)Relationship rel2 = morpheus.createRelationshipTo(cypher, RelTypes.KNOWS); rel.setProperty("disclosure","public");
给relationship添加属性的方法;
private void createNodespace() {try (Transaction tx = graphDb.beginTx()) {Node matrix = graphDb.createNode();matrixNodeID = matrix.getId(); //matrixNodeID是一个private long变量->仅用于存放Node matrix的IDNode thomas = graphDb.createNode();thomas.setProperty("name", "Thomas Anderson");thomas.setProperty("age", "29");matrix.createRelationshipTo(thomas, RelTypes.NEO_NODE);Node trinity = graphDb.createNode();trinity.setProperty("name", "Trinity");Relationship rel = thomas.createRelationshipTo(trinity, RelTypes.KNOWS);rel.setProperty("age", "3 days");Node morpheus = graphDb.createNode();morpheus.setProperty("name", "Morpheus");morpheus.setProperty("occupation", "Total badass");morpheus.setProperty("rank", "Captain");Relationship rel1 = morpheus.createRelationshipTo(trinity, RelTypes.KNOWS);rel.setProperty("age", "12 years");thomas.createRelationshipTo(morpheus, RelTypes.KNOWS);Node cypher = graphDb.createNode();cypher.setProperty("last name", "Reagan");cypher.setProperty("name", "Cypher");Relationship rel2 = morpheus.createRelationshipTo(cypher, RelTypes.KNOWS);rel.setProperty("disclosure", "public");Node smith = graphDb.createNode();smith.setProperty("language", "C++");smith.setProperty("name", "Agent Smith");smith.setProperty("version", "1.0b");Relationship rel3 = cypher.createRelationshipTo(smith, RelTypes.KNOWS);rel3.setProperty("age", "6 months");rel3.setProperty("disclosure", "secret");Node architect = graphDb.createNode();architect.setProperty("name", "The Architect");smith.createRelationshipTo(architect, RelTypes.CODED_BY);tx.success();}
}
2. 找到朋友以及朋友的朋友 实现代码:
- 图的遍历:获取到与图中节点之间的关系相关的信息。进行遍历之前,需要对遍历的方式进行描述。描述信息由以下要素组成:
遍历的路径:通常用关系的类型和方向来表示;
遍历的顺序:深度优先depthFirst
& 广度优先breadthFirst
;
遍历的唯一性:可以指定在整个遍历中是否允许经过重复的节点、关系或路径;
遍历过程的决策器:用来在遍历过程中判断是否继续进行遍历,以及遍历过程的返回结果;
起始节点:遍历过程的起点。 - 遍历方式的描述信息由 org.neo4j.graphdb.traversal.TraversalDescription 接口来表示。通过 TraversalDescription 接口的方法可以描述上面介绍的遍历过程的不同要素。
- 注意要点:
1)matrixNodeID = matrix.getId();
matrixNodeI是一个private long变量->仅用于存放Node matrix的ID,不是每新建一个Node都要更新一下;
2)Traverser friendsTraverser = getFriends(neoNode);
Traverser类型:Implementing this interface allows an object to be the target of the “for-each loop” statement.
3)具体的遍历描述方法:通过Traverser类的description方法创建了一个默认的遍历描述对象,通过breadthFirst设置为广度优先的遍历方式,relationships方法设置遍历时经过的关系的类型;比较复杂的表示遍历过程决策器的evaluator方法,该方法的参数是org.neo4j.graphdb.traversal.Evaluator
接口的实现对象,Evaluator接口只有一个方法evaluate,evaluate方法的参数是Path接口的实现对象,表示当前的遍历路径,而evaluate方法的返回值是枚举类型org.neo4j.graphdb.traversal.Evaluation
,表示不同的处理策略。处理策略由两个方面组成:是否包含当前节点&是否继续进行遍历。Evaluator 接口的实现者需要根据遍历时的当前路径,做出相应的决策,返回适当的 Evaluation 类型的值。类org.neo4j.graphdb.traversal.Evaluators
提供了一些实用的方法来创建常用的 Evaluator 接口的实现对象。示例代码中使用了 Evaluators 类的一个方法Evaluators.excludeStartPosition()
,包含start节点;另一个方法Evaluators.pruneWhereLastRelationshipTypeIs
返回的 Evaluator 接口的实现对象会根据遍历路径的最后一个关系的类型来进行判断,如果关系类型满足给定的条件,则不再继续进行遍历。 - 感觉有点难以理解,其实就是设置个遍历方式+遍历经过的关系类型+evaluator(Evaluators.是否包含当前节点&是否继续进行遍历),返回的是Traverse类型。
private Traverser getFriends(final Node person) {TraversalDescription td = graphDb.traversalDescription().breadthFirst().relationships(RelTypes.KNOWS, Direction.OUTGOING).evaluator(Evaluators.excludeStartPosition());return td.traverse(person);
}
- 通过NodeID找节点:之前存过matrix的NodeID
matrixNodeID = matrix.getId();
,通过graphDb.getNodeById(NodeID)
找到matrix节点,再通过找关系类型的endNode来找到NeoNode。
private Node getNeoNode() {return graphDb.getNodeById(matrixNodeID).getSingleRelationship(RelTypes.NEO_NODE, Direction.OUTGOING).getEndNode();
}
- 找朋友的朋友:起始节点neoNode和遍历friendsTraverser。
for (Path friendPath : friendsTraverser) {}
得到遍历中的Path路径,用path.endNode()找到节点,再.getProperty()得到节点的属性。 - String类型是可以+的
public String printNeoFriends() {try ( Transaction tx = graphDb.beginTx()) {Node neoNode = getNeoNode();int numOfFriends = 0;String output = neoNode.getProperty("name") + "'s friends:\n";Traverser friendsTraverser = getFriends(neoNode);for (Path friendPath : friendsTraverser) {output += "At depth" + friendPath.length() + "=>"+friendPath.endNode().getProperty("name") + "\n";numOfFriends++;}output += "Number of friends found" + numOfFriends + "\n";return output;}
}
3. 找最终的Hacker 实现代码:
- 示例代码中使用了 Evaluators 类的一个方法
Evaluators.excludeStartPosition()
,包含start节点;另一个方法Evaluators.pruneWhereLastRelationshipTypeIs
返回的 Evaluator 接口的实现对象会根据遍历路径的最后一个关系的类型来进行判断,如果关系类型满足给定的条件,则不再继续进行遍历。
public String printMatrixHackers() {try (Transaction tx = graphDb.beginTx()) {String output = "Hackers:\n";int numOfHackers = 0;Traverser traverser = findHackers(getNeoNode());for(Path hackerPath : traverser) {output += "At depth " + hackerPath.length() + "=>"+ hackerPath.endNode().getProperty("name") + "\n";numOfHackers++;}output += "Number of hackers found: " + numOfHackers + "\n";return output;}}private Traverser findHackers(final Node startNode) {TraversalDescription td = graphDb.traversalDescription().breadthFirst().relationships(RelTypes.CODED_BY, Direction.OUTGOING).relationships(RelTypes.KNOWS, Direction.OUTGOING).evaluator(Evaluators.includeWhereLastRelationshipTypeIs(RelTypes.CODED_BY));return td.traverse(startNode);}
4. 具体代码: https://github.com/Amy996bbq/Neo4j/blob/master/learn/NewMatrix_1.java
Neo4j3.5学习笔记——Traversal遍历之黑客帝国相关推荐
- EasyX学习笔记(二、黑客帝国数据流)
EasyX学习笔记(二.黑客帝国数据流) 思路说明 main函数 startup函数 show函数 updatewithoutinput函数 结构 代码 思路说明 main函数 1.main函数中应包 ...
- Java数组学习笔记(遍历、排序、多维数组、命令行参数)
文章目录 数组的遍历和快速打印 冒泡排序和快速排序 数组和字符串排序的区别 多维数组建立和输出 命令行向main()传递参数 数组的遍历和快速打印 一.数组的遍历 数组的遍历有两种方法,一种是使用fo ...
- cocos2d-x学习笔记——各种遍历与范围for语句的使用
原文转自各种遍历与范围for语句的使用 遍历这东西,我的理解就是for语句的加强版啦.本来这种小技巧类型的博文应该放到Cocos2dx 小技巧这一栏里,但因为涉及到3.0的一些知识与C++ 11的新特 ...
- JavaSE中Map框架学习笔记
前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...
- [学习笔记] ES6的数组遍历方式 for, forEach,for...in, for...of
javascript ES6有如果要遍历一个数组,我们有多个方式可以进行. 下面我们来分析一下各自的利弊. for循环 const langs = ['java', 'php', 'c++', 'py ...
- python dict遍历_Python学习笔记:19个pythonic编程习惯,让你的Python入门更优雅
Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然. 要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优 ...
- QT学习笔记(九):遍历容器-迭代器(iterators)
QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...
- python学习笔记 os.scandir遍历目录
python学习笔记 os.scandir遍历目录 之前尝试用os.walk进行遍历目录,前几天看有人说os.scandir比walk更高效,尝试了一下,写了两端代码,做了一个测试 第一段用walk也 ...
- vue 循环勾选框_Vue学习笔记-遍历el-checkbox
Vue学习笔记-遍历el-checkout v-model="checkAll" :label="list.eventtypeid"> 全选 :label ...
最新文章
- 软件项目管理0820:项目经理的困境
- python 全局_全局关键字,带Python示例
- java emoji显示乱码_Java 解决Emoji表情过滤问题
- android中的websocket 应用
- 五、会话及其会话技术
- C++RAII惯用法:C++资源管理的利器
- bzoj 2555: SubString
- 矩阵运算_SLAM中用到的矩阵计算_基本公式及知识汇总
- 金色传说:SAP-BC-下载数据及导入,导出EXCEL文件的控制问题
- 操作系统原理,多道程序设计,并发环境与并发任务,进程定义,进程控制块PCB,PCB维护的进程数据
- Arduino C语言 240*240 TFT 显示屏绘制表盘手把手教学,粗暴易懂
- selenium 浏览器打开新标签页
- luogu P4238 【模板】多项式乘法逆
- Extraneous non-emits event listeners (onJump) were passed to component but could not be automaticall
- 苹果ios按键精灵deb包旧版本1.3.8安装方法 --- 越狱通用版
- python特殊变量方法 不懂_Python中的常见特殊方法—— del方法
- 梯度下降-5463. 服务中心的最佳位置
- C/C++新手看过来----讨厌的符号
- java-之冒泡排序法
- Wireshark lua插件