• Neo4j Server及GDS安装

下载neo4j-community-4.4.16.zip和jdk11的zip包(必须是JDK11,其它版本不行)

下载GDS相应的jar包2.2.7版本

  1. Neo4j Server和JDK安装

解压neo4j-community-4.4.16.zip到neo4j的安装目录

解压jdk11的zip包,设置JAVA_HOME(注意可能会与本机已有的JDK冲突,可以在启动neo4j后改回原JAVA_HOME设置).

  1. GDS安装

将neo4j-graph-data-science-2.2.7.jar拷到{NEO4J_HOME}/plugins目录下,并修改$NEO4J_HOME/conf/neo4j.conf:

#此配置项是必要的,因为GDS库要访问Neo4j的底层组件以实现性能最大化。

dbms.security.procedures.unrestricted=gds.*

#检查$NEO4J_HOME/conf/neo4j.conf文件中是否启用了allowlist过程,并在必要时添加GDS库

dbms.security.procedures.allowlist=gds.*

此时完成安装,启动neo4j server,打开终端并切换到{NEO4J_HOME}/bin目录下,执行命令:

neo4j.bat console

    • 得到示例的演示步骤

在neo4j中执行:

:play https://guides.neo4j.com/airport-routes/index.html

得到如下:

    • 导入示例数据

首先将示例数据文件airport-node-list.csv和iroutes-edges.csv放到neo4j安装目录下的imports目录下。

  1. 创建数据库索引

CREATE CONSTRAINT airports IF NOT EXISTS ON (a:Airport) ASSERT a.iata IS UNIQUE;

CREATE CONSTRAINT cities IF NOT EXISTS ON (c:City) ASSERT c.name IS UNIQUE;

CREATE CONSTRAINT regions IF NOT EXISTS ON (r:Region) ASSERT r.name IS UNIQUE;

CREATE CONSTRAINT countries IF NOT EXISTS ON (c:Country) ASSERT c.code IS UNIQUE;

CREATE CONSTRAINT continents IF NOT EXISTS ON (c:Continent) ASSERT c.code IS UNIQUE;

CREATE INDEX locations IF NOT EXISTS FOR (air:Airport) ON (air.location);

  1. 导入节点数据

WITH

'file:///airport-node-list.csv'

AS url

LOAD CSV WITH HEADERS FROM url AS row

MERGE (a:Airport {iata: row.iata})

MERGE (ci:City {name: row.city})

MERGE (r:Region {name: row.region})

MERGE (co:Country {code: row.country})

MERGE (con:Continent {name: row.continent})

MERGE (a)-[:IN_CITY]->(ci)

MERGE (a)-[:IN_COUNTRY]->(co)

MERGE (ci)-[:IN_COUNTRY]->(co)

MERGE (r)-[:IN_COUNTRY]->(co)

MERGE (a)-[:IN_REGION]->(r)

MERGE (ci)-[:IN_REGION]->(r)

MERGE (a)-[:ON_CONTINENT]->(con)

MERGE (ci)-[:ON_CONTINENT]->(con)

MERGE (co)-[:ON_CONTINENT]->(con)

MERGE (r)-[:ON_CONTINENT]->(con)

SET a.id = row.id,

a.icao = row.icao,

a.city = row.city,

a.descr = row.descr,

a.runways = toInteger(row.runways),

a.longest = toInteger(row.longest),

a.altitude = toInteger(row.altitude),

a.location = point({latitude: toFloat(row.lat), longitude: toFloat(row.lon)});

  1. 导入关系数据

LOAD CSV WITH HEADERS FROM 'file:///iroutes-edges.csv' AS row

MATCH (source:Airport {iata: row.src})

MATCH (target:Airport {iata: row.dest})

MERGE (source)-[r:HAS_ROUTE]->(target)

ON CREATE SET r.distance = toInteger(row.dist);

  1. 查看导入结果

CALL db.schema.visualization()

    • 创建图投影

执行任何GDS算法的第一步是在用户定义的名称下创建图投影(也称为内存中图)。图投影以用户定义的名称存储在图目录中,是我们的完整图的子集,用于通过GDS算法计算结果。它们的使用使GDS能够快速有效地进行计算。在创建这些投影时,图元素的性质可能以以下方式改变:

关系的方向可能会改变

节点标签和关系类型可以重命名

并行关系可以被聚合

本地投影为创建图形投影提供了最快的性能。它们接受3个强制参数:graphName、nodeProjection和relationshipProjection。还有一些可选的配置参数可用于进一步配置图形。一般来说,创建原生投影的语法是:

CALL gds.graph.project(

graphName: String,

nodeProjection: String or List or Map,

relationshipProjection: String or List or Map,

configuration: Map

)

