iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >图数据库Neo4j学习五渲染图数据库neo4jd3
  • 459
分享到

图数据库Neo4j学习五渲染图数据库neo4jd3

数据库neo4j学习 2023-08-30 15:08:31 459人浏览 薄情痞子
摘要

文章目录 1.现成的工具2.Neo4j JavaScript Driver3.neovis4.neo4jd34.1neo4jd3和neovis对比4.2获取neo4jd34.3neo4jd3的数据结构4.4Spring data n


本文最终技术架构:neo4jd3 + Spring boot + Spring Data Neo + neo4j

当我们刚开是接触图数据库的时候,我们进行各种关系查询,最终会得到一个拓扑图。和我们以前使用的数据库不一样的是,我们的数据库查询出来是一系列的表。
在这里插入图片描述
事实上,我们的图数据返回的的数据是类似于下面这样的格式的,然后通过前端(Neo4j Browser )来帮我们将返回的数据绘制成网络拓扑图。在我们之前的文章中介绍的spring Data Neo中,返回的也都是java对象的数据
在这里插入图片描述
接下来本文就是介绍使用一些前端技术来帮我们将图数据库的数据返回给前端进行旋绕

1.现成的工具

比如Neo4j Browser 、Neo4j Bloom、这些官方提供的工具,免费或者有商业版权,这些工具特点都是人家已经开发好的工具,你安装上使用就行了。
例如Neo4j Browser,这些工具就好比,我们Navicat 、sql Log、PL SQL这些客户端连接工具连接关系型数据库(Mysqloracle、post gre)等。本文就不在详细介绍。
在这里插入图片描述

2.Neo4j javascript Driver

Neo4j JavaScript Driver 是一个用于在 JavaScript 应用程序中与 Neo4j 图数据库进行通信的官方驱动程序。它提供了与 Neo4j 服务器进行连接、执行 Cypher 查询和处理查询结果等功能。我们可以在JqueryReactangularVue等前端框架中使用该驱动。
驱动安装

npm install neo4j-driver

代码示例

const neo4j = require('neo4j-driver')const driver = neo4j.driver(uri, neo4j.auth.basic(user, passWord))const session = driver.session()const personName = 'Alice'try {  const result = await session.run(    'CREATE (a:Person {name: $name}) RETURN a',    { name: personName }  )  const singleRecord = result.records[0]  const node = singleRecord.get(0)  console.log(node.properties.name)} finally {  await session.close()}// on application exit:await driver.close()

官方地址:neo4j-javascript

适用于:前端直接和Neo4J直接连接

3.neovis

Neovis.js 是一个纯 JavaScript 库,使用 JavaScript 语言编写和开发开源框架。它可以在浏览器环境中直接使用,也可以与其他 JavaScript 框架和库集成,如 React、Angular 或 vue.js

  1. Neovis.js 使用 Neo4j JavaScript Driver 与 Neo4j 图数据库进行通信。
  2. Neovis.js 在 Vis.js 的基础上构建了对 Neo4j 数据库的特定集成和功能

GitHub地址:github-neovis.js
下面这是一个官方的示例:
在这里插入图片描述
Neovis.js可以通过npm安装

npm install --save neovis.js

Neovis.js可以从Neo4jLabs CDN获得

代码示例
需要在代码中定义每个节点,边,例如下乳,查询用户和角色

