Neo4j数据库GDS算法演示

这篇具有很好参考价值的文章主要介绍了Neo4j数据库GDS算法演示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 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

  1. 得到示例的演示步骤

在neo4j中执行:

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

得到如下:

Neo4j数据库GDS算法演示
  1. 导入示例数据

首先将示例数据文件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()

Neo4j数据库GDS算法演示
  1. 创建图投影

执行任何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')

  1. 示例查询算法

通用算法语法:

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

Neo4j数据库GDS算法演示
  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;

Neo4j数据库GDS算法演示
  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

Neo4j数据库GDS算法演示
  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

Neo4j数据库GDS算法演示
  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

Neo4j数据库GDS算法演示

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

  1. 清理演示环境

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

CALL gds.graph.drop('routes-weighted');文章来源地址https://www.toymoban.com/news/detail-480545.html

到了这里,关于Neo4j数据库GDS算法演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Neo4j数据库删除数据

    我们使用Neo4j图数据库进行写入数据操作之后,免不了要删除数据的。 但是Neo4j的控制台没有提供快捷的删除按钮,所以我们还是需要通过命令来操作。 如果数据库中的数据量并不大,节点数相对较少,我们可以通过命令行直接删除节点。 此类操作起到清空数据库的效果,但

    2023年04月09日
    浏览(79)
  • neo4j清空数据库

    清空所有Person、 Movie节点及其所有关系 查询任意数据  如果没有, 就说明已经删除成功了 这段代码是用Cypher查询语言编写的,用于清空所有的Person节点、Movie节点以及它们之间的所有关系。让我们逐步解释代码的每个部分: 这部分代码使用MATCH语句来查找图数据库中的所有

    2024年02月14日
    浏览(31)
  • Neo4j 图形数据库

    目录 Neo4j 基础 什么是Neo4j Neo4j 模块构建 Neo4j的主要应用场景 Neo4j 环境搭建 Docker 安装Neo4j Neo4j数据浏览器  Neo4j CQL CQL简介 Neo4j CQL高级 CQL 函数 CQL多深度关系节点 事务 索引 约束 Neo4j之Admin管理员操作 Neo4j - 数据库备份和恢复 调优思路  Neo4j 程序访问 SpringBoot 整合Neo4j

    2024年02月10日
    浏览(36)
  • 图数据库_Neo4j的使用场景_以及Windows版Neo4j Community Server安装_欺诈检测_推荐_知识图谱---Neo4j图数据库工作笔记0003

    可以看到使用场景,比如欺诈检测, 要建立图谱,才能进行,欺诈人员检测   可以看到图谱的各种应用场景 然后推荐引擎也需要,可以看到 在金融,旅行,求职招聘,保健,服务,媒体娱乐,都可以进行推荐   然后还有知识图谱 身份访问管理,这里,可以进行安全管理,可以挖掘出潜在关系

    2024年02月12日
    浏览(32)
  • 图数据库Neo4j简介

    随着社交、电商金融、零售、物联网的快速发展,现实社会支起了一张张庞大二复杂的关系网,传统数据库很难处理关系运算,急需一种支持海量复杂数据关系运算的数据库,图数据库应运而生。 图数据库是基于图论实现的一种Nosql数据库,起数据结构和数据查询方式都是以

    2024年02月22日
    浏览(40)
  • Neo4j数据库使用相关

    做知识图谱相关项目,初步使用了neo4j数据库,简单记录一下使用过程和踩坑备忘~ 操作系统Win10+Neo4j社区版(community,版本4.4.30) 目录 一、安装 1.1 安装Java和Neo4j 1.2 环境变量设置 二、 Neo4j使用 2.1 安装服务 2.2 数据库使用 2.3 数据库备份  Java下载链接:Java Downloads | Oracle

    2024年04月16日
    浏览(48)
  • 图数据库Neo4j——SpringBoot使用Neo4j & 简单增删改查 & 复杂查询初步

    图形数据库是专门用于存储图形数据的数据库,它使用图形模型来存储数据,并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库,本篇博客介绍如何在SpringBoot中使用Neo4j图数据库,如何进行简单的增删改查,以及如何进行复杂

    2024年02月06日
    浏览(42)
  • 图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010

    2023-09-10 10:37:48 补充 注意:下面是旧版本的语法,如果你发现@NodeEntity这样的注解没有的话可以这样: 这里就要用@Node 另外如果@StartNode和@EndNode都没有了,那么说明是用法变了. 关于最新的用法,在官网有明确的说明和案例,很有用: 下面给出官网的案例:

    2024年02月12日
    浏览(37)
  • 图数据库_Neo4j中文版_Centos7.9安装Neo4j社区版3.5.9_基于jdk1.8---Neo4j图数据库工作笔记0012

        由于我们在国内使用啊,具体还是要用中文版滴,找了好久这个neo4j,原来还是有中文版的, 中文版下载地址在这里: 所有版本都在这里了,需要哪个自己去下载就可以了,要注意下载以后,参考:  在这个位置下载,主要是找到对应中文版的安装包,花了写时间啊 然后我们看一下安装

    2024年02月12日
    浏览(35)
  • Neo4j导出和导入数据库

    Neo4j 4.x版本和5.x版本的导出导入有区别,这里分开来讲。 导入导出之前要先 关闭 neo4j服务。 进入 $NEO4J_HOME%/bin 目录执行如下数据库导出命令: 提示: 其中 neo4j.db 是你需要导出的默认数据库。可以去 conf 文件中查看,默认数据库是哪一个。

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包