neo4j apoc 系列

Neo4j APOC-01-图数据库 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 简单聊一聊图数据科学插件库

Neo4j GDS-04-图的中心性分析介绍

Neo4j GDS-05-neo4j中的中心性分析算法

实际测试

数据初始化

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
13
CREATE (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);
Neo4j Graph VisualizationCreated using Neo4j (http://www.neo4j.com/)BELONGS_TOBELONGS_TOBELONGS_TOBELONGS_TOPOINTS_TOPOINTS_TOPOINTS_TOPOINTS_TO 192.168.… 192.168.… 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4 app1 app2 app3 app4

pageRank 使用

创建带应用拓扑的图投影

  [plaintext]
1
2
3
4
5
CALL 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
6
CALL 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
3
CALL 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
    5
    CALL 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)

特点:

  • 无需显式创建:在运行算法时直接通过参数(如nodeProjectionrelationshipProjection)定义图结构。
  • 生命周期短暂:仅存在于算法执行期间,执行后自动销毁。
  • 语法示例:
      [cypher]
    1
    2
    3
    4
    CALL gds.pageRank.stream({ nodeProjection: 'Person', relationshipProjection: 'LIKES' })

适用场景:

  • 单次算法执行且无需复用的场景。

4. 子图投影(Subgraph Projection)

函数: gds.beta.graph.create.subgraph
核心特点:

  • 基于现有图过滤:从已创建的图投影中提取子集,支持标签、关系类型及属性过滤。
      [cypher]
    1
    2
    3
    4
    5
    6
    CALL gds.beta.graph.create.subgraph( 'subGraph', 'myGraph', 'n.property > 10', 'r.type = "KNOWS"' )
  • 复用性:生成的新图可持久化在图目录中,供后续算法使用。

适用场景:

  • 需要重复分析图的部分子集。

原生投影 vs. Cypher投影的详细对比

维度 原生投影 Cypher投影
性能 高(直接读取存储文件,无查询解析开销) 低(需执行Cypher查询)
灵活性 有限(基于标签和类型) 高(支持任意Cypher逻辑)
属性支持 仅数值类型 任意类型(需通过查询计算)
适用阶段 生产环境 开发环境
关系聚合 支持(通过参数配置) 需手动聚合(如COUNTDISTINCT
多图支持 是(如多关系类型投影) 是(通过复杂查询实现)

总结建议

  • 优先选择原生投影:当数据结构简单且需高性能时(如生产环境)。
  • 使用Cypher投影:在开发阶段或需复杂逻辑时(如动态路径合并)。
  • 匿名图:适用于单次、临时性的算法运行。
  • 子图投影:用于从已有图中提取子集进行重复分析。

参考资料

https://github.com/neo4j/graph-data-science