知识图谱可视化之cytoscape.js构建知识图谱(django框架将数据由后台传到前台进行图谱构建)

1、cytoscape.js是什么

cytoscape.js是常用的构建知识图谱的工具,是一个网络图的可视化工具。通常有两种使用方式:

第一种是桌面版的Cytoscape Desktop,集成好的app供我们使用。

第二种是前端js库,通过在前端代码中引用cytoscape.js进行使用,通常cytoscape.js需要结合jquery.js进行使用。

在此使用cytoscape.js进行知识图谱的开发工作。

2、主要工作

文章主要介绍cytoscape.js的使用方法:

1)构建静态html文件进行图谱展示

2)使用Python的django框架进行开发,并将后台业务逻辑生成的数据传送到前端js中进行展示,实现动态图谱构建,满足工程实际需要。

2.1 构建静态html文件构建图谱

首先需要了解一下静态图谱是如何构建的,搞清楚构建方法及构建逻辑,同时为构建动态图谱打下基础。首先来看一段html代码

<!DOCTYPE html>
<html>
<head>
    <title>Static Cytoscape.js</title>
    <!--定义style属性,定义显示图谱的div-->
    <style type="text/css">
        #cy {
            height: 500px;
            width: 500px;
            background-color: #f9f9f9;
        }
    </style>
    <!-- 
    引用jquery.js与cytoscape.js,使用cdn链接引用(运行时需要电脑接入网络),也可使用外部文件引用(无需接入网络)
	注:jquery.min.js与cytoscape.min.js为jquery.js与cytoscape.js的压缩版,使用时均可!
    -->
    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/cytoscape/2.3.16/cytoscape.min.js"></script>
    <!--构建图谱js-->
    <script>
    	//$(function(){})就是$(document).ready(function(){})的简写,
    	//是JQuery的语法,$表示JQuery对象,页面加载后即执行此功能。
        $(function(){
        	//定义cytoscape方法显示图谱
            cytoscape({
            	//首先进行div的绑定,绑定到id为cy这个div上进行显示
              container: document.getElementById('cy'),
              //定义显示图谱的节点与边的样式
              style: [
                { selector: 'node[label = "中国科学院计算技术研究所"]', 
                //选择节点中label为中国科学院计算技术研究所的节点定义css样式
                //css样式中包括背景色与需要显示的内容,此处显示节点中的name属性
                  css: {'background-color': '#6FB1FC', 'content': 'data(name)'}
                },
                { selector: 'node[label = "school"]', 
                  css: {'background-color': '#F5A45D', 'content':'data(title)'}
                },
                { selector: 'edge', 
                //边的样式,'target-arrow-shape': 'triangle'定义箭头指向
                  css: {'content': 'data(relationship)', 'target-arrow-shape'
                  : 'triangle'}
                }        
              ],
              //图谱元素
              elements: {
              	//节点数据,节点数据中id为必填项,另外name与label为自选项
                nodes: [
                	{data: {id: '2', name:'徐志伟', label: '中国科学院计算技术研究所'}},
                    {data: {id: '5', name:'文继荣', label: '中国科学院计算技术研究所'}},
                    {data:{id:'1001',label:'school',title:'中国科学院计算技术研究所'}}
                ],
                //边数据,source与target为必选项
                edges:[
                	{data: {source: '2', target: '1001', relationship: 'belong_to'}},
            		{data: {source: '5', target: '1001', relationship: 'belong_to'}}
                ]
              },
              //布局方式,还有circle...等
              layout: { name: 'grid'} 
            });
        });
    </script>
</head>
<body>
	<!--显示图谱的div-->
    <div id="cy"></div>
</body>
</html>

html文件中注释写的比较详细了,生成图谱的整体思路是通过节点的id值进行边的构建,两个节点构造一条边,边是有方向的,source为边的起始点,target为边的终点,通过起点与终点构造一条有方向的边。

运行结果:

2.2构建动态知识图谱

动态知识图谱是指数据不是死的,而是通过传送的可变的数据。在此通过django框架进行后台数据传送,将数据传送到前端cytoscape.js中进行显示,这样后台传送什么数据,前端就可以显示什么图谱,适合在实际工程中应用。

2.2.1 django项目准备

首先创建一个django项目(我的django为2.0版本,安装时可指定 pip install django==2.0),然后使用

python manage.py startapp ZSTP

创建一个ZSTP的app,我们在此app下进行知识图谱的构建。app创建好后在settings.py中进行app的注册,如下图所示

app 的项目结构:

views.py文件中为业务逻辑代码的书写,即后台数据。

