<p>本次主要学习图数据库中常用到的一些算法,以及如何在<code>Neo4j</code>中调用,所以这一篇偏实战,每个算法的原理就简单的提一下。</p>

1. 图数据库中常用的算法

  • PathFinding & Search

    一般用来发现Nodes之间的最短路径,常用算法有如下几种

    Google Search Results

    • Dijkstra - 边不能为负值
    • Folyd - 边可以为负值,有向图、无向图
    • Bellman-Ford
    • SPFA
  • Centrality

    一般用来计算这个图中节点的中心性,用来发现比较重要的那些Nodes。这些中心性可以有很多种,比如

    • Degree Centrality - 度中心性
    • Weighted Degree Centrality - 加权度中心性
    • Betweenness Centrality - 介数中心性
    • Closeness Centrality - 紧度中心性
  • Community Detection

    基于社区发现算法和图分析Neo4j解读《权力的游戏》

    用于发现这个图中局部联系比较紧密的Nodes,类似我们学过的聚类算法。

    • Strongly Connected Components
    • Weakly Connected Components (Union Find)
    • Label Propagation
    • Lovain Modularity
    • Triangle Count and Average Clustering Coefficient

2. 路径搜索算法

  • Shortest Path

    1
    2
    3
    4
    5
    6
    7
    MATCH (start:Loc{name:"A"}), (end:Loc{name:"F"})
    CALL algo.shortestPath.stream(start, end, "cost")
    YIELD nodeId, cost

    MATCH (other:Loc)
    WHERE id(other) = nodeId
    RETURN other.name AS name, cost

  • Single Source Shortest Path

    1
    2
    3
    4
    5
    6
    MATCH (n:Loc {name:"A"})
    CALL algo.shortestPath.deltaStepping.stream(n, "cost", 3.0
    YIELD nodeId, distance

    MATCH (destination) WHERE id(destination) = nodeId
    RETURN destination.name AS destination, distance
  • All Pairs Shortest Path

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CALL algo.allShortestPaths.stream("cost",{nodeQuery:"Loc",defaultValue:1.0})
    YIELD sourceNodeId, targetNodeId, distance
    WITH sourceNodeId, targetNodeId, distance
    WHERE algo.isFinite(distance) = true

    MATCH (source:Loc) WHERE id(source) = sourceNodeId
    MATCH (target:Loc) WHERE id(target) = targetNodeId
    WITH source, target, distance WHERE source <> target
    RETURN source.name AS source, target.name AS target, distance
    ORDER BY distance DESC
    LIMIT 10
  • Minimum Weight Spanning Tree

    1
    2
    3
    4
    5
    MATCH (n:Place {id:"D"})
    CALL algo.spanningTree.minimum("Place", "LINK", "cost", id(n),
    {write:true, writeProperty:"MINST"})
    YIELD loadMillis, computeMillis, writeMillis, effectiveNodeCount
    RETURN loadMillis, computeMillis, writeMillis, effectiveNodeCount;
  • CASE

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    MERGE (a:Loc {name:"A"})
    MERGE (b:Loc {name:"B"})
    MERGE (c:Loc {name:"C"})
    MERGE (d:Loc {name:"D"})
    MERGE (e:Loc {name:"E"})
    MERGE (f:Loc {name:"F"})
    MERGE (a)-[:ROAD {cost:50}]->(b)
    MERGE (a)-[:ROAD {cost:50}]->(c)
    MERGE (a)-[:ROAD {cost:100}]->(d)
    MERGE (b)-[:ROAD {cost:40}]->(d)
    MERGE (c)-[:ROAD {cost:40}]->(d)
    MERGE (c)-[:ROAD {cost:80}]->(e)
    MERGE (d)-[:ROAD {cost:30}]->(e)
    MERGE (d)-[:ROAD {cost:80}]->(f)
    MERGE (e)-[:ROAD {cost:40}]->(f);

3. 中心性算法

  • PageRank

    1
    2
    3
    4
    5
    6
    CALL algo.pageRank.stream("Page", "LINKS",
    {iterations:20})
    YIELD nodeId, score
    MATCH (node) WHERE id(node) = nodeId
    RETURN node.name AS page,score
    ORDER BY score DESC

  • Degree Centrality

  • Betweenness Centrality

    1
    2
    3
    4
    5
    CALL algo.betweenness.stream("User", "MANAGES", {direction:"out"})
    YIELD nodeId, centrality
    MATCH (user:User) WHERE id(user) = nodeId
    RETURN user.id AS user,centrality
    ORDER BY centrality DESC;
  • Closeness Centrality

    1
    2
    3
    4
    5
    6
    CALL algo.closeness.stream("Node", "LINK")
    YIELD nodeId, centrality
    MATCH (n:Node) WHERE id(n) = nodeId
    RETURN n.id AS node, centrality
    ORDER BY centrality DESC
    LIMIT 20;
  • CASE

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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)

