neo4j apoc 系列
Neo4j APOC-01-图数据库 apoc 插件安装 neo4j on windows10
Neo4j APOC-03-图数据库 apoc 实战使用使用
Neo4j APOC-04-图数据库 apoc 实战使用使用 apoc.path.spanningTree 最小生成树
Neo4j APOC-05-图数据库 apoc 实战使用使用 labelFilter
Neo4j GDS-01-graph-data-science 图数据科学插件库概览
Neo4j GDS-02-graph-data-science 插件库安装实战笔记
Neo4j GDS-03-graph-data-science 简单聊一聊图数据科学插件库
实际测试
数据初始化
i_app 节点,i_app 指向 i_vm,i_phy。
i_app 有 name 属性。
i_vm, i_phy 有 ip 属性。
创建 4 个 i_app 节点,分别指向 4 个 i_vm。2个 i_vm 一组,分别指向 i_phy 节点。
给出 cypher 初始化语句
[plaintext]
1
2
3
4
5
6
7
8
9
10
11
12
13CREATE (phy1:i_phy {ip: '192.168.1.1'}),
(phy2:i_phy {ip: '192.168.1.2'}),
(vm1:i_vm {ip: '10.0.0.1'})-[:BELONGS_TO]->(phy1),
(vm2:i_vm {ip: '10.0.0.2'})-[:BELONGS_TO]->(phy1),
(vm3:i_vm {ip: '10.0.0.3'})-[:BELONGS_TO]->(phy2),
(vm4:i_vm {ip: '10.0.0.4'})-[:BELONGS_TO]->(phy2),
(app1:i_app {name: 'app1'})-[:POINTS_TO]->(vm1),
(app2:i_app {name: 'app2'})-[:POINTS_TO]->(vm2),
(app3:i_app {name: 'app3'})-[:POINTS_TO]->(vm3),
(app4:i_app {name: 'app4'})-[:POINTS_TO]->(vm4);
pageRank 使用
创建带应用拓扑的图投影
[plaintext]
1
2
3
4
5CALL gds.graph.project(
'app-topology',
['i_app', 'i_vm', 'i_phy'],
'*'
);
执行结果:
[plaintext]
1
2
3
4
5
6╒══════════════════════════════════════════════════════════════════════╤══════════════════════════════════════════════════════════════════════╤══════════════╤═════════╤═════════════════╤═════════════╕
│nodeProjection │relationshipProjection │graphName │nodeCount│relationshipCount│projectMillis│
╞══════════════════════════════════════════════════════════════════════╪══════════════════════════════════════════════════════════════════════╪══════════════╪═════════╪═════════════════╪═════════════╡
│{i_phy: {label: "i_phy", properties: {}}, i_app: {label: "i_app", prop│{__ALL__: {aggregation: "DEFAULT", orientation: "NATURAL", indexInvers│"app-topology"│10 │8 │1351 │
│erties: {}}, i_vm: {label: "i_vm", properties: {}}} │e: false, properties: {}, type: "*"}} │ │ │ │ │
└──────────────────────────────────────────────────────────────────────┴──────────────────────────────────────────────────────────────────────┴──────────────┴─────────┴─────────────────┴─────────────┘
资源排序
// 计算虚拟机层影响力
[plaintext]
1
2
3
4
5
6CALL gds.pageRank.stream('app-topology', {
})
YIELD nodeId, score
RETURN nodeId, score
ORDER BY score DESC;
结果:
[plaintext]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23╒══════╤═══════════════════╕
│nodeId│score │
╞══════╪═══════════════════╡
│0 │0.62175 │
├──────┼───────────────────┤
│1 │0.62175 │
├──────┼───────────────────┤
│2 │0.2775 │
├──────┼───────────────────┤
│3 │0.2775 │
├──────┼───────────────────┤
│4 │0.2775 │
├──────┼───────────────────┤
│5 │0.2775 │
├──────┼───────────────────┤
│6 │0.15000000000000002│
├──────┼───────────────────┤
│7 │0.15000000000000002│
├──────┼───────────────────┤
│8 │0.15000000000000002│
├──────┼───────────────────┤
│9 │0.15000000000000002│
└──────┴───────────────────┘
删除投影
[plaintext]
1
2
3CALL gds.graph.drop(
'app-topology'
);
chat
neo4j gds 库使用前需要创建 graph,有几种创建方式?对比的区别是什么
在Neo4j GDS库中,创建图投影(Graph Projection)的方式主要有以下四种,它们在灵活性、性能、适用场景和功能特性上有显著差异:
1. 原生投影(Native Projection)
函数: gds.graph.create
核心特点:
- 直接读取存储文件:从Neo4j底层存储文件高效加载数据,跳过Cypher引擎处理。
- 配置驱动:通过参数指定节点标签、关系类型及属性,语法简洁。例如:
[cypher]1
CALL gds.graph.create('myGraph', 'Person', {LIKES: {type: 'LIKES', orientation: 'UNDIRECTED'}})
- 性能优化:适合大规模数据处理,生产环境推荐使用。
- 支持操作:
- 改变关系方向(如将无向关系转为有向)。
- 聚合平行关系(如合并多对相同节点间的关系)。
- 属性投影(仅支持数值类型属性)。
适用场景:
- 需要高性能的场景(如企业级数据分析)。
- 数据结构简单且无需复杂计算的场景。
2. Cypher投影(Cypher Projection)
函数: gds.graph.create.cypher
核心特点:
- 灵活查询:通过Cypher语句动态定义节点和关系,支持复杂逻辑(如路径合并、属性计算)。
[cypher]1
2
3
4
5CALL gds.graph.create.cypher( 'myCypherGraph', 'MATCH (n:Person) RETURN id(n) AS id', 'MATCH (a)-[r:LIKES]->(b) RETURN id(a) AS source, id(b) AS target, r.weight AS weight' )
- 动态数据处理:可从临时查询结果生成图(如虚拟节点/关系)。
- 性能代价:因需执行Cypher查询,加载速度较慢,内存消耗可能更高。
适用场景:
- 开发阶段的探索性分析。
- 需要动态聚合或复杂过滤的场景(如两跳路径合并为单边关系)。
3. 隐式匿名图(Implicit Anonymous Graph)
特点:
- 无需显式创建:在运行算法时直接通过参数(如
nodeProjection
和relationshipProjection
)定义图结构。 - 生命周期短暂:仅存在于算法执行期间,执行后自动销毁。
- 语法示例:
[cypher]1
2
3
4CALL gds.pageRank.stream({ nodeProjection: 'Person', relationshipProjection: 'LIKES' })
适用场景:
- 单次算法执行且无需复用的场景。
4. 子图投影(Subgraph Projection)
函数: gds.beta.graph.create.subgraph
核心特点:
- 基于现有图过滤:从已创建的图投影中提取子集,支持标签、关系类型及属性过滤。
[cypher]1
2
3
4
5
6CALL gds.beta.graph.create.subgraph( 'subGraph', 'myGraph', 'n.property > 10', 'r.type = "KNOWS"' )
- 复用性:生成的新图可持久化在图目录中,供后续算法使用。
适用场景:
- 需要重复分析图的部分子集。
原生投影 vs. Cypher投影的详细对比
维度 | 原生投影 | Cypher投影 |
---|---|---|
性能 | 高(直接读取存储文件,无查询解析开销) | 低(需执行Cypher查询) |
灵活性 | 有限(基于标签和类型) | 高(支持任意Cypher逻辑) |
属性支持 | 仅数值类型 | 任意类型(需通过查询计算) |
适用阶段 | 生产环境 | 开发环境 |
关系聚合 | 支持(通过参数配置) | 需手动聚合(如COUNT 或DISTINCT ) |
多图支持 | 是(如多关系类型投影) | 是(通过复杂查询实现) |
总结建议
- 优先选择原生投影:当数据结构简单且需高性能时(如生产环境)。
- 使用Cypher投影:在开发阶段或需复杂逻辑时(如动态路径合并)。
- 匿名图:适用于单次、临时性的算法运行。
- 子图投影:用于从已有图中提取子集进行重复分析。
参考资料
https://github.com/neo4j/graph-data-science