vue知识图谱可视化_⼀个知识图谱展⽰⽹站,前端使⽤
vue+D3框架,后端采⽤spring。。。
商务智能项⽬⽂档
项⽬架构分析
本项⽬是⼀个知识图谱展⽰⽹站。
前端使⽤vue+D3框架实现前端基本逻辑、样式设定以及数据可视化;
后端采⽤springboot框架,实现分发逻辑、图算法等功能;
数据库⽅⾯使⽤Neo4j存储基本节点及关系数据;使⽤MongoDB作为检索结果的缓存;使⽤MySQL存储所有节点名称和其对于的ID、标签。
类图
前端
介绍
在我们的项⽬中主要使⽤D3组件来对数据进⾏展⽰。D3是⼀款强⼤的⽤于数据可视化的JavaScript库,能够展⽰多种类型的数据,同时对数据进⾏操控。
导⼊
我们使⽤d3-network来展⽰⽹络状的图数据。
import D3Network from 'vue-d3-network'
components: {
D3Network
}
事件
node-click: 单击爱节点时触发事件——(event,node-object)
link-click:单击链接时触发 ——(event, link-object)
节点对象
id:节点ID。如果没有提供使⽤数组索引
name:节点名称。如果未提供使⽤:'node [node_id]'
_color:节点颜⾊,例如红⾊,#aa00bb,
_cssClass:node css类名
_labelClass:节点标签css类名
svgSym:节点图标,svg⽂档(仅适⽤于svg渲染器)
_size:节点⼤⼩*(仅限svg渲染器)*
_width:节点宽度*(仅限svg渲染器)*
_height:节点⾼度*(仅限svg渲染器)*
_svgAttrs:Object,svg节点属性
由于项⽬节点属性与该component节点对象属性不太相符,所以需要修改component,
buildNode函数中将项⽬节点属性提取并填⼊节点对象属性。
链接对象
id:链接ID。如果没有提供使⽤数组索引
name:节点名称。如果未提供使⽤:'link [link_id]'
tid:⽬标节点的id
sid:源节点的id
_color:链接颜⾊,例如红⾊,#aa00bb,
_svgAttrs:Object,svg⾏属性
同节点对象⼀样,由于项⽬链接属性与该component链接对象属性不太相符,所以修改component中buildLink函数,将项⽬节点属性提取并填⼊节点对象属性。
props
该component为我们提供了丰富的属性,以⾃定义我们的需求:
net-nodes: 节点对象的数组
net-links: 链接对象的数组
selection : 选择对象,链接和节点
links: 将node.ids作为键,将节点对象作为值的对象
nodes: 将link.ids作为键的对象,将对象链接为值
nodeSym: String,可设置svg doc 为node绘制图标
nodeCb: Function(node) -> node, 节点格式化
linkCb: Function(link) -> link, 链接格式化
options:
canvas:Boolean,render as canvas,false = svg
size:对象,图形⼤⼩。**默认值:**容器⼤⼩
w:数字
h:数字
offset:对象,图形中⼼偏移量
x:数字
y:数字
force:数量
force对象:
中⼼:布尔值,使⽤d3.forceCenter
X:强度,使⽤d3.forceX
Y:⼒量,使⽤d3.forceY
ManyBody:Boolean,使⽤d3.forceManyBody,取'force'选项的负值
链接:布尔值,使⽤d3.forceLink
nodeSize: Number, node radius | 以px为单位
linkWidth: Number, 链接厚度以px为单位
nodeLabels: Boolean, 显⽰节点名称
linkLabels: Boolean, 显⽰链接名称
fontSize: Number,节点标签⼤⼩ px
strLinks: Boolean, 是否将链接绘制成矩形线
各数据库介绍
Neo4j
Neo4j是⼀种⾯向/基于图的数据库,以图的形式存储数据,⽽这种数据格式的结构特殊性使得其在复杂繁琐的关系处理上很⾼效。
本项⽬使⽤其存储路透社提供的公开⾦融数据集,其中包含各类⾦融相关实体以及多实体之间的关系。我们使⽤Neo4j为本项⽬构建了知识图谱模型,并在此基础上提供⼀些检索服务。
配置
机器内存16G,Neo4j分配如下:
数据量
图数据库中共存有27.34GB图数据,其中:
节点数:21993143
关系数:61066697
MongoDB
因项⽬中MongoDB和MySQL存储量较少,因此都选择使⽤了配置较低的服务器。
使⽤MongoDB的⽬的是为了缓存检索结果,提⾼Query Server的响应速度。我们将特定检索关键词的字符串连接结果作为key,并创建⼀个包含检索时间和检索结果的value,以此构建key-value对存储MongoDB中。在下⼀次query动作产⽣时,会先检索MongoDB中是否包含该历史记录,若包含则修改该记录的time字段,并将其返回,若不包含则创建⼀个key-value对存⼊MongoDB中。
存储结构如下:
Collections(集合名称)
好用的前端框架说明
Single
查询单节点周围的关系及节点的结果
Double
查询两节点间存在的多跳关系的结果
MinPath
查询两节点间的最短路径
每个集合的存储⽂档格式都相同:
DocumentKey
说明
id
根据检索参数构建的key值
time
检索的时间
result
检索结果(json类型数据)
由于我们项⽬中图结构很⼤,对Neo4j的⼀次节点、关系检索通常是⽐较耗时的,⽽MongoDB的以key取值的操作确实很快的,因此使⽤MongoDB⼤⼤降低了⽤户的检索等待时间。
数据量
MongoDB中主要⽤于存储⽤户检索的历史记录,数据的增加由⽤户的检索动作触发,当MongoDB中的数据量达到了预先设定的阈值
(2G),会清理⼀次数据,即删除⼀半的记录。
MySQL服务器配置
与MongoDB类似,MySQL的⽬的也是提⾼Query Server的响应速度。
在⽤户界⾯中,我们为其提供了⼀个搜索节点的功能,即根据实体的名称来搜索并返回相似的实体集合,并由⽤户选择⼀个(或两个,由选择的检索功能⽽定)特定的实体从⽽根据其返回对应的实体/关系结果集。
虽然Neo4j在处理关系上很⾼效,但是在独⽴实体上的查询就会很慢,因此我们使⽤关系型数据库MySQL存储所有节点的名称、ID、类型标签及其uri链接。
唯⼀⼀张表NeoCache的表结构:
字段名称
说明
备注
id
节点id
主键
label
节点所属类型
索引labelIndex、符合索引labelNameIndex
name
节点名称
索引nameIndex、符合索引labelNameIndex
uri
节点的链接
可直接跳转到官⽹介绍页⾯
ETL
数据导⼊
在做数据清理的时候,我们有两种⽅案:
原来使⽤数据清理 导出成csv
优点:清理完数据⽐较⼩,可以通过neo4j import直接导⼊
缺点:在清洗数据的过程中,会有⼀定的数据缺失
使⽤neosemantics直接导⼊
优点:数据⽐较完整
缺点:数据较⼤,⽐较难导⼊
我们对于源数据进⾏了⼀定的分析,发现源数据采⽤rdf数据框架,其中URI作为语义知识图谱的唯⼀标⽰,不仅可以存储数据,还可以存储该数据含义的明确描述,例如:
因此我们决定使⽤第⼆种⽅法进⾏数据导⼊,保证数据信息最⼤程度的完整性,为了加快读写速度,增加增删改查的速率,我们选择使⽤固态盘进⾏数据存储
知识图谱构建
我们选择的是⾃下⽽上的⽅式搭建知识图谱。本体节点的存在代表了源数据的置信度相对⽐较⾼,通过数据直接构建知识图谱的⽅式是可⾏的。
在导⼊数据之后,我们对于本体节点进⾏规则抽取,本体规则的构建可以帮助我们在新的数据导⼊时⾃动判断数据的正确性。当未来数据更新的时候,我们可以通过这个规则来去除⼀些错误的信息。
查询功能实现
单节点及关系查询
单节点查询是Neo4j中最基本的查询,语句如下:
MATCH p=((n:$label)-[*$step]-()) where id(n)=$id return p limit $limit
对于节点a,给定四个参数a的id、a的类型label、关系跳数限制、返回的路径数量限制,直接返回其周围的关系和节点组成的结果集。
但是在数据量如此⼤的库⾥⾯,定位到某节点并进⾏扩展也会变得很慢。于是我们做了以下⼏种提升性能的⽅法:
⾸先,考虑到Neo4j在节点定位上很吃⼒,为了避免遍历时全⽂搜索,我们在id上创建了索引,⼤⼤增快了节点定位的速度;
其次,我们使⽤MongoDB对查询记录进⾏缓存,当短期内执⾏同样的查询时,会从MongoDB中摘取记录并返回,查询的速度基本是在ms 级别,同时我们设定了记录失效时间1天,防⽌结果过于陈旧。
两节点多跳关系查询
Neo4j中的查询思路基本是从起始节点s出发进⾏深度或⼴度遍历,⽽后查询直⾄到终⽌节点e。
⼴度优先的性能取决于结果节点是否靠近起始节点,即其深度;深度优先的性能取决于结果节点是在⽣成树的左侧还是右侧,越靠左侧就越有可能被先遍历到。⽽在最坏的情况下,结果节点同时位于树的最深和最右的位置,那么就需要遍历整个树即整张图。这在节点数较少的情况下还基本可以完成,⽽在我们项⽬场景中,节点周围多的可能会有⼏千甚⾄上万个关系,在BFS的情况下,N跳关系就可能需要存储1000N数量级的关系和节点,如此当N较⼤时,内存必然会爆炸。然⽽这正是Neo4j选择的查询⽅式。
因此我们这⾥选择了⼀个策略,⾸先取出起始节点给定范围内的最⼤⼦图,查询语句如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论