本文继续基于上一篇文章,深入研究基于图谱的各类算法,相比传统的关键词搜索,关系连接,全文检索等,基于知识图谱的算法将充分利用知识图谱的实体关系及其属性权重等信息,为大数据分析做支撑,使得数据分析和知识洞察更直观,可解释和快速解决应用诉求,并可快速落地实施。基于知识图谱的图算法主要有中心度,路径搜索、社区发现,Link检测、相似分析和图表示等,详见下图。

另外,在Neo4j 4.0之后,不再支持algo了,推出了Graph Data Science(即GDS),区别于algo算法库,GDS需要根据知识图谱先创建投影图形,投影图的目的是用一个自定义的名称存储在图形目录中,使用该名称,可以被库中的任何算法多次重复引用。这使得多个算法可以使用相同的投影图,而不必在每个算法运行时都对其进行投影。同时,本地投影通过从Neo4j存储文件中读取构建,提供了最佳的性能。建议在开发和生产阶段都使用。

如果大家觉得有帮助,欢迎关注并推荐,谢谢啦!

示例实验环境:

Neo4 5.1.0,Linux7.5,jdk19,plugin有APOC5.1.0、GDS2.2.5等。

中心度算法用于识别图中特定节点的角色及其对网络的影响。

######################################################

投影图脚本

1.创建投影图

单个节点,一种关系

CALL gds.graph.project('myGraph4','com_aaa','has_key',{relationshipProperties: 'cost'})

两个节点,两种关系。

CALL gds.graph.project('myGraph4',    ['com_aaa', 'result'],   ['has_key', 'has_key']     )

2.查看投影图是否存在

CALL gds.graph.exists('myGraph4')YIELD graphName, existsRETURN graphName, exists

3.删除投影图

CALL gds.graph.drop('myGraph4') YIELD graphName;

#######################################################

一、实战案例

1.创建投影图,如多个标签和关系的投影

单个节点,一种关系。

CALL gds.graph.project('myGraph4',            'com_aaa',             'has_key'               )

两个节点,两种关系。

CALL gds.graph.project('wellResult',    ['com_aaa', 'result'],   ['has_key', 'has_key']     )

2.pageRank算法

指定一个特定的节点或起点,重点关注这个指定节点的中心度。PageRank算法最初是谷歌推出用来计算网页排名的,简单的说就是,指向这个节点的关系越多,那么这个节点就越重要。

MATCH (source:com_well {name: 'com_aaa'})CALL gds.pageRank.stream('wellResult',{ maxIterations: 20, dampingFactor: 0.85, sourceNodes: [source] })YIELD nodeId, scoreRETURN gds.util.asNode(nodeId) LIMIT 100

3.shortestPath算法

问题:AAA节点的最短路径(蓝色节点),用于发现源节点和目标节点之间的最短通行路径。

MATCH (source:com_aaa{name: 'AAA'}), (target:result)CALL gds.shortestPath.dijkstra.stream('wellResult', {sourceNode: source,targetNode: target})YIELD index, sourceNode, targetNode, totalCost, nodeIds, costs, pathRETURNindex,gds.util.asNode(sourceNode).name AS sourceNodeName,gds.util.asNode(targetNode).name AS targetNodeName,totalCost,[nodeId IN nodeIds | gds.util.asNode(nodeId).name] AS nodeNames,costs,nodes(path) as pathORDER BY index

4.allShortestPaths:所有最短路径的集合。

MATCH (source:com_aaa{name: 'xxx'}), (target:result)CALL gds.allShortestPaths.delta.stream('wellResult', {sourceNode: source,delta: 3.0})YIELD index, sourceNode, targetNode, totalCost, nodeIds, costs, pathRETURNindex,gds.util.asNode(sourceNode).name AS sourceNodeName,gds.util.asNode(targetNode).name AS targetNodeName,totalCost,[nodeId IN nodeIds | gds.util.asNode(nodeId).name] AS nodeNames,costs,nodes(path) as pathORDER BY index

5.深度优先算法(dfs)和广度优先算法(bfs)

快速遍历xxx节点的相关数据。(蓝色节点)

MATCH (source:com_aaa{name: 'xxx'})CALL gds.dfs.stream('wellResult', {sourceNode: source})YIELD pathRETURN path 

6.随机遍历(RandomWalk)

指定节点