还需准备模版文件夹,如下图所示:

选中我们创建的项目,然后右键new,选择Directory,新建一个名为templates的目录,用于存储html文件,然后打开settings.py进行路径配置,如下图所示:

至此准备工作已经准备完成!

2.2.2 后台数据传送到前端展示

首先进行app中的业务逻辑的编写,打开views.py,输入

from django.shortcuts import render
import json 
# Create your views here.

def get_json_new(request):
    node = [{'data': {'id': '2', 'name':'徐志伟', 'label': '中国科学院计算技术研究所'}},\
            {'data': {'id': '5', 'name':'文继荣', 'label': '中国科学院计算技术研究所'}},\
            {'data':{'id':'1001','label':'school','title':'中国科学院计算技术研究所'}}]
    edge = [{'data': {'source': '2', 'target': '1001', 'relationship': 'belong_to'}},\
            {'data': {'source': '5', 'target': '1001', 'relationship': 'belong_to'}}]
    return render(request,'tp.html',{'node':json.dumps(node),'edge':json.dumps(edge)})

编写业务逻辑函数get_json_new,函数参数为request。接下来是图谱所需node与edge节点,此处需要注意:node与edge中字典的key与value必须全部使用引号 引上,  若不引上则传送到前端的数据不能转换成object对象,就无法构建图谱,这是非常重要的一点!

render函数进行模版渲染,即跳转到哪个html文件,{'node':json.dumps(node),'edge':json.dumps(edge)}为需要传送的参数,为字典格式,json.dumps()函数用于格式转换,到此后台数据准备好了,下面展示前端接收数据。

2.2.3前端接收后台数据

由上面的render函数渲染中可以看到,传送的参数为node与edge。在前端中接收后台传送的变量需要使用{{   }},例如接收node变量,则写作为 {{ node }},下面在templates路径下创建tp.html文件,代码如下

<!DOCTYPE html>
<html>
<head>
    <title>show  Cytoscape.js</title>
    <style type="text/css">
        /* cytoscape graph */
        #cy {
            height: 500px;
            width: 500px;
            background-color: #f9f9f9;
            display: block;
        }
    </style>
    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/cytoscape/2.3.16/cytoscape.min.js"></script>
<script>
        $(function(){
            var node = {{ node|safe }};
            alert(node);
            var edge = {{ edge|safe }};
            cytoscape({
              container: document.getElementById('cy'),
              style: [
                { selector: 'node[label = "中国科学院计算技术研究所"]',
                  css: {'background-color': '#6FB1FC', 'content': 'data(name)'}
                },
                { selector: 'node[label = "school"]',
                  css: {'background-color': '#F5A45D', 'content': 'data(title)'}
                },
                { selector: 'edge',
                  css: {'content': 'data(relationship)', 'target-arrow-shape': 'triangle'}
                }
              ],
              elements: {
                nodes: node,
                edges: edge
              },
              layout: { name: 'grid'}
            });
        });
    </script>

</head>
<body>
    <div>动态传送数据</div>
    <div id="cy"></div>
<div></div>
</body>
</html>

代码中部分说明已经在2.1中进行说明,这里对未说明的地方进行说明:

1 var node = {{ node|safe }};
2 alert(node);
3 var edge = {{ edge|safe }};

第一行与第三行定义变量node与edge接收后台传送的参数,并需要添加 safe ,因为后台传送时使用json.dumps函数进行处理,所以在接收时需要进行处理。第二行我们可以弹出一下node,弹出结果如下图:

可以看到接收的数据类型为object对象类型,若为其他类型(如undefined、string)则有错误,需要到views.py文件中检查数据格式是否满足要求。

2.2.4 配置路由与前端显示

接下来需要为网页进行路由配置,打开项目下的urls.py,配置代码如下:

from django.conf.urls import url
from django.contrib import admin
from ZSTP.views import get_json_new
urlpatterns = [
    url(r'admin/', admin.site.urls),
    #tp
    url(r'get_json/',get_json_new)




]

路由配置好后需要进行项目的启动:使用python manage.py runserver 进行项目启动

然后通过http://127.0.0.1:8000/get_json/即可看到图谱展示的结果了,首先弹出对象类型,然后点击确定,可看到如下结果:

3 总结

使用动态数据构建图谱十分满足工程的需要,例如在业务逻辑中返回满足条件的数据(数据一般存储在数据库中),然后处理数据为满足传送要求的格式,在使用如上方法进行展示,即可提升交互效果,为全栈开发增添特色!

文章为作者原创,转载请注明出处!

  • 10
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带鱼工作室

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值