序 xi
前言 xiii
第 1章 导论 1
1.1 何谓图 1
1.2 何谓图分析和图算法 3
1.3 图处理、图数据库、图查询和图算法 5
1.4 为何要关心图算法 6
1.5 图分析用例 9
1.6 小结 10
第 2章 图论及其概念 11
2.1 术语 11
2.2 图的类型和结构 12
2.3 图的种类 14
2.3.1 连通图与非连通图 14
2.3.2 无权图与加权图 15
2.3.3 无向图与有向图 16
2.3.4 无环图与有环图 17
2.3.5 稀疏图与稠密图 18
2.3.6 单部图、二部图和k部图 19
2.4 图算法的类型 21
2.4.1 路径查找 21
2.4.2 中心性 21
2.4.3 社团发现 22
2.5 小结 22
第3章 图平台和图处理 23
3.1 图平台和图处理的注意事项 23
3.1.1 平台注意事项 23
3.1.2 处理注意事项 24
3.2 典型平台 25
3.2.1 选择平台 25
3.2.2 Apache Spark 26
3.2.3 Neo4j图平台 28
3.3 小结 30
第4章 路径查找算法和图搜索算法 31
4.1 示例数据:交通图 33
4.1.1 将数据导入Spark 35
4.1.2 将数据导入Neo4j 36
4.2 广度优先搜索 36
4.3 深度优先搜索 38
4.4 最短路径算法 40
4.4.1 何时使用最短路径算法 41
4.4.2 使用Neo4j实现最短路径算法 41
4.4.3 使用Neo4j实现加权最短路径算法 43
4.4.4 使用Spark实现加权最短路径算法 44
4.4.5 最短路径算法的变体:A*算法 46
4.4.6 最短路径算法的变体:Yen的k最短路径算法 48
4.5 所有点对最短路径算法 49
4.5.1 近观所有点对最短路径算法 50
4.5.2 何时使用所有点对最短路径算法 51
4.5.3 使用Spark实现所有点对最短路径算法 51
4.5.4 使用Neo4j实现所有点对最短路径算法 52
4.6 单源最短路径算法 53
4.6.1 何时使用单源最短路径算法 54
4.6.2 使用Spark实现单源最短路径算法 55
4.6.3 使用Neo4j实现单源最短路径算法 57
4.7 最小生成树算法 57
4.7.1 何时使用最小生成树算法 58
4.7.2 使用Neo4j实现最小生成树算法 59
4.8 随机游走算法 61
4.8.1 何时使用随机游走算法 61
4.8.2 使用Neo4j实现随机游走算法 61
4.9 小结 63
第5章 中心性算法 64
5.1 示例数据:社交图 66
5.1.1 将数据导入Spark 67
5.1.2 将数据导入Neo4j 67
5.2 度中心性算法 68
5.2.1 可达性 68
5.2.2 何时使用度中心性算法 69
5.2.3 使用Spark实现度中心性算法 69
5.3 接近中心性算法 70
5.3.1 何时使用接近中心性算法 71
5.3.2 使用Spark实现接近中心性算法 72
5.3.3 使用Neo4j实现接近中心性算法 74
5.3.4 接近中心性算法变体:Wasserman & Faust算法 75
5.3.5 接近中心性算法变体:调和中心性算法 77
5.4 中间中心性算法 78
5.4.1 桥与控制点 78
5.4.2 计算中间中心性得分 79
5.4.3 何时使用中间中心性算法 79
5.4.4 使用Neo4j实现中间中心性算法 80
5.4.5 中间中心性算法变体:RA-Brandes算法 82
5.5 PageRank算法 83
5.5.1 影响力 84
5.5.2 PageRank算法公式 84
5.5.3 迭代、随机冲浪者和等级沉没 85
5.5.4 何时使用PageRank算法 86
5.5.5 使用Spark实现PageRank算法 87
5.5.6 使用Neo4j实现PageRank算法 88
5.5.7 PageRank算法变体:个性化PageRank算法 90
5.6 小结 91
第6章 社团发现算法 92
6.1 示例数据:软件依赖图 94
6.1.1 将数据导入Spark 96
6.1.2 将数据导入Neo4j 97
6.2 三角形计数和聚类系数 97
6.2.1 局部聚类系数 97
6.2.2 全局聚类系数 98
6.2.3 何时使用三角形计数和聚类系数 98
6.2.4 使用Spark实现三角形计数算法 99
6.2.5 使用Neo4j实现三角形计数算法 99
6.2.6 使用Neo4j计算局部聚类系数 100
6.3 强连通分量算法 101
6.3.1 何时使用强连通分量算法 102
6.3.2 使用Spark实现强连通分量算法 102
6.3.3 使用Neo4j实现强连通分量算法 103
6.4 连通分量算法 106
6.4.1 何时使用连通分量算法 106
6.4.2 使用Spark实现连通分量算法 106
6.4.3 使用Neo4j实现连通分量算法 107
6.5 标签传播算法 108
6.5.1 半监督学习和种子标签 110
6.5.2 何时使用标签传播算法 110
6.5.3 使用Spark实现标签传播算法 110
6.5.4 使用Neo4j实现标签传播算法 111
6.6 Louvain模块度算法 113
6.6.1 通过模块度进行基于质量的分组 114
6.6.2 何时使用Louvain模块度算法 117
6.6.3 使用Neo4j实现Louvain模块度算法 118
6.7 验证社团 122
6.8 小结 122
第7章 图算法实战 123
7.1 使用Neo4j分析Yelp数据 123
7.1.1 Yelp社交网络 124
7.1.2 导入数据 124
7.1.3 图模型 125
7.1.4 Yelp数据概览 125
7.1.5 行程规划应用程序 129
7.1.6 旅游商务咨询 134
7.1.7 查找相似类别 138
7.2 使用Spark分析航班数据 142
7.2.1 探索性分析 144
7.2.2 热门机场 144
7.2.3 源自ORD的延误 145
7.2.4 SFO的糟糕一天 147
7.2.5 通过航空公司互连的机场 149
7.3 小结 154
第8章 使用图算法增强机器学习 155
8.1 机器学习和上下文的重要性 155
8.2 关联特征提取与特征选择 157
8.2.1 图特征 158
8.2.2 图算法特征 158
8.3 图与机器学习实践:链接预测 160
8.3.1 工具和数据 161
8.3.2 将数据导入Neo4j 162
8.3.3 合著者关系图 163
8.3.4 创建均衡的训练数据集和测试数据集 164
8.3.5 如何预测缺失链接 169
8.3.6 创建机器学习管道 170
8.3.7 预测链接:基本图特征 171
8.3.8 预测链接:三角形和聚类系数 181
8.3.9 预测链接:社团发现 184
8.4 小结 190
8.5 总结 190
附录 额外信息及资料 191
关于作者 195
关于封面 195