MATCH (page:com_aaa)WHERE page.name IN ['aa-1-1']WITH COLLECT(page) as sourceNodesCALL gds.randomWalk.stream('wellResult',{sourceNodes: sourceNodes,walkLength: 3,walksPerNode: 1,randomSeed: 42,concurrency: 1})YIELD nodeIds, pathRETURN nodeIds, [node IN nodes(path) | node.name ] AS pagesMATCH (page:com_aaa)WHERE page.name IN ['aaa']WITH COLLECT(page) as sourceNodesCALL gds.randomWalk.stream('miningResult',{sourceNodes: sourceNodes,walkLength: 3,walksPerNode: 1,randomSeed: 42,concurrency: 1})YIELD nodeIds, pathRETURN nodeIds, path limit 100

未指定节点

CALL gds.randomWalk.stream('wellResult',{walkLength: 3,walksPerNode: 1,randomSeed: 42,concurrency: 1})YIELD nodeIds, pathRETURN nodeIds, path LIMIT 20

7.向量化(Embeding)

1).Node2Vec是一种节点嵌入算法,它基于图中的随机行走计算节点的向量表示。邻域是通过随机行走进行采样的。使用一些随机邻域样本,该算法训练了一个单隐层神经网络。该神经网络被训练为根据另一个节点的出现情况来预测一个节点在随机行走中出现的可能性。

2).FastRP快速随机投影,是随机投影算法家族中的一种节点嵌入算法。这些算法在理论上受到Johnsson-Lindenstrauss定理的支持,根据该定理,人们可以将任意维度的n个向量投影到O(log(n))维度,并且仍然近似地保留各点间的成对距离。事实上,一个以随机方式选择的线性投影满足这一特性。

3).GraphSAGE是一种用于计算节点嵌入的归纳算法。GraphSAGE是利用节点特征信息在未见过的节点或图上生成节点嵌入。该算法不是为每个节点训练单独的嵌入,而是学习一个函数,通过从节点的本地邻域采样和聚集特征来生成嵌入。

CALL gds.beta.node2vec.stream('wellResult', {embeddingDimension: 4})YIELD nodeId, embeddingRETURN gds.util.asNode(nodeId).name, embedding

二、参考示例1

数据

MERGE (home:Page {name:"Home"})MERGE (about:Page {name:"About"})MERGE (product:Page {name:"Product"})MERGE (links:Page {name:"Links"})MERGE (a:Page {name:"Site A"})MERGE (b:Page {name:"Site B"})MERGE (c:Page {name:"Site C"})MERGE (d:Page {name:"Site D"})MERGE (home)-[:LINKS]->(about)MERGE (about)-[:LINKS]->(home)MERGE (product)-[:LINKS]->(home)MERGE (home)-[:LINKS]->(product)MERGE (links)-[:LINKS]->(home)MERGE (home)-[:LINKS]->(links)MERGE (links)-[:LINKS]->(a)MERGE (a)-[:LINKS]->(home)MERGE (links)-[:LINKS]->(b)MERGE (b)-[:LINKS]->(home)MERGE (links)-[:LINKS]->(c)MERGE (c)-[:LINKS]->(home)MERGE (links)-[:LINKS]->(d)MERGE (d)-[:LINKS]->(home)

1.创建投影图

CALL gds.graph.project('myGraph','Page','LINKS',{relationshipProperties: 'weight'})

2.计算运行该算法的成本:主要是内存占用成本等

CALL gds.pageRank.write.estimate('myGraph', {writeProperty: 'pageRank',maxIterations: 20,dampingFactor: 0.85})YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory

3.pagerank算法

指定一个特定的起点,重点关注这个指定点的中心度

MATCH (siteA:Page {name: 'Site A'})CALL gds.pageRank.stream('myGraph')YIELD nodeId, scoreRETURN gds.util.asNode(nodeId), scoreORDER BY score DESC

4.RandomWalk

CALL gds.graph.project( 'myGraph2', 'Page', { LINKS: { orientation: 'UNDIRECTED' } } );

