入门指南
安装
Neo4j Graph Analytics for Snowflake 以原生应用程序(Native Application)的形式提供。可通过 Snowflake Marketplace 安装该应用程序。在安装过程中,需要启用事件共享(Event sharing)。有关更多信息,请参阅管理事件共享。
应用程序权限
该应用程序需要 CREATE COMPUTE POOL 和 CREATE WAREHOUSE 权限。授予这些权限最简单的方法是通过 Snowsight 选择 Data Products ⇒ Apps ⇒ Neo4j Graph Analytics ⇒ Privileges ⇒ Grant。最后,点击同一页面上的 Activate 按钮。这将触发应用程序创建内部资源,例如计算池(compute pools)。
算法 API 简介
Neo4j Graph Analytics 提供了一个算法目录,涵盖从 PageRank、Dijkstra 到 WCC 等各种算法。
算法的执行分为三个步骤:投影(Projection)、计算(Computation)和写入结果(Writing results)。“投影-计算-写入”模式是图计算中的常用模式,即首先从数据中投影出一个图,然后在该图上计算某些属性或指标,最后将结果写回数据存储中。
这三个步骤在各自的章节投影 (Project)、计算 (Compute) 和写入 (Write) 中有更详细的说明。
用法示例
我们将提供一个更全面的示例,演示如何使用默认仓库配置并选择 CPU_X64_XS 计算池来运行 Neo4j Graph Analytics。
在以下示例中,我们假设:- 应用程序安装名称为 Neo4j_Graph_Analytics(默认值)。- 执行查询的角色对所引用的消费者数据库对象拥有访问权限。- 执行查询的角色已被授予 app_user 应用程序角色的使用权限。
在本例中,我们创建两张表,一张用于节点,一张用于关系。我们要投影的图由六个节点和四条关系组成。请注意列名 nodeId 以及 sourceNodeId 和 targetNodeId。应用程序要求必须存在这些列才能提取数据。可选的额外列将分别被视为节点属性或关系属性。
如果节点表和关系表已经存在,但没有所需的列名,则可以在其上创建视图。
-- Use a role with the required privileges
USE ROLE ACCOUNTADMIN;
-- Create a consumer role for users of the Graph Analytics application
CREATE ROLE IF NOT EXISTS MY_CONSUMER_ROLE;
GRANT APPLICATION ROLE Neo4j_Graph_Analytics.app_user TO ROLE MY_CONSUMER_ROLE;
SET MY_USER = (SELECT CURRENT_USER());
GRANT ROLE MY_CONSUMER_ROLE TO USER IDENTIFIER($MY_USER);
USE SCHEMA EXAMPLE_DB.DATA_SCHEMA;
CREATE TABLE NODES (nodeId Number);
INSERT INTO NODES VALUES (1), (2), (3), (4), (5), (6);
CREATE TABLE RELATIONSHIPS (sourceNodeId Number, targetNodeId Number);
INSERT INTO RELATIONSHIPS VALUES (1, 2), (2, 3), (4, 5), (5, 6);
-- Grants needed for the app to read consumer data stored in tables and views, using a database role
USE DATABASE EXAMPLE_DB;
CREATE DATABASE ROLE IF NOT EXISTS MY_DB_ROLE;
GRANT USAGE ON DATABASE EXAMPLE_DB TO DATABASE ROLE MY_DB_ROLE;
GRANT USAGE ON SCHEMA EXAMPLE_DB.DATA_SCHEMA TO DATABASE ROLE MY_DB_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA EXAMPLE_DB.DATA_SCHEMA TO DATABASE ROLE MY_DB_ROLE;
GRANT SELECT ON ALL VIEWS IN SCHEMA EXAMPLE_DB.DATA_SCHEMA TO DATABASE ROLE MY_DB_ROLE;
-- Future tables also include tables that are created by the application itself.
-- This is useful as many use-cases require running algorithms in a sequence and using the output of a prior algorithm as input.
GRANT SELECT ON FUTURE TABLES IN SCHEMA EXAMPLE_DB.DATA_SCHEMA TO DATABASE ROLE MY_DB_ROLE;
GRANT SELECT ON FUTURE VIEWS IN SCHEMA EXAMPLE_DB.DATA_SCHEMA TO DATABASE ROLE MY_DB_ROLE;
GRANT CREATE TABLE ON SCHEMA EXAMPLE_DB.DATA_SCHEMA TO DATABASE ROLE MY_DB_ROLE;
GRANT DATABASE ROLE MY_DB_ROLE TO APPLICATION Neo4j_Graph_Analytics;
-- Ensure the consumer role has access to tables created by the application
GRANT USAGE ON DATABASE EXAMPLE_DB TO ROLE MY_CONSUMER_ROLE;
GRANT USAGE ON SCHEMA EXAMPLE_DB.DATA_SCHEMA TO ROLE MY_CONSUMER_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA EXAMPLE_DB.DATA_SCHEMA TO ROLE MY_CONSUMER_ROLE;
-- Use the consumer role to run the algorithm and inspect the output
USE ROLE MY_CONSUMER_ROLE;
我们在投影配置中进行如下设置:
'project': {
'nodeTables': ['EXAMPLE_DB.DATA_SCHEMA.NODES'],
'relationshipTables': {
'EXAMPLE_DB.DATA_SCHEMA.RELATIONSHIPS': {
'sourceTable': 'EXAMPLE_DB.DATA_SCHEMA.NODES',
'targetTable': 'EXAMPLE_DB.DATA_SCHEMA.NODES',
'orientation': 'NATURAL'
}
}
}
节点和关系都可以从多个表中读取。使用 nodeTables 和 relationshipTables 配置参数,我们可以指定要从哪些表中读取数据。nodeTables 配置参数指定包含节点的表数组。每个节点表的名称都会映射到图中的一个节点标签(Label)。关系表以映射(map)形式指定,其中键为表名,值为配置参数映射。每个关系表的名称都映射到图中的一种关系类型。sourceTable 和 targetTable 配置参数指定关系表所引用的节点表。
如果我们希望使用不同的方向性(orientation)来投影关系,可以在配置中指定。可能的值有 NATURAL(默认)、UNDIRECTED 和 REVERSE。
在我们的示例中,我们将使用弱连通分量(Weakly Connected Components,WCC)算法来寻找图中不相连的部分。我们可以通过指定希望在输出端获得“友好数字”来配置 WCC 的计算参数。
'compute': { 'consecutiveIds': true }
计算出 WCC 后,我们将结果写回一张表中以便进行进一步分析。该表如果已存在,将会被创建并覆盖。
'write': [{
'nodeLabel': 'NODES',
'outputTable': 'EXAMPLE_DB.DATA_SCHEMA.NODES_COMPONENTS'
}]
由于这是第一次写回示例架构,我们还需要考虑权限问题。我们需要向应用程序授予该架构的 CREATE TABLE 权限。
最后,做完这些准备工作,我们可以开始了!
CALL Neo4j_Graph_Analytics.graph.wcc('CPU_X64_XS', {
'project': {
'nodeTables': ['EXAMPLE_DB.DATA_SCHEMA.NODES'],
'relationshipTables': {
'EXAMPLE_DB.DATA_SCHEMA.RELATIONSHIPS': {
'sourceTable': 'EXAMPLE_DB.DATA_SCHEMA.NODES',
'targetTable': 'EXAMPLE_DB.DATA_SCHEMA.NODES',
'orientation': 'NATURAL'
}
}
},
'compute': { 'consecutiveIds': true },
'write': [{
'nodeLabel': 'NODES',
'outputTable': 'EXAMPLE_DB.DATA_SCHEMA.NODES_COMPONENTS'
}]
});
请注意,我们也可以调用 USE DATABASE Neo4j_Graph_Analytics,然后执行 CALL graph.wcc(…) 以避免使用完全限定名称。
查询运行完成后,我们可以从表中查询分量结果。
SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.NODES_COMPONENTS;
这将列出每个节点对应的分量。我们可以看到该图由两个独立的分量组成,每个分量包含三个节点。
NODE VALUE
1 0
2 0
3 0
4 1
5 1
6 1
大多数算法会生成节点属性结果。某些算法(如 KNN 和节点相似度)会生成关系结果。这些特定变体将在算法目录中介绍。
现在结果已写回您的端,您可以对其进行检查和进一步处理——例如将其输入到另一个 Neo4j Graph Analytics 算法中。
更大型的示例
有关包含将数据准备为节点和关系表/视图格式的更大型使用示例,请参阅基于 TPC-H 数据的购物篮分析示例。它使用了 Snowflake 中提供的 TPC-H 示例数据。