YIELD

graphName: String,

nodeProjection: Map,

nodeCount: Integer,

relationshipProjection: Map,

relationshipCount: Integer,

projectMillis: Integer

  1. 创建图投影routers

CALL gds.graph.project(

'routes',

'Airport',

'HAS_ROUTE'

)

YIELD

graphName, nodeProjection, nodeCount, relationshipProjection, relationshipCount

  1. 查询创建的结果:

CALL gds.graph.list('routes')

    • 示例查询算法

通用算法语法:

CALL gds[.<tier>].<algorithm>.<execution-mode>[.<estimate>](

graphName: String,

configuration: Map

)

将利用之前编写的路由图投影来计算。如果您没有创建这个图形投影或者已经删除了这个图形投影,您将需要重新创建它。尝试重新创建具有相同名称的图形将导致以下错误:

Failed to invoke procedure `gds.graph.project`: Caused by: java.lang.IllegalArgumentException: A graph with name 'routes' already exists.

以下是常见的算法:

  1. PageRank

CALL gds.pageRank.stream('routes')

YIELD nodeId, score

WITH gds.util.asNode(nodeId) AS n, score AS pageRank

RETURN n.iata AS iata, n.descr AS description, pageRank

ORDER BY pageRank DESC, iata ASC

  1. Community (cluster) detection via Louvain Modularity

CALL gds.louvain.stream('routes')

YIELD nodeId, communityId

WITH gds.util.asNode(nodeId) AS n, communityId

RETURN

communityId,

SIZE(COLLECT(n)) AS numberOfAirports,

COLLECT(DISTINCT n.city) AS cities

ORDER BY numberOfAirports DESC, communityId;

  1. Node similarity

CALL gds.nodeSimilarity.stream('routes')

YIELD node1, node2, similarity

WITH gds.util.asNode(node1) AS n1, gds.util.asNode(node2) AS n2, similarity

RETURN

n1.iata AS iata,

n1.city AS city,

COLLECT({iata:n2.iata, city:n2.city, similarityScore: similarity}) AS similarAirports

ORDER BY city LIMIT 20

  1. Node similarity: topN and bottomN

CALL gds.nodeSimilarity.stream(

'routes',

{

topK: 1,

topN: 10

}

)

YIELD node1, node2, similarity

WITH gds.util.asNode(node1) AS n1, gds.util.asNode(node2) AS n2, similarity AS similarityScore

RETURN

n1.iata AS iata,

n1.city AS city,

{iata:n2.iata, city:n2.city} AS similarAirport,

similarityScore

ORDER BY city

  1. Node similarity: degree and similarity cutoff

CALL gds.nodeSimilarity.stream(

'routes',

{

degreeCutoff: 100

}

)

YIELD node1, node2, similarity

WITH gds.util.asNode(node1) AS n1, gds.util.asNode(node2) AS n2, similarity

RETURN

n1.iata AS iata,

n1.city AS city,

COLLECT({iata:n2.iata, city:n2.city, similarityScore: similarity}) AS similarAirports

ORDER BY city LIMIT 20

  1. Path Finding---Dijkstra’s algorithm: calculating the shortest path given a source node

像我们探索过的所有其他算法类别一样,寻径有几种可能的方法。一般来说,寻径的目的是寻找两个或多个节点之间的最短路径。在我们的机场航路图中,这将帮助我们确定需要哪些机场连接来最小化总体飞行距离。

在前面的例子中,我们没有考虑机场之间的航线距离。然而,在本例中,我们将使用路径距离作为Dijkstra中的权重,从而得到的最短路径反映物理距离最短的路径。要做到这一点,我们必须首先将路线距离作为关系属性包含在我们的图投影中,如下所示:

CALL gds.graph.project(

'routes-weighted',

'Airport',

'HAS_ROUTE',

{

relationshipProperties: 'distance'

}

) YIELD

graphName, nodeProjection, nodeCount, relationshipProjection, relationshipCount

查询机场DEN到MLE之间的最小距离:

MATCH (source:Airport {iata: 'DEN'}), (target:Airport {iata: 'MLE'})

CALL gds.shortestPath.dijkstra.stream('routes-weighted', {

sourceNode: source,

targetNode: target,

relationshipWeightProperty: 'distance'

})

YIELD index, sourceNode, targetNode, totalCost, nodeIds, costs, path

RETURN

index,

gds.util.asNode(sourceNode).iata AS sourceNodeName,

gds.util.asNode(targetNode).iata AS targetNodeName,

totalCost,

[nodeId IN nodeIds | gds.util.asNode(nodeId).iata] AS nodeNames,

costs,

nodes(path) as path

ORDER BY index