未指定源(sourceNodes)CALL gds.randomWalk.stream('myGraph',{walkLength: 3,walksPerNode: 1,randomSeed: 42,concurrency: 1})YIELD nodeIds, pathRETURN nodeIds, [node IN nodes(path) | node.name ] AS pages指定源(sourceNodes)MATCH (page:Page)WHERE page.name IN ['Home', 'About']WITH COLLECT(page) as sourceNodesCALL gds.randomWalk.stream('myGraph',{sourceNodes: sourceNodes,walkLength: 3,walksPerNode: 1,randomSeed: 42,concurrency: 1})YIELD nodeIds, pathRETURN nodeIds, [node IN nodes(path) | node.name ] AS pages

统计成本

CALL gds.randomWalk.stats( 'myGraph', { walkLength: 3, walksPerNode: 1, randomSeed: 42, concurrency: 1 } )

三、参考示例2

数据

CREATE (a:Location {name: 'A'}),(b:Location {name: 'B'}),(c:Location {name: 'C'}),(d:Location {name: 'D'}),(e:Location {name: 'E'}),(f:Location {name: 'F'}),(a)-[:ROAD {cost: 50}]->(b),(a)-[:ROAD {cost: 50}]->(c),(a)-[:ROAD {cost: 100}]->(d),(b)-[:ROAD {cost: 40}]->(d),(c)-[:ROAD {cost: 40}]->(d),(c)-[:ROAD {cost: 80}]->(e),(d)-[:ROAD {cost: 30}]->(e),(d)-[:ROAD {cost: 80}]->(f),(e)-[:ROAD {cost: 40}]->(f);

1.创建投影图

CALL gds.graph.project('myGraph','Location','ROAD',{relationshipProperties: 'cost'})

2.计算运行成本

MATCH (source:Location {name: 'A'}), (target:Location {name: 'F'})CALL gds.shortestPath.dijkstra.write.estimate('myGraph', {sourceNode: source,targetNode: target,relationshipWeightProperty: 'cost',writeRelationshipType: 'PATH'})YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemoryRETURN nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory

3.shortestPath算法

MATCH (source:Location {name: 'A'}), (target:Location {name: 'F'})CALL gds.shortestPath.dijkstra.stream('myGraph', {sourceNode: source,targetNode: target,relationshipWeightProperty: 'cost'})YIELD index, sourceNode, targetNode, totalCost, nodeIds, costs, pathRETURNindex,gds.util.asNode(sourceNode).name AS sourceNodeName,gds.util.asNode(targetNode).name AS targetNodeName,totalCost,[nodeId IN nodeIds | gds.util.asNode(nodeId).name] AS nodeNames,costs,nodes(path) as pathORDER BY index

四、参考示例3

数据

CREATE (alice:People{name: 'Alice'})CREATE (bob:People{name: 'Bob'})CREATE (carol:People{name: 'Carol'})CREATE (dave:People{name: 'Dave'})CREATE (eve:People{name: 'Eve'})CREATE (guitar:Instrument {name: 'Guitar'})CREATE (synth:Instrument {name: 'Synthesizer'})CREATE (bongos:Instrument {name: 'Bongos'})CREATE (trumpet:Instrument {name: 'Trumpet'})CREATE (alice)-[:LIKES]->(guitar)CREATE (alice)-[:LIKES]->(synth)CREATE (alice)-[:LIKES]->(bongos)CREATE (bob)-[:LIKES]->(guitar)CREATE (bob)-[:LIKES]->(synth)CREATE (carol)-[:LIKES]->(bongos)CREATE (dave)-[:LIKES]->(guitar)CREATE (dave)-[:LIKES]->(synth)CREATE (dave)-[:LIKES]->(bongos);

1.投影图

CALL gds.graph.project('myGraph2', ['People', 'Instrument'], 'LIKES');

2.Node2Vec向量化

CALL gds.beta.node2vec.stream('myGraph2', {embeddingDimension: 4})YIELD nodeId, embeddingRETURN gds.util.asNode(nodeId).name, embedding

