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,n2PS:为什么要那样写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的数据格式需要,但效率太低。(详见下图)

为了满足需求,现在主要的问题是查询效率问题和数据格式问题。解决任意一个问题均可满足需求。但研究了很久,都没有找到合适的方法。还请各位大神指导。谢谢。
相关推荐
neo4j-setup:设置Neo4j + vis应用
neo4j设置 设置Neo4j + vis应用
neovis.js:Neo4j + vis.js = neovis.js。 使用Neo4j中的数据在浏览器中图形化可视化
neovis.js 由vis.js支持的图形可视化以及来自Neo4j的数据。 产品特点 连接到Neo4j实例以获取实时数据 用户指定的标签和要显示的属性 用户指定的Cypher查询来填充 为节点的图像的URL指定节点属性 指定边缘厚度的边缘属性 指定社区/集群的节点属性 指定节点大小的节点属性 配置弹出窗口 安装 Neovis.js可以通过npm安装: npm install --save neovis.js 您还可以通过CDN获得neovis.js: CDN 为了便于使用,可以从Neo4jLabs CDN获得Neovis.js: 最新发行 <script src="h
neovis.js 由Neo4j的数据在浏览器图形化可视化
neovis.js 由vis.js支持的图形可视化以及来自Neo4j的数据。 产品特点 连接到Neo4j实例以获取实时数据 用户指定的标签和要显示的属性 用户指定的Cypher查询来填充 为节点的图像的URL指定节点属性 指定边缘厚度的边缘属性 指定社区/集群的节点属性 指定节点大小的节点属性 配置弹出窗口 安装 Neovis.js可以通过npm安装: npm install --save neovis.js 您还可以通过CDN获得neovis.js: CDN 为了便于使用,可以从Neo4jLabs CDN获得Neovis.js: 最新发行
neovis.js:Neo4j + vis.js = neovis.js。 使用Neo4j中的数据在浏览器中图形化可视化-源码
neovis.js 由vis.js支持的图形可视化以及来自Neo4j的数据。 产品特点 连接到Neo4j实例以获取实时数据 用户指定的标签和要显示的属性 用户指定的Cypher查询来填充 为节点的图像的URL指定节点属性 指定边缘厚度的边缘属性 指定社区/集群的节点属性 指定节点大小的节点属性 配置弹出窗口 安装 Neovis.js可以通过npm安装: npm install --save neovis.js 您还可以通过CDN获得neovis.js: CDN 为了便于使用,可以从Neo4jLabs CDN获得Neovis.js:
基于Vue和Neo4j的知识图谱前端实现
vue+neo4j集成知识图谱的前端实现,支持通过neovis.js或neo4j-driver获取数据并绘图。neovis.js可直接连接数据库绘图,neo4j-driver能通过前端获取数据,vis.js和echarts也可用于绘图。neo4j是一种图数据库,以节点、关系和属性形式存储数据,由大量节点和关系组成。本文介绍如何连接neo4j数据库,将知识图谱显示在前端页面中。neovis.js与neo4j连接简单,数据格式与数据库一致,可在配置对象中定义样式和颜色。资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!


其他数据库
