Neo4j 多层查询结果使用VIS.js展示问题求教

ZHU HAI 2019-09-06 11:41:53
近期在使用VIS.js对Neo4j的查询结果进行可视化展示。实现目标是查询两个公司之间的关系并使用VIS.js展示出来,包括多层关系,即包括间接关系。
使用的web框架为Django+py2neo,实现的步骤为:
1.使用py2neo查出两个公司的关系,这里只查1层关系和2层关系,如下:
MATCH p=(n3:企业 {name:"哈尔滨银行股份有限公司"}) <-[rel_tmp*1..3]-> (n4:企业{name:"延寿融兴村镇银行有限责任公司"}) with nodes(p) as nn,rels(p) as rr match  (n1)-[rel]->(n2) where n1 in nn and n2 in nn and rel in rr return n1,rel,n2

PS:为什么要那样写cypher,后面问题会提到。
2.将结果送到前端,使用js按照VIS.js的数据格式规范进行转换,得到nodes和edges。
var data = [] ;
var links = [] ;
//构造展示的数据
//var maxDisPlayNode = 15 ;
var maxDisPlayNode = 100;

var id = 0 ;
for( var i = 0 ;id < maxDisPlayNode&& i<searchResult.length ; i++ ){
//获取node1
node1 = {} ;
node1['label'] = searchResult[i]['n1']['name'] ;

if('url' in searchResult[i]['n1']){
node1['group'] = 1 ;
}
else{
node1['group'] = 2 ;
}
var flag = 1 ;

relationTarget = id.toString() ;
for(var j = 0 ; j<data.length ;j++){
if(data[j]['label'] === node1['label']){
flag = 0 ;
relationTarget = data[j]['id'] ;
break ;
}
}

node1['id'] = relationTarget ;
if(flag === 1){
id++ ;
data.push(node1) ;
}

//获取node2
node2 = {} ;
node2['label'] = searchResult[i]['n2']['name'] ;
<!-- node2['draggable'] = true ;-->
if('url' in searchResult[i]['n2']){
node2['group'] = 1 ;
}
else{
node2['group'] = 2 ;
}
flag = 1 ;
relationTarget = id.toString() ;
for(var j = 0 ; j<data.length ;j++){
if(data[j]['label'] === node2['label']){
flag = 0 ;
relationTarget = data[j]['id'] ;
break ;
}
}
node2['id'] = relationTarget ;
if(flag === 1){
id++ ;
data.push(node2) ;
}
//获取relation
relation = {}
relation['from'] = node1['id'];
relation['to'] = node2['id'] ;
relation['group'] = 0 ;
flag = 1;
for(var j = 0 ;j<links.length;j++){
if(links[j]['from'] == relation['from'] && links[j]['to'] == relation['target']){
links[j]['label'] = links[j]['label'] + searchResult[i]['rel']['type'] ;
flag = 0 ;
break ;
}
}
if(flag === 1){
relation['label'] = searchResult[i]['rel']['relation'] ;
//relation['symbolSize'] = 10;
links.push(relation) ;
}

}


3.调用vis.js进行展示。
     var network = new vis.Network(container, data1, options);


问题:
vis.js要求传入数据的格式为nodes和edges,node1-[edge]->node2,即一对关系展示两个点和一条线。这就要求neo4j返回的数据也要满足这个格式,这就是为什么上面步骤1中的cypher要专门用with接收上一个match查询的结果,重新查一遍的原因。其实直接用第一match查询,返回p就已经可以查询两个企业的所有关系了,但格式不满足vis.js的要求。
但是这样做的问题来了,with接收上一个查询结果后,进行了全表扫描,导致整个查询性能大大降低。


直接查询,返回p值,已能查询两者关系,但返回的格式不满足vis.js的要求。


使用with,再次查询,以满足vis.js的数据格式需要,但效率太低。(详见下图)



为了满足需求,现在主要的问题是查询效率问题和数据格式问题。解决任意一个问题均可满足需求。但研究了很久,都没有找到合适的方法。还请各位大神指导。谢谢。

...全文
511 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZHU HAI 2019-09-16
  • 打赏
  • 举报
回复
再顶顶。。。。。
ZHU HAI 2019-09-11
  • 打赏
  • 举报
回复
没人回复。。。

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