4. 社区发现算法

  • Strongly Connected Components

    1
    2
    3
    4
    CALL algo.scc.stream("User","FOLLOWS")
    YIELD nodeId, partition
    MATCH (u:User) WHERE id(u) = nodeId
    RETURN u.id AS name, partition
  • Weakly Connected Components (Union Find)

    1
    2
    3
    4
    CALL algo.unionFind.stream("User", "FRIEND", {})
    YIELD nodeId,setId
    MATCH (u:User) WHERE id(u) = nodeId
    RETURN u.id AS user, setId
  • Label Propagation

    1
    2
    CALL algo.labelPropagation.stream("User", "FOLLOWS",
    {direction: "OUTGOING", iterations: 10})
  • Lovain Modularity

    1
    2
    3
    4
    5
    CALL algo.louvain.stream("User", "FRIEND", {})
    YIELD nodeId, community
    MATCH (user:User) WHERE id(user) = nodeId
    RETURN user.id AS user, community
    ORDER BY community;
  • Triangle Count and Average Clustering Coefficient

    1
    2
    3
    4
    5
    6
    CALL algo.triangle.stream("Person","KNOWS")
    YIELD nodeA,nodeB,nodeC
    MATCH (a:Person) WHERE id(a) = nodeA
    MATCH (b:Person) WHERE id(b) = nodeB
    MATCH (c:Person) WHERE id(c) = nodeC
    RETURN a.id AS nodeA, b.id AS nodeB, c.id AS node

5. References

  • Neo4j in deep
  • 官方文档:Comprehensive-Guide-to-Graph-Algorithms-in-Neo4j-ebook
  原文地址:https://chenson.cc/2018/08/18/%E5%9B%BE%E6%95%B0%E6%8D%AE%E5%BA%93-Neo4j-%E5%B8%B8%E7%94%A8%E7%AE%97%E6%B3%95/
</div>

