近期在使用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,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的資料格式需要,但效率太低。(詳見下圖)

為了滿足需求,現在主要的問題是查詢效率問題和資料格式問題。解決任意一個問題均可滿足需求。但研究了很久,都沒有找到合適的方法。還請各位大神指導。謝謝。
uj5u.com熱心網友回復:
沒人回復。。。uj5u.com熱心網友回復:
再頂頂。。。。。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/48433.html
標籤:其他數據庫
上一篇:mysql 安裝失敗
