1. Neo4j Graph Data Science (GDS)插件概述 #
Neo4j Graph Data Science (GDS) 是一个强大的图算法库,为Neo4j数据库提供了专业的图分析功能。它包含了一系列高效的图算法,可以帮助用户在图上执行各种分析任务,如社区检测、节点重要性计算、路径查找等。
1.1 主要特点: #
- 高性能:针对大规模图优化,支持并行计算
- 丰富的算法库:包含50+种图算法
- 内存管理:支持投影图模型,高效利用内存
- 生产就绪:可直接用于生产环境
- 与Cypher集成:算法结果可直接用于Cypher查询
2. 安装与配置 #
2.1 安装方法: #
- 从Neo4j Desktop的"Plugins"选项卡安装
- 手动下载对应版本的.jar文件放入plugins目录
2.3 版本兼容性: #
确保GDS版本与Neo4j数据库版本匹配
2.4 配置参数: #
在neo4j.conf中可配置:
# 允许GDS过程调用
# 配置JVM堆内存大小
# 下面参数仅供参考,实际请根据服务器内存调整
#
dbms.security.procedures.unrestricted=gds.*
dbms.memory.heap.initial_size=4G
dbms.memory.heap.max_size=4G3. 核心概念 #
3.1 图投影(Graph Projection) #
GDS不在原始图上操作,而是创建内存中的图投影,有三种类型:
原生投影:最高效,适合大型图
// 创建名为'my-graph'的图投影,节点类型为Person,关系类型为KNOWS CALL gds.graph.project( 'my-graph', 'Person', 'KNOWS' )Cypher投影:更灵活,可使用Cypher查询定义
// 使用Cypher语句定义节点和关系,创建名为'cypher-graph'的图投影 CALL gds.graph.project.cypher( 'cypher-graph', // 定义节点集合 'MATCH (n:Person) RETURN id(n) AS id', // 定义关系集合 'MATCH (a:Person)-[r:KNOWS]->(b:Person) RETURN id(a) AS source, id(b) AS target' )匿名投影:临时使用,不持久化
3.2 算法执行模式 #
- Stats:返回算法统计信息
- Stream:返回原始结果
- Write:将结果写回数据库
- Mutate:将结果保存在图投影中
4. 主要算法类别 #
4.1 中心性算法 #
用于识别图中最重要的节点:
PageRank
// 在'my-graph'图上执行PageRank算法,返回每个节点的得分 CALL gds.pageRank.stream('my-graph') YIELD nodeId, score // 将nodeId转换为节点对象,并返回节点名称和得分 RETURN gds.util.asNode(nodeId).name AS name, score // 按得分降序排列 ORDER BY score DESCBetweenness Centrality
// 在'my-graph'图上执行介数中心性算法 CALL gds.betweenness.stream('my-graph')ArticleRank
// 在'my-graph'图上执行ArticleRank算法 CALL gds.articleRank.stream('my-graph')
4.2 社区检测算法 #
用于发现图中的社区结构:
Louvain
// 在'my-graph'图上执行Louvain社区检测算法 CALL gds.louvain.stream('my-graph')Label Propagation
// 在'my-graph'图上执行标签传播社区检测算法 CALL gds.labelPropagation.stream('my-graph')Strongly Connected Components
// 在'my-graph'图上执行强连通分量算法 CALL gds.alpha.scc.stream('my-graph')
4.3 路径查找算法 #
Shortest Path
// 在'my-graph'图上使用Dijkstra算法查找最短路径 CALL gds.shortestPath.dijkstra.stream('my-graph', { // 指定起点节点ID sourceNode: source, // 指定终点节点ID targetNode: target, // 指定权重属性 relationshipWeightProperty: 'weight' })A*算法
// 在'my-graph'图上使用A*算法查找最短路径 CALL gds.shortestPath.astar.stream('my-graph', { // 指定起点节点ID sourceNode: source, // 指定终点节点ID targetNode: target, // 指定纬度属性 latitudeProperty: 'lat', // 指定经度属性 longitudeProperty: 'lon' })
4.4 节点相似性算法 #
Jaccard Similarity
// 在'my-graph'图上执行Jaccard节点相似性算法 CALL gds.nodeSimilarity.stream('my-graph')Cosine Similarity
// 在'my-graph'图上执行余弦相似性算法 CALL gds.alpha.similarity.cosine.stream('my-graph')
4.5 图嵌入算法 #
FastRP (Fast Random Projection)
// 在'my-graph'图上执行FastRP图嵌入算法 CALL gds.fastRP.stream('my-graph', { // 嵌入向量维度 embeddingDimension: 256, // 迭代权重 iterationWeights: [0.8, 1.0, 1.0] })Node2Vec
// 在'my-graph'图上执行Node2Vec图嵌入算法 CALL gds.beta.node2vec.stream('my-graph')
4.6 链接预测算法 #
Adamic-Adar
// 在'my-graph'图上执行Adamic-Adar链接预测算法 CALL gds.alpha.linkprediction.adamicAdar('my-graph', { // 指定节点标签 nodeLabels: ['Person'], // 指定关系类型 relationshipTypes: ['KNOWS'] })Common Neighbors
// 在'my-graph'图上执行共同邻居链接预测算法 CALL gds.alpha.linkprediction.commonNeighbors('my-graph')
5. 机器学习集成 #
GDS提供了与机器学习模型的集成:
5.1 管道(Pipeline)功能 #
节点分类管道
// 创建节点分类管道,命名为'pipe' CALL gds.beta.pipeline.nodeClassification.create('pipe') // 向管道添加节点属性,使用PageRank分数,结果写入pr属性 CALL gds.beta.pipeline.nodeClassification.addNodeProperty('pipe', 'pageRank', { mutateProperty: 'pr' }) // 训练节点分类模型,指定目标属性为class,模型名为nc-model CALL gds.beta.pipeline.nodeClassification.train('my-graph', { pipeline: 'pipe', targetProperty: 'class', modelName: 'nc-model' })链接预测管道
// 创建链接预测管道,命名为'lp-pipe' CALL gds.beta.pipeline.linkPrediction.create('lp-pipe')
5.2 模型管理 #
// 列出所有已训练的GDS模型
CALL gds.beta.model.list()
// 删除名为'nc-model'的模型
CALL gds.beta.model.drop('nc-model')6. 性能优化技巧 #
- 使用原生投影:比Cypher投影更快
- 合理配置内存:根据图大小调整JVM堆大小
- 并行执行:设置
concurrency参数 - 采样:对大图使用采样技术
- 图过滤:只加载需要的节点和关系
7. 实际应用案例 #
7.1 推荐系统 #
// 1. 创建包含用户和产品的图投影
CALL gds.graph.project(
'rec-graph',
['User', 'Product'],
{
PURCHASED: {orientation: 'UNDIRECTED'},
SIMILAR: {orientation: 'UNDIRECTED'}
}
)
// 2. 运行个性化PageRank
CALL gds.pageRank.stream('rec-graph', {
maxIterations: 20,
dampingFactor: 0.85,
sourceNodes: [userNodeId]
})
// 3. 获取推荐结果
MATCH (p:Product)
WHERE id(p) = nodeId
RETURN p.name, score
ORDER BY score DESC
LIMIT 107.2 欺诈检测 #
// 1. 检测异常社区
CALL gds.louvain.stream('transaction-graph')
YIELD nodeId, communityId
WITH communityId, count(*) AS size
WHERE size < 5 // 小社区可能是异常
// 2. 结合中心性分析
CALL gds.betweenness.stream('transaction-graph')
YIELD nodeId, score
WHERE score > threshold8. 监控与管理 #
// 查看已加载的图
CALL gds.graph.list()
// 查看图信息
CALL gds.graph.info('my-graph')
// 删除图释放内存
CALL gds.graph.drop('my-graph')
// 查看算法执行时间
CALL gds.alpha.debug.arrowlog()9. 最新功能与未来发展 #
GDS持续更新,最新版本可能包含:
- 新算法实现
- 性能改进
- 更多机器学习集成
- 更强大的管道功能
建议定期查看官方文档获取最新信息。
10. 学习资源 #
- 官方文档:https://neo4j.com/docs/graph-data-science/current/
- GDS手册:https://neo4j.com/lp/graph-data-science/
- 示例项目:https://github.com/neo4j/graph-data-science
- 在线沙盒:https://sandbox.neo4j.com/
通过掌握GDS插件,您可以充分利用Neo4j的图分析能力,解决复杂的网络分析问题。# Neo4j Graph Data Science (GDS) 插件详解