图数据库-Neo4j-常用算法的更多相关文章

  1. 图数据库neo4j添加算法包

    1. 从https://github.com/neo4j-contrib/neo4j-graph-algorithms/releases下载相应版本jar包,放到 C:\Users\Administr ...

  2. Hello World 之Spring Boot 调用图数据库Neo4j

    明日歌 [清]钱鹤滩 明日复明日,明日何其多! 我生待明日,万事成蹉跎 1. 图数据库Neo4j之爱的初体验 ----与君初相识,犹似故人归 在如今大数据(big data)横行的时代,传统的关系型数 ...

  3. 图数据库Neo4j简介

    图数据库Neo4j简介 转自: 图形数据库Neo4J简介 - loveis715 - 博客园https://www.cnblogs.com/loveis715/p/5277051.html 最近我在用 ...

  4. 主流图数据库Neo4J、ArangoDB、OrientDB综合对比:架构分析

    主流图数据库Neo4J.ArangoDB.OrientDB综合对比:架构分析 YOTOY 关注 0.4 2017.06.15 15:11* 字数 3733 阅读 16430评论 2喜欢 18 1: 本 ...

  5. 图数据库Neo4j

    官网下载:https://neo4j.com/download/ 图数据库Neo4j入门:https://blog.csdn.net/gobitan/article/details/68929118 ...

  6. 开源软件:NoSql数据库 - 图数据库 Neo4j

    转载自原文地址:http://www.cnblogs.com/loveis715/p/5277051.html 最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有 ...

  7. (三)图数据库neo4j的安装配置

    (一)neo4j安装 neo4j有社区版本和企业版,社区版本是免费的,企业版本是收费的.在linux上安装如下步骤: 1.将下载的neo4j-enterprise-3.4.0-unix.tar.gz包 ...

  8. 知识图谱之图数据库Neo4j

    知识图谱中的知识是通过RDF结构来进行表示的,其基本单元是事实.每个事实是一个三元组(S, P, O),在实际系统中,按照存储方式的不同,知识图谱的存储可以分为基于表结构的存储和基于图结构的存储. 基 ...

  9. 图数据库neo4j和关系数据库的区别

    相信您和我一样,在使用关系型数据库时常常会遇到一系列非常复杂的设计问题.例如一部电影中的各个演员常常有主角配角之分,还要有导演,特效等人员的参与.通常情况下这些人员常常都被抽象为Person类型,对应 ...

随机推荐

  1. elasticsearch _create api创建一个不存在的文档

    https://www.elastic.co/guide/cn/elasticsearch/guide/current/create-doc.html当我们索引一个文档, 怎么确认我们正在创建一个完全 ...

  2. gdb常用的调试命令

    首先将源代码编译.链接生成debug版本的可执行文件,然后通过‘gdb  debug版本的可执行文件名’进入调试模式. a) 单进程.单线程基础调试命令 l    显示main函数所在的文件的源代码 ...

  3. 001-log-log体系-log4j、jul、jcl、slf4j,日志乱象的归纳与统一

    一.概述 log4j→jul→jcl→slf4j之后就开始百花齐放[slf4j适配兼容新老用户] 1.1.log4j阶段 在JDK出现后,到JDK1.4之前,常用的日志框架是apache的log4j. ...

  4. Java实现ModbusTCP通信

    一个项目,需要用Java实现使用ModbusTCP和硬件设备通信 资料 代码下载 本文的代码和仿真软件:蓝奏云下载 官网资料 Modbus官网 Modbus协议 Modbus技术资源 MODBUS T ...

  5. windows7-maven配置

    1.确认jdk安装 2.下载 3.解压缩 4.配置环境变量 (1)计算机属性--高级系统配置--高级--环境变量---系统变量--新建 (2)添加环境变量 MAVEN_HOME PATH中添加到mav ...

  6. OpenGL.Qt551.问题

    1.Qt551 + vs2013 + Win7x64 缘由:将“教程14:渲染到纹理.html(http://www.opengl-tutorial.org/cn/intermediate-tutor ...

  7. Python报错:TypeError: data type not understood

    K-Means聚类算法 def randCent(dataSet, k): m, n = dataSet.shape # numpy中的shape函数的返回一个矩阵的规模,即是几行几列 centrod ...

  8. MapReduce 框架原理

    1. Hadoop 序列化 1.1 自定义Bean对象实现序列化接口 必须实现 Writable 接口: 反序列化时,需要反射调用空参构造函数,所以必须有空参构造: 重写序列化方法: 重写反序列化方法 ...

  9. System x 服务器制作ServerGuide U盘安装Windows Server 2008 操作系统 --不格式化盘

    1.全格式化 用ServerGuide10.5 刻录成U盘 下载附件中的Rufus 3.6工具,并制作引导U盘 以管理员权限打开Rufus 3.6, 选择镜像文件 2.不格式化,仅安装C盘下载老毛桃U ...

  10. 小菜鸟之SSM框架

    # SSM框架 # **什么是框架** 就是模板,将一些基础性的程序和代码由框架模板提供,然后程序员补充和业务需求相关的代码. # **ssm框架组成** s: springMvc 子框架 代替ser ...