在遍历Neo4j使用lamdba遍历list过滤器问题,怎么解决

* 终端设备可视化关系网图
* @param mac
* @throws Exception
public JSONObject findEquipByRestAPI(String mac) throws Exception {
JSONObject jsonData = new JSONObject();
Node startNode = findNode(phoneLabel, &mac&, mac.trim());
if (startNode == null)
if (startNode == null || !startNode.hasLabel(phoneLabel))
JSONArray nodeArray = new JSONArray();
JSONArray linksArray = new JSONArray();
JSONObject nodeobj = new JSONObject();
Iterator&String& proKeys = startNode.getPropertyKeys().iterator();
int i = 0;
nodeobj.put(&id&, i);
String key = &&;
while (proKeys.hasNext()) {
key = proKeys.next();
nodeobj.put(key, startNode.getProperty(key).toString());
nodeobj.put(&type&, &phone&);
HashMap&Integer,Integer& dict = new HashMap&Integer,Integer&();
dict.put((int)startNode.getId(), i);
nodeArray.add(nodeobj);
//获取关系下的路径
TraversalDescription ships = Traversal.description().breadthFirst()
.relationships(RelationType.CONTAIN)
.relationships(RelationType.REGISTER)
.relationships(RelationType.HAVE);
//遍历所有的关系path
for(Path path : ships.traverse(startNode)){
int start =0;
int end = 0;
/*Node start_Node = path.startNode();
Node end_Node = path.endNode();*/
// path = (21938)--[CONTAIN,22803]--&(21941)&--[CONTAIN,22049]--(21940)
Iterator&Relationship& it = path.relationships().iterator();
//遍历每条path
[CONTAIN,22803]
开始节点和结束节点
while(it.hasNext()){
Relationship next = it.next();
Node start_Node = next.getStartNode();
Node end_Node = next.getEndNode();
if(start_Node != end_Node){
if(dict.toString().contains(start_Node.getId()+&&)){
start = dict.get((int) start_Node.getId());
nodeobj = this.renderer(start_Node);
if(nodeobj.size() & 0 && nodeobj != null){
start = nodeArray.size();
nodeobj.put(&id&, start);
nodeArray.add(nodeobj);
dict.put((int) start_Node.getId(), start);
if(dict.toString().contains(end_Node.getId()+&&)){
end = dict.get((int)end_Node.getId());
nodeobj = this.renderer(end_Node);
if(nodeobj.size() & 0 && nodeobj != null){
end = nodeArray.size();
nodeobj.put(&id&, end);
nodeArray.add(nodeobj);
dict.put((int) end_Node.getId(), end);
JSONObject link = new JSONObject();
link.put(&source&, start);
link.put(&target&, end);
if(!linksArray.contains(link)){
linksArray.add(link);
/*Node start_Node = path.startNode();
Node end_Node = path.endNode();*/
jsonData.put(&links&, linksArray);
jsonData.put(&nodes&, nodeArray);
return jsonD
private JSONObject renderer(Node node) {
JSONArray nodeArray = new JSONArray();
JSONObject nodeobj = new JSONObject();
if (node.hasLabel(phoneLabel)) {
Iterator&String& proKeys = node.getPropertyKeys().iterator();
while (proKeys.hasNext()) {
String key = proKeys.next();
if (!&pic&.equals(key)) {
nodeobj.put(key, node.getProperty(key).toString());
nodeobj.put(&type&, &phone&);
nodeArray.add(nodeobj);
if (node.hasLabel(qqLabel)) {
Iterator&String& proKeys = node.getPropertyKeys().iterator();
while (proKeys.hasNext()) {
String key = proKeys.next();
if (!&pic&.equals(key)) {
nodeobj.put(key, node.getProperty(key).toString());
nodeobj.put(&type&, &qq&);
nodeArray.add(nodeobj);
if (node.hasLabel(emailLabel)) {
Iterator&String& proKeys = node.getPropertyKeys().iterator();
while (proKeys.hasNext()) {
String key = proKeys.next();
if (!&pic&.equals(key)) {
nodeobj.put(key, node.getProperty(key).toString());
nodeobj.put(&type&, &email&);
nodeArray.add(nodeobj);
if (node.hasLabel(accountLabel)) {
Iterator&String& proKeys = node.getPropertyKeys().iterator();
while (proKeys.hasNext()) {
String key = proKeys.next();
if (!&pic&.equals(key)) {
nodeobj.put(key, node.getProperty(key).toString());
nodeobj.put(&type&, &account&);
nodeArray.add(nodeobj);
if (node.hasLabel(personLabel)) {
Iterator&String& proKeys = node.getPropertyKeys().iterator();
while (proKeys.hasNext()) {
String key = proKeys.next();
nodeobj.put(key, node.getProperty(key).toString());
nodeobj.put(&type&, &person&);
nodeArray.add(nodeobj);
if (node.hasLabel(addressLabel)) {
Iterator&String& proKeys = node.getPropertyKeys().iterator();
while (proKeys.hasNext()) {
String key = proKeys.next();
nodeobj.put(key, node.getProperty(key).toString());
nodeobj.put(&type&, &address&);
nodeArray.add(nodeobj);
if (node.hasLabel(phonenumberLabel)) {
Iterator&String& proKeys = node.getPropertyKeys().iterator();
while (proKeys.hasNext()) {
String key = proKeys.next();
nodeobj.put(key, node.getProperty(key).toString());
nodeobj.put(&type&, &phonenumber&);
nodeArray.add(nodeobj);
if (node.hasLabel(wechatLabel)) {
Iterator&String& proKeys = node.getPropertyKeys().iterator();
while (proKeys.hasNext()) {
String key = proKeys.next();
nodeobj.put(key, node.getProperty(key).toString());
nodeobj.put(&type&, &wechat&);
nodeArray.add(nodeobj);
&Traversal框架的使用(Java版本)
http://blog.csdn.net/u/article/details/
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:418次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'Neo4j学习笔记(一)初识Neo4j - CSDN博客
Neo4j学习笔记(一)初识Neo4j
第一次听到Neo4j,是在前天,我接到了一个task,自己造一个Neo4j的服务,并用docker搭建一个Neo4j的服务器。这两天学习了一下Neo4j,本来不打算写Neo4j的博客了,造完服务就算了,但是越是到后面,越是觉得自己对Neo4j中的一些概念理解的不够透彻,从而直接影响了我的进度,我有了很多的疑惑。“理论支撑实践”,果然是至理名言,就像当年读书的时候,老师反反复复强调数据结构等一系列理论课很重要是一样的道理。遂此刻,回头整理知识点,还是那句话,温故而知新,每一次的重新阅读,都会有不一样的收获。
作为一款强健的,可伸缩的高性能数据库,Neo4j最适合完整的企业部署或者用于一个轻量级项目中完整服务器的一个子集存在。
它包括如下几个显著特点:
1.完整的ACID支持
2.高可用性
3.轻易扩展到上亿级别的节点和关系
4.通过遍历工具高速检索数据
适当的ACID操作是保证数据一致性的基础。Neo4j确保了在一个事务里面的多个操作同时发生,保证数据一致性。不管是采用嵌入模式还是多服务器集群部署,都支持这一特性。
可靠的图型存储可以非常轻松的集成到任何一个应用中。随着我们开发的应用在运营中不断发展,性能问题肯定会逐步凸显出来,而Neo4j不管应用如何变化,他只会受到计算机硬件性能的影响,不受业务本身的约束。部署一个neo4j服务器便可以承载上亿级的节点和关系。当然,当单节点无法承载我们的数据需求时,我们可以进行分布式集群部署。将图数据库用于存储关系复杂的数据是他最大的优势。通过Neo4j提供的遍历工具,可以非常高效的进行数据检索,每秒可以达到上亿级的检索量。一个检索操作类似于RDBMS里面的连接(join)操作。
什么是图数据库?
Neo4j是世界领先的开源图形数据库。 它完全由使用Java语言通过新技术的发展。
Schema的自由
没有SQL(Neo4j是使用CQL)
图形数据库
图形数据库也被称为图形数据库管理系统或GDBMS。
官方网站:
从关系型数据库(RDBMS)到图数据库(GDBMS)
图数据库是在图形结构的形式存储数据的数据库。 它存储在节点,关系和属性方面我们的应用程序的数据。 就像在表的“行,列”的形式的RDBMS存储数据,GDBMS在“图”的形式存储数据。
Relationships是图数据库中的很重要的部分(first-class citizens),不同于其他的数据库管理系统,图数据库连接两个实体(entities)是通过properties(属性),你可以类比于关系型数据库中的外键(foreign key)。通过组合简单抽象的nodes(节点)和relationships(关系)形成了一种连接结构,GDBMS让我们可以构建复杂的模型来映射我们所的问题域。
Neo4j的特点
SQL一样容易查询语言的Neo4j CQL
它遵循属性图数据模型
它通过使用Apache Lucence支持索引
它支持UNIQUE约束
它包含一个UI执行CQL指令:Neo4j的数据浏览器
它支持完整的ACID(原子性,一致性,隔离性和持久性)规则
它采用原生图形库与本地GPE(图形处理引擎)
它支持查询的数据导出到JSON和XLS格式
它提供了REST API由如Java,Spring等任何编程语言进行访问
它提供了Java Script支持以任何UI MVC框架如Node JS进行访问。
它支持两种类型的Java API:Cypher支架API和本地Java API来开发Java应用程序。
这是很容易以表示连接数据。
这是很容易和更快的检索更多的数据/遍历/导航。
它表示半结构化数据变得非常容易。
Neo4j的CQL查询语言命令在人性化的可读格式,非常简单易学。
它使用简单,功能强大的数据模型。
它不需要复杂的连接来获取连接/相关的数据,因为它是非常方便地检索它的相邻节点或关系的细节没有加入或索引。
它具有支持节点,关系和属性的数量的限制。
它不支持拆分。
Neo4j数据模型
如下如所示
这是我们从neo4j的管理端看到现有数据的关系,一个简单的图(graph),由此图引出Neo4j中很重要的三个概念:
Node: 图一中的圆点就是节点,图二中出现的MOVIEWS、USERS是节点的类型,用Label表示
Relationship: 图一中有方向的直线就是关系,HAS_SEEN、IS_FRIEND_OF表示两种不同关系
Property: Node和Relationship都会有属性,比如USERS类型的Node有属性name,用以表示人名(name:Kate Smith);关系HAS_SEEN有属性star,用以表示对该电影的评分(star:5)
三个要素:节点(node)、关系(relationship)、属性(property)
这两个节点和关系所包含的属性
关系连接节点
属性是键值对
节点用圆和关系使用箭头键各自的代表。
关系是有方向的:单向和双向。
每个关系包含“开始节点”或者“从节点”和“节点”或“端节点”
节点(Node)
构成一张图的基本元素是节点和关系。在Neo4j中,节点和关系都可以包含属性。 节点经常被用于表示一些实体,但依赖关系也一样可以表示实体。
关系(Relationship)
节点之间的关系是图数据库很重要的一部分。通过关系可以找到很多关联的数据,比如节点集合,关系集合以及他们的属性集合。
一个关系连接两个节点,必须有一个开始节点和结束节点。
因为关系总是直接相连的,所以对于一个节点来说,与他关联的关系看起来有输入/输出两个方向,这个特性对于我们遍历图非常有帮助:
关系在任一方向都会被遍历访问。这意味着我们并不需要在不同方向都新增关系。
而关系总是会有一个方向,所以当这个方向对你的应用没有意义时你可以忽略方向。
特别注意一个节点可以有一个关系是指向自己的:
为了将来增强遍历图中所有的关系,我们需要为关系设置类型。注意 关键字 type 在这可能会被误解,你其实可以把他简单的理解为一个标签而已。
属性(Property)
节点和关系都可以设置自己的属性。 属性是由Key-Value键值对组成,键名是字符串。属性值是要么是原始值,要么是原始值类型的一个数组。比如String、int和int[]都是合法的。
null不是一个合法的属性值。 Nulls能代替模仿一个不存在的Key。
路径(Path)
路径由至少一个节点,通过各种关系连接组成,经常是作为一个查询或者遍历的结果。
最短的路径是0长度的像下面这样:
长度为1的路径如下:
遍历(Traversal)
遍历一张图就是按照一定的规则,跟随他们的关系,访问关联的的节点集合。最多的情况是只有一部分子图被访问到,因为你知道你对那一部分节点或者关系感兴趣。
Neo4j提供了遍历的API,可以让你指定遍历规则。最简单的设置就是设置遍历是广度优先还是深度优先。后面我会花很多篇幅详细介绍。
本文已收录于以下专栏:
相关文章推荐
这篇博文目录如下:
- About neo4j
- Install neo4j
- learn to create and query data
- Import your data
欢迎各路大神临幸寒舍目录用 [TOC]来生成目录:欢迎各路大神临幸寒舍
创建节点关系
级次查询树形遍历
neo4j包含schema indexes 和 legacy indexes两种类型,两者理念不同且不可互换或兼容,实际应用中应明确检索需求后采用合适的索引。schema index vs legac...
按照总监要求看了两天的neo4j 数据库的使用。在网上找了一个基础教程类似于w3c.school的网站(英文 ,中文,中文的翻译的不是很好,如果英文不好可以辅助理解),这个教程基础知识很全全面,从数据...
Neo4j、Spring、图数据库、Spring Data Neo4j
最近在一些论坛或者新闻里看到了neo4j,一种擅长处理图形的数据库。 据说非常适合做一些join关系型的查询,所以抽空也看了下相关文档,给自己做个技术储备。
创建节点、关系创建节点(小明):create (n:people{name:’小明’,age:’18’,sex:’男’})
创建节点(小红): create (n:peopl...
如何将大规模数据导入Neo4j
项目需要基于Neo4j开发,由于数据量较大(数千万节点),因此对当前数据插入的方法进行了分析和对比。
常见数据插入方式概览
Neo4j 是一个高性能的 NoSQL 图形数据库。Neo4j 使用图(graph)相关的概念来描述数据模型,把数据保存为图中的节点以及节点之间的关系。很多应用中数据之间的关系,可以很直接地使用图中节...
Neo4j数据库是一种图形数据库(不知道这么翻译准不准,暂且这么称呼吧),这种数据库与传统的关系型数据库有很大的差别。为了更好地帮助大家理解我这里就将关系型数据库与图形数据库作个比较。
关系型数据库...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)neo4j深度遍历 - Neo4j 中文社区
这家伙很懒,什么个性签名都没有留下。
neo4j的深度遍历是不是很慢,几层以内速度还快的,但是当层级扩大到20层或者更多的时候,发现遍历只能靠递归来遍历 而且速度不是很客观,有毕竟好的解决方案么,还是说我对一个节点的子节点 只能通过 迭代递归的方式来进行一步一步获取数据
你该知道深度遍历20层后的 时间、空间复杂度吧,任何数据库都承受不住这样的复杂度啊, 这种深度遍历 不可以在项目中使用,只可以自己偶尔用下。
如果是项目中用 ,那你的数据结构设计的不合理啊,考虑幻想 节点、关系的组织结构吧
Neo4j 社区为国内最专业的 Neo4j 中文技术社区,致力于 Neo4j 的技术研究。
服务器搭建在
,存储赞助商为
新手搭建 Node.js 服务器,推荐使用无需备案的}

我要回帖

更多关于 使用迭代器遍历map 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信