<script type="text/javascript">    let neoViz;    function draw() {        const config = {            containerId: "viz",            neo4j: {                serverUrl: "bolt://localhost:7687",                //neo4j的用户名和密码                serverUser: "neo4j",                serverPassword: "neo4j",            },            labels: {            //节点的标签1(节点类型:用户)                User: {                //在User类型的节点上,使用userName作为节点的显示                    label: "userName"                },                //节点的标签2(节点类型:角色)                Role: {                //在Role类型的节点上,使用roleName作为节点的显示                    label: "roleName",                }                //节点的标签3.......            },            relationships: {            //关系1(边)                PLAY_THE_ROLE: {                    value: "name"                }            },            //Cypher语句            initialCypher: "MATCH (n)-[r:PLAY_THE_ROLE]->(m) RETURN *"        };        neoViz = new NeoVis.default(config);        neoViz.render();    }</script>

4.neo4jd3

neo4jd3使用D3.js实现Neo4j图形可视化
github地址:githug-neo4jd3,表现效果如下:
在这里插入图片描述

4.1neo4jd3和neovis对比

neo4jd3和neovis是两个完全不同的组件,使用方式也不一样。

  1. 在底层依赖上:
    neovis.js 是基于 Vis.js、neo4j JavaScript Driver 构建的,而 neo4jd3.js 基于 D3.js。

  2. 在功能上:
    neovis.js 能够直接和neo4j 数据库相连,将数据库查询结果直接进行渲染,而neo4jd3则不和数据库相连,而是通过数据进行渲染。所以对于neo4jd3来说,只要能提供数据,就能渲染,因此我们可以使用任何技术为neo4jd3来进行获取数据,最后将数据给neo4jd3。

  3. 在渲染上:
    neovis.js侧重于将数据库的查询语句发送给数据,然后渲染数据库返回的结果值,因此在渲染效果上存在很多的不友好一面。而neo4jd3并不关心查询语句如何编写,数据库如何查询,只对最后的数据进行渲染,因此在渲染效果上就体现的非常友好

以下是对同一个数据的查询结果进行的渲染对比,左图是neovis,右图neo4jd3,单从拓扑图上来说,左边的效果就很差
在这里插入图片描述

4.2获取neo4jd3

从仓库中下载代码,在dist目录下,有CSS和js
在这里插入图片描述

git clone https://github.com/eisman/neo4jd3.git

在这里插入图片描述

4.3neo4jd3的数据结构

我们先看官网给的两组JSON,也就是需要我们的数据组织者按照如下格式进行数据格式组织
返回节点和关系的json

{    "nodes": [        {            "id": "1",            "labels": ["User"],            "properties": {                "userId": "eisman"            }        },        {            "id": "8",            "labels": ["Project"],            "properties": {                "name": "neo4jd3",                "title": "neo4jd3.js",                "description": "Neo4j graph visualization using D3.js.",                "url": "https://eisman.github.io/neo4jd3"            }        }    ],    "relationships": [        {            "id": "7",            "type": "DEVELOPES",            "startNode": "1",            "endNode": "8",            "properties": {                "from": 1470002400000            },            "source": "1",            "target": "8",            "linknum": 1        }    ]}

返回绘制图的Json

{    "results": [        {            "columns": ["user", "entity"],            "data": [                {                    "graph": {                        "nodes": [{    "id": "1",    "labels": ["User"],    "properties": {        "userId": "eisman"    }},{    "id": "8",    "labels": ["Project"],    "properties": {        "name": "neo4jd3",        "title": "neo4jd3.js",        "description": "Neo4j graph visualization using D3.js.",        "url": "https://eisman.github.io/neo4jd3"    }}                        ],                        "relationships": [{    "id": "7",    "type": "DEVELOPES",    "startNode": "1",    "endNode": "8",    "properties": {        "from": 1470002400000    }}                        ]                    }                }            ]        }    ],    "errors": []}

4.4Spring data neo

我们现在已经知道了neo4jd3绘制图的Json格式了,现在就需要我们后台查询数据,然后返回

4.4.1 定义返回数据格式

在这里插入图片描述
我们当然也能通过数据格式发现,嵌套有点深,这里推荐按照这个格式来,因为不这样的话,你就得要求修改前端组建的源代码了。下面这个是前端渲染数据的一部分代码,如果后端返回的数据不按照这个格式来的话,前端这里就需要你修改代码了。
在这里插入图片描述
这里我避免创建很多单一属性的类,因此采用了内部类的方式,这里你不一定才用内部类,只要能返回和上面的Json格式就行

4.4.1.1NeoResults

@lombok.Datapublic class NeoResults {private List<Data> results = new ArrayList<>();public NeoResults() {super();results.add(new NeoResults.Data());}@lombok.Datapublic class Data{private List<Graph> data = new ArrayList<>();public Data() {super();data.add(new Data.Graph());}@lombok.Datapublic class Graph{private GraphVO graph = new GraphVO();}}public void setNodes(List<NodeVO> nodes) {results.get(0).getData().get(0).getGraph().setNodes(nodes);} public void setRelationships(List<ShipVO> relationships) {results.get(0).getData().get(0).getGraph().setRelationships(relationships);} }

4.4.1.2GraphVO

@Datapublic class GraphVO {private List<NodeVO> nodes = new ArrayList<>();private List<ShipVO> relationships = new ArrayList<>();}

4.4.1.3NodeVO

@Data@AllArgsConstructor@NoArgsConstructorpublic class NodeVO{private Long id;private List<String> labels;private Map<String, Object> properties;}

4.4.1.4ShipVO

@Datapublic class ShipVO {private Long id;private String type;private Long startNode;private Long endNode;private Map<String, Object> properties;}

4.4.2 SDN查询解析

4.4.2.1 Repo查询语句

public interface D3jsRepo extends Neo4jRepository<Object, Long> {   @Query("MATCH (n:Road{name:$roadName}) MATCH path=(n)-[*]->(n1) RETURN path")List<Map<String, InternalPath.SelfContainedSegment[]>> findPathsByRoadName(@Param("roadName") String roadName);@Query("MATCH (n) WHERE $label IN labels(n) AND n[$property] = $value MATCH path=(n)-[*]->(n1) RETURN path")List<Map<String, InternalPath.SelfContainedSegment[]>> findByLabelAndProperty(@Param("label") String label, @Param("property") String property, @Param("value") String value);@Query("MATCH (n) WHERE id(n) = $id MATCH path=(n)-[*]->(n1) RETURN path")List<Map<String, InternalPath.SelfContainedSegment[]>> findPathById(@Param("id") Long id);}

4.4.2.2 解析Repo查询

@Servicepublic class D3jsServiceImpl implements D3jsService{@Autowiredprivate D3jsRepo d3jsRepo;@Overridepublic NeoResults findPathsById(Long id) {NeoResults neoResult = new NeoResults();List<NodeVO> nodes = new ArrayList<>();List<ShipVO> relationships = new ArrayList<>();List<Map<String, InternalPath.SelfContainedSegment[]>> paths = d3jsRepo.findPathById(id);for (Map<String, InternalPath.SelfContainedSegment[]> path : paths) {SelfContainedSegment[] segments = path.get("path");for (SelfContainedSegment segment : segments) {addNode(nodes, segment.start());addNode(nodes, segment.end());addShip(relationships, segment.relationship());}}neoResult.setNodes(nodes);neoResult.setRelationships(relationships);return neoResult;}private void addShip(List<ShipVO> relationships, Relationship shipTemp) {ShipVO shipVO =new ShipVO();shipVO.setId(shipTemp.id());shipVO.setStartNode(shipTemp.startNodeId());shipVO.setEndNode(shipTemp.endNodeId());shipVO.setType(shipTemp.type());shipVO.setProperties(shipTemp.asMap());relationships.add(shipVO);}private void addNode(List<NodeVO> nodes, Node nodeTemp) {NodeVO noveVO = new NodeVO();List<String> labels = new ArrayList<>();nodeTemp.labels().forEach(labels::add);noveVO.setId(nodeTemp.id());noveVO.setLabels(labels);noveVO.setProperties(nodeTemp.asMap());nodes.add(noveVO);}}

4.4.2.3返回解析结果

 @GetMapping("/node/info/path/{id}")    @apiOperationSupport(order = 3)    @ApiOperation(value = "3获取指定节点为起点的路径")    public NeoResults queryNodeTopo(@PathVariable Long id) {    NeoResults findPaths = d3jsService.findPathsById(id);    return findPaths;    }

4.4.3前端处理渲染

"stylesheet" href="/plugin/neod3/css/neo4jd3.min.css">光路起点
"neo4jd3">
function changeRoad(){let select =  $('#selectRoad').val(); let url = '/node/info/path/'+select;let resultData = httpRequestForJson(url,"","GET");loadNeod3Topo(resultData);}var neo4jd3function loadNeod3Topo(resultData){neo4jd3 = new Neo4jd3('#neo4jd3', {//showLabel源代码中不存在,是我自己添加的,实现效果为:节点是否显示节点标签showLabel: true,        minCollision: 100,        //neo4jDataUrl: '/aaa/bbbb',        neo4jData: resultData,        nodeRadius: 25,        onNodeDoubleClick: function(node) {       console.log('double click on node: ' + JSON.stringify(node));        },        onRelationshipDoubleClick: function(relationship) {            console.log('double click on relationship: ' + JSON.stringify(relationship));        },        //自动缩放        zoomFit: true,    });}

4.5实现效果

在这里插入图片描述

来源地址:https://blog.csdn.net/m0_37892044/article/details/132455917

--结束END--

本文标题: 图数据库Neo4j学习五渲染图数据库neo4jd3

本文链接: https://www.lsjlt.com/news/383217.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 图数据库Neo4j学习五渲染图数据库neo4jd3
    文章目录 1.现成的工具2.Neo4j JavaScript Driver3.neovis4.neo4jd34.1neo4jd3和neovis对比4.2获取neo4jd34.3neo4jd3的数据结构4.4Spring data n...
    99+
    2023-08-30
    数据库 neo4j 学习
  • 【大数据】Neo4j 图数据库使用详解
    目录 一、图数据库介绍 1.1 什么是图数据库 1.2 为什么需要图数据库 1.3 图数据库应用领域 二、图数据库Neo4j简介 2.1 Neo4j特性 2.2 Neo4j优点 三、Neo4j数据模型 3.1 图论基础 3.2 属性图模型 ...
    99+
    2023-09-26
    neo4j 图数据库 neo4j使用 neo4j搭建 neo4j查询语法 neo4j查询数据
  • Mac Neo4j图数据库安装与使用
    1. Neo4j简介         图数据库是基于图论实现的一种NoSQL数据库,其数据存储结构和数据查询方式都是以图论为基础的,图数据库主要用于存储更多的连接数据。         Neo4j 是一个知名的图数据库,提供Cypher 查...
    99+
    2023-10-10
    macos neo4j 数据库
  • vue2从数据到视图渲染之模板渲染详解
    目录引言1、从new Vue()入口开始:2、this._init3、挂载函数vm.$mount(vm.$options.el)4、mountComponent函数5、_render...
    99+
    2024-04-02
  • MySQL数据库学习
    目录 从管理员cmd页面打开数据库 创建一个用户 数据库的基本操作 数据完整性 完整性约束管理 表的基本操作 判断关键字 聚合函数 多表连接查询 嵌套查询 联合查询 事务 锁 索引 视图 存储过程 函数(与存储过程类似) 光标 触发器   ...
    99+
    2023-10-19
    数据库 mysql 学习 java
  • MySQL数据库数据视图
    目录一、 数据视图二、数据视图操作创建视图修改视图数据修改视图列明删除视图三、数据的备份与回复liunx备份mysql备份四、 MySQL存储过程和函数概念五、存储过程操作初始数据创...
    99+
    2022-11-13
    MySQL数据库 MySQL数据视图
  • 数据库怎么学习
    学习数据库的方法学习Access数据库,了解数据库的基础概念。学习如何建数据库。学习sql语句的运用。做一些实例进行深度学习。学习SQLserver,掌握关系型数据库的基本操作。学习Oracle、DB2等大型数据库的知识。...
    99+
    2024-04-02
  • 如何学习数据库
    学习数据库的方法从Access数据库入手,了解数据库的基础概念。自己动手建库。学习sql语句的运用。做一些实例进行深度学习。接着学习SQLserver掌握关系型数据库的基本操作。学习大型数据库的知识。最后需要再掌握Oracle、DB2等大型...
    99+
    2024-04-02
  • vue使用neovis操作neo4j图形数据库及优缺点
    1.前言: 由于项目需要在前端展示关系图,常规的做法是,后端操作数据库返回Json数据,前端使用d3或者echarts进行展示,奈何因为后端不给力(说是无法获取最核心的关系id),所...
    99+
    2024-04-02
  • 如何分析图数据库和图数据库的小知识
    如何分析图数据库和图数据库的小知识,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。图数据库 - 维基百科:在计算机科学中,图数据库(英语:gra...
    99+
    2024-04-02
  • Python数据科学Matplotlib图库的用法
    这篇文章主要讲解了“Python数据科学Matplotlib图库的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python数据科学Matplotlib图库的用法”吧!Matplotli...
    99+
    2023-06-20
  • 五个优秀的开源图数据库是什么
    本篇内容介绍了“五个优秀的开源图数据库是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.Neo4j社...
    99+
    2024-04-02
  • PHP学习——phpstudy数据库连接(数据库创建,操作)
    一、创建一个数据库:   打开mysql 软件管理=》 phpMyAdmin=》安装=》管理 输入用户名密码(如果没有修改密码,密码为root)  创建一个数据库:  二、连接数据库 1.创建一个连接:使用mysqli_connec...
    99+
    2023-10-27
    php 数据库 开发语言 vscode sql
  • Spring学习JdbcTemplate数据库事务参数
    目录Spring JdbcTemplate数据库事务参数一、propagation1. REQUIRED2. REQUIRES_NEW3. SUPPORTS4. NOT_SUPPOR...
    99+
    2024-04-02
  • 数据库的语言:用 DDL 编写数据库蓝图
    数据定义语言 (DDL) 是数据库编程中不可或缺的一部分,它允许数据库管理员和开发人员创建和修改数据库结构。通过 DDL,您可以定义表、列、数据类型以及约束条件,从而为数据库提供一个清晰的蓝图。 表定义 表的定义是 DDL 的核心部分。...
    99+
    2024-02-19
    数据库设计 DDL 数据定义语言 数据类型 约束条件
  • 图片数据库阿里云
    简介 随着互联网的发展,图片数据的存储和管理成为了一个重要的话题。阿里云作为中国领先的云计算服务提供商,提供了强大的图片数据库解决方案。本文将介绍如何使用阿里云搭建一个高效可靠的照片数据库平台。如何使用阿里云搭建图片数据库平台步骤一:选择合...
    99+
    2024-01-20
    阿里 数据库 图片
  • 图形数据库是什么
    本篇内容主要讲解“图形数据库是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“图形数据库是什么”吧!企业架构师应该知道什么您在Google上获得的图表数据库的描述主要是学术性的。我看到很多关于...
    99+
    2023-06-06
  • 数据库er图怎么画
    首先要了解ER图的3个核心要素:实体,属性,关系。在ER图中,矩形代表实体也就是对象,椭圆代表属性,菱形代表关系,各个形状之间用线段连接,我们可以用visio工具来画ER图,它是描述现实世界关系概念模型的有效方法。...
    99+
    2024-04-02
  • 怎样分析图数据库
    怎样分析图数据库,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。下面主要讨论图数据库背后的设计思路、原理还有一些适用的场景,以及在生产环境中使用...
    99+
    2024-04-02
  • 大数据入门级学习:SQL与NOSQL数据库
    这几年的大数据热潮带动了一激活了一大批hadoop学习爱好者。有自学hadoop的,有报名培训班学习的。所有接触过hadoop的人都知道,单独搭建hadoop里每个组建都需要运行环境、修改配置文件测试等过程...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作