Cypher高级查询--典型算法--利用Graph Data Science(GDS)的算法实现数据分析与知识洞察相关推荐

  1. Neoj图数据科学库(The Neo4j graph data science library)使用指南

    目录 介绍 算法 图目录 版本 安装 支持的Neo4j版本 Neo4j Desktop Neo4j Server Enterprise 版本配置 Neo4j Docker Neo4j Causal C ...

  2. Cypher高级查询

    通过学习Cypher的基础语法,再结合实际应用的图谱检索需求,比如有时候需要查找多跳关系的节点.最短路径.多关系多层次查找.相关检索和模糊检索等,整理形成了基于Cypher的高级查询,后续会根据实际应 ...

  3. neo4j︱Cypher完整案例csv导入、关系联通、高级查询(三)

    图数据库常规的有:neo4j(支持超多语言).JanusGraph/Titan(分布式).Orientdb,google也开源了图数据库Cayley(Go语言构成).PostgreSQL存储RDF格式 ...

  4. ORM框架之Spring Data JPA(三)高级查询---复杂查询

    一.spring data jpa高级查询 1.1Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data ...

  5. 【Spring Data ElasticSearch】高级查询,聚合

    [Spring Data ElasticSearch]高级查询,聚合 1. 高级查询 1.1 基本查询 1.2 自定义查询 1.3 分页查询 1.4 排序 2. 聚合 2.1 聚合为桶 2.2 嵌套聚 ...

  6. 【javaWeb微服务架构项目——乐优商城day07】——Elasticsearch介绍和安装及使用(安装kibana,安装ik分词器,Spring Data Elasticsearch,高级查询)

    文章目录 0.学习目标 1.Elasticsearch介绍和安装 1.1.简介 1.1.1.Elastic 1.1.2.Elasticsearch 1.1.3.版本 1.2.安装和配置 1.2.1.新 ...

  7. Python之Pandas:利用Pandas函数实现对表格文件的查之高级查询(类似sql,分组查询等)之详细攻略

    Python之Pandas:利用Pandas函数实现对表格文件的查之高级查询(类似sql,分组查询等)之详细攻略 目录 利用Pandas函数实现对表格文件的查之高级查询(类似sql) 1.分组查询

  8. ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值——bug调试记录

    ML之回归预测:利用十(xgboost,10-1)种机器学习算法对无人驾驶汽车系统参数(2017年的data,18+2)进行回归预测值VS真实值--bug调试记录 目录 输出结果 1.增加XGBR算法 ...

  9. Efficient Batch Processing for Multiple Keyword Queries on Graph Data

    摘要 目前的关键词查询只关注单个查询.对于查询系统来说,短时间内会接受大批量的关键词查询,往往不同查询包含相同的关键词.  因此本文研究图数据多关键词查询的批处理.为多查询和单个查询找到最优查询计划都 ...

最新文章

  1. Github热榜:2021年33篇最酷AI论文综述!多位华人作者入选
  2. mysql语句中事务可靠性_MySql的事务使用与示例详解
  3. 用于读、写、删除、比较Session中的用户信息的类库。
  4. jQuery的$(document).ready()和JavaScript onload事件
  5. 荣耀V40联合天猫推出上门取旧送新服务 还可12期免息
  6. cocos creator-js-虚拟摇杆
  7. linux中ifconfig命令作用,ifconfig命令作用范围的是什么
  8. Python检测重复字——部分中华字经重复字检测
  9. java实现发送短信和邮箱
  10. wireshark学习笔记
  11. 使命召唤 高级战争 闪退_使命召唤:现代战争进入第5季
  12. 动效设计入门工具小手册(微交互)
  13. MySQL基础(一)---数据库的诱惑
  14. ICC 图文学习——LAB1:Data Setup 数据设置
  15. 学习-浏览器的同源政策
  16. 用java写篮球弹跳_篮球怎么在家练弹跳?
  17. 雅虎网站优化34条军规
  18. 人工智能导论(王万良版)笔记整理
  19. JRE安装出错,显示1603的错误。
  20. 计算机毕业设计JAVA糖助手服务交流平台mybatis+源码+调试部署+系统+数据库+lw

热门文章

  1. emqx学习笔记(1)- emqx的下载和安装
  2. Oracle JDK高版本商用付费分析
  3. “假脸”横行!这个良心网站教你如何成为“打假”专家
  4. SDL介绍----3、STRIDE威胁建模方法
  5. 【GitHub】分享个可以分享代码,cv “抄” 代码的地方,支持多种语言
  6. matlab win10 gpu加速,大师讲解win10硬件加速gpu计划开启方法的详尽处理方式
  7. 元数据管理的核心功能及使用?
  8. 算法刷题-O(1) 时间插入、删除和获取随机元素、汇总区间
  9. elementUI日期控件el-date-picker显示的月份、日期变成英文了
  10. php在线客服框架,智能在线客服-框架