跟着官网代码学习.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的NodeIDmatrixNodeID = 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遍历之黑客帝国相关推荐

  1. EasyX学习笔记(二、黑客帝国数据流)

    EasyX学习笔记(二.黑客帝国数据流) 思路说明 main函数 startup函数 show函数 updatewithoutinput函数 结构 代码 思路说明 main函数 1.main函数中应包 ...

  2. Java数组学习笔记(遍历、排序、多维数组、命令行参数)

    文章目录 数组的遍历和快速打印 冒泡排序和快速排序 数组和字符串排序的区别 多维数组建立和输出 命令行向main()传递参数 数组的遍历和快速打印 一.数组的遍历 数组的遍历有两种方法,一种是使用fo ...

  3. cocos2d-x学习笔记——各种遍历与范围for语句的使用

    原文转自各种遍历与范围for语句的使用 遍历这东西,我的理解就是for语句的加强版啦.本来这种小技巧类型的博文应该放到Cocos2dx 小技巧这一栏里,但因为涉及到3.0的一些知识与C++ 11的新特 ...

  4. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  5. [学习笔记] ES6的数组遍历方式 for, forEach,for...in, for...of

    javascript ES6有如果要遍历一个数组,我们有多个方式可以进行. 下面我们来分析一下各自的利弊. for循环 const langs = ['java', 'php', 'c++', 'py ...

  6. python dict遍历_Python学习笔记:19个pythonic编程习惯,让你的Python入门更优雅

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然. 要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优 ...

  7. QT学习笔记(九):遍历容器-迭代器(iterators)

    QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...

  8. python学习笔记 os.scandir遍历目录

    python学习笔记 os.scandir遍历目录 之前尝试用os.walk进行遍历目录,前几天看有人说os.scandir比walk更高效,尝试了一下,写了两端代码,做了一个测试 第一段用walk也 ...

  9. vue 循环勾选框_Vue学习笔记-遍历el-checkbox

    Vue学习笔记-遍历el-checkout v-model="checkAll" :label="list.eventtypeid"> 全选 :label ...

最新文章

  1. 软件项目管理0820:项目经理的困境
  2. python 全局_全局关键字,带Python示例
  3. java emoji显示乱码_Java 解决Emoji表情过滤问题
  4. android中的websocket 应用
  5. 五、会话及其会话技术
  6. C++RAII惯用法:C++资源管理的利器
  7. bzoj 2555: SubString
  8. 矩阵运算_SLAM中用到的矩阵计算_基本公式及知识汇总
  9. 金色传说:SAP-BC-下载数据及导入,导出EXCEL文件的控制问题
  10. 操作系统原理,多道程序设计,并发环境与并发任务,进程定义,进程控制块PCB,PCB维护的进程数据
  11. Arduino C语言 240*240 TFT 显示屏绘制表盘手把手教学,粗暴易懂
  12. selenium 浏览器打开新标签页
  13. luogu P4238 【模板】多项式乘法逆
  14. Extraneous non-emits event listeners (onJump) were passed to component but could not be automaticall
  15. 苹果ios按键精灵deb包旧版本1.3.8安装方法 --- 越狱通用版
  16. python特殊变量方法 不懂_Python中的常见特殊方法—— del方法
  17. 梯度下降-5463. 服务中心的最佳位置
  18. C/C++新手看过来----讨厌的符号
  19. java-之冒泡排序法
  20. Wireshark lua插件

热门文章

  1. 2022软件测试自学路线分享,附完整资料,自学也能拿高薪哟
  2. QT_OpenGL渲染总结
  3. canvas绘图有锯齿毛边问题的解决
  4. codesensor:将代码转化为ast后再转化为文本向量
  5. 【Android 学习】之二维码扫描开发(闪光灯功能)
  6. 生命密码是几适合学计算机,生命密码学
  7. 精准控制的开关电脉冲表征GST薄膜的相变行为(2121.8.29,cyy)
  8. 蓝牙耳机一个响一个不响怎么办
  9. 这些道理不懂,你注定就是穷打工的命!
  10. SQL server-数据库的创建