写在最后,并非所有的GDS算法都能在每种类型的图投影上运行。有些算法更喜欢同构图而不是异构图。其他的只能在无向图上正常工作。有些人无法处理关系权重。对于所选择的算法,您应该始终查阅API文档,以验证您的图需要什么。

    • 清理演示环境

CALL gds.graph.drop('routes');

CALL gds.graph.drop('routes-weighted');

Neo4j数据库GDS算法演示相关推荐

  1. neo4j数据库学习资料(全)

    文章目录 1. neo4j介绍 Neo4j的特点 Neo4j的优点 Neo4j的数据模型 2. neo4j安装 2.1 Windows 安装 2.1.1 安装JDK 11 (1)下载JDK安装文件 ( ...

  2. linux如何安装neo4j,Ubuntu16.04 如何安装neo4j数据库

    什么是neo4j数据库? neo4j数据库是图数据库的一种,属于nosql的一种,常见的nosql数据库还有redis.memcached.mongDB等,不同于传统的关系型数据库,nosql数据也有 ...

  3. JS写的排序算法演示

    看到网上有老外写的,就拿起自已之前完成的jmgraph画图组件也写了一个. 想了解jmgraph的请移步:https://github.com/jiamao/jmgraph 当前演示请查看:http: ...

  4. Algorithm:【Algorithm算法进阶之路】之数据结构二十多种算法演示

    Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 目录 一.数据结构算法 1.顺序表 2.链表 3.栈和队列 4.串的模式匹配 5.稀疏矩阵 6.广义表 7.二叉树 8 ...

  5. Canvas制作排序算法演示动画

    tips: 形象化演示排序算法可以让初学者快速理解,比较好的例子:jun-lu的SortAnimate,旧金山大学的David Galles教授的算法演示课件.最近在看canvas,试着用js+can ...

  6. mysql数据迁移neo4j_neo4j数据库迁移---------Neo4j数据库导入导出的方法

    Neo4j数据进行备份.还原.迁移的操作时,首先要关闭neo4j; /usr/share/neo4j/bin neo4j stop 如果出现 Neo4j not running 出现这种情况, Neo ...

  7. AlgorithmMan,一套免费的算法演示神器(开源动画演示版)

    文章末尾附带GitHub开源下载地址. 该文章的最新版本已迁移至个人博客[比特飞],单击链接 AlgorithmMan,一套免费的算法演示神器 | .Net中文网 访问. 0.概述 我从2018年08 ...

  8. AlgorithmMan,一套免费的算法演示神器

    AlgorithmMan by Iori V1.1 概述 1.冒泡排序(Bubble Sort) 2.快速排序(Quick Sort) 3.直接插入排序(Straight Insertion Sort ...

  9. 数据结构概念及连续存储数组的算法演示

    一.数据结构的概念: 我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序),而执 ...

最新文章

  1. 互联网10年,激战如梦
  2. CVPR2021 | PAConv:一种位置自适应卷积,点云分类、分割任务表现SOTA
  3. 2021年人工神经网络第四次作业-第一题:LeNet对于水果与动物进行分类
  4. 30分钟后如何终止PHP会话?
  5. hello word!------为什么开通博客以及自我介绍
  6. python模块之re模块
  7. 手动方式配置IPsec隧道
  8. Centos7安装ffmpeg和使用youtube-dl下载Youtube视频
  9. iqc工作职责和工作内容_iqc工作职责流程
  10. 计算机 桌面显示桌面图标不见了,显示桌面图标不见了怎么办,小编教你电脑显示桌面图标不见了怎么解决...
  11. Mantis集成富文本插件
  12. vue图片时间轴滑动_Vue之时间轴组件
  13. 第三方短信平台服务提供商是什么?
  14. 深入解读-微信小程序SDK
  15. 基于单片机心率监测的LED灯辅助睡眠系统设备-毕业设计
  16. 从Django的SECTET_KEY到代码执行
  17. sina\tent微博分享
  18. 【普】静态IP和动态IP有什么区别?
  19. Blast+安装使用的简单流程
  20. 妻子网购负债30万,丈夫被逼跳楼:别让“伪精致”,毁掉你的人生

热门文章

  1. CSDN博客周刊·2008年第6期
  2. 重返中国互联网中心舞台的微博,还有什么牌没出?
  3. 解决Maven打包报错:Failed to clean project: Failed to delete[亲测好用]
  4. 你笑不出的脑筋急转弯,就18题
  5. 【计算机毕业设计】303汽车租赁系统
  6. docker如何一键部署php项目教程
  7. 《Java两台电脑之间传输文件》
  8. MoCo代码分析 [自监督学习]
  9. 评论:个人信息泄露,期待法律有效堵漏
  10. 语法糖是什么?(ES6的一些小笔记)