入门指南

安装

Neo4j Graph Analytics for Snowflake 以原生应用程序(Native Application)的形式提供。可通过 Snowflake Marketplace 安装该应用程序。在安装过程中,需要启用事件共享(Event sharing)。有关更多信息,请参阅管理事件共享

应用程序权限

该应用程序需要 CREATE COMPUTE POOL 和 CREATE WAREHOUSE 权限。授予这些权限最简单的方法是通过 Snowsight 选择 Data ProductsAppsNeo4j Graph AnalyticsPrivilegesGrant。最后,点击同一页面上的 Activate 按钮。这将触发应用程序创建内部资源,例如计算池(compute pools)

运行算法时,应用程序需要具备特定的执行权限。有关详细信息,请参阅应用程序权限管理。我们在下方提供了一个用法示例,演示如何授予这些权限并运行算法。

消费者角色与权限

应用程序的用户也需要特定的权限。有关详细信息,请参阅消费者权限管理。下方的用法示例中包含了消费者权限的相关内容。

算法 API 简介

Neo4j Graph Analytics 提供了一个算法目录,涵盖从 PageRank、Dijkstra 到 WCC 等各种算法。

算法的执行分为三个步骤:投影(Projection)、计算(Computation)和写入结果(Writing results)。“投影-计算-写入”模式是图计算中的常用模式,即首先从数据中投影出一个图,然后在该图上计算某些属性或指标,最后将结果写回数据存储中。

这三个步骤在各自的章节投影 (Project)计算 (Compute)写入 (Write) 中有更详细的说明。

写入结果

算法执行完成后,我们会立即将数据写回您的表中,以便进行检查和进一步处理。在此,我们需要您指定输出表和标签(Label,Neo4j 的概念,可理解为表名)等信息。

准备工作

在运行算法之前,需要正确设置环境。

我们需要确保使用具有相应权限的角色来运行该应用程序。

USE ROLE <consumer_user_role>;

可选地,为了在运行算法时不使用完全限定的端点名称,我们可以执行以下命令。

USE DATABASE Neo4j_Graph_Analytics;

在此,我们假设应用程序安装在默认名称 Neo4j_Graph_Analytics 下。

用法示例

我们将提供一个更全面的示例,演示如何使用默认仓库配置并选择 CPU_X64_XS 计算池来运行 Neo4j Graph Analytics。

在以下示例中,我们假设:- 应用程序安装名称为 Neo4j_Graph_Analytics(默认值)。- 执行查询的角色对所引用的消费者数据库对象拥有访问权限。- 执行查询的角色已被授予 app_user 应用程序角色的使用权限。

在本例中,我们创建两张表,一张用于节点,一张用于关系。我们要投影的图由六个节点和四条关系组成。请注意列名 nodeId 以及 sourceNodeIdtargetNodeId。应用程序要求必须存在这些列才能提取数据。可选的额外列将分别被视为节点属性或关系属性。

如果节点表和关系表已经存在,但没有所需的列名,则可以在其上创建视图。

-- 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'
      }
    }
  }

节点和关系都可以从多个表中读取。使用 nodeTablesrelationshipTables 配置参数,我们可以指定要从哪些表中读取数据。nodeTables 配置参数指定包含节点的表数组。每个节点表的名称都会映射到图中的一个节点标签(Label)。关系表以映射(map)形式指定,其中键为表名,值为配置参数映射。每个关系表的名称都映射到图中的一种关系类型。sourceTabletargetTable 配置参数指定关系表所引用的节点表。

如果我们希望使用不同的方向性(orientation)来投影关系,可以在配置中指定。可能的值有 NATURAL(默认)、UNDIRECTEDREVERSE

在我们的示例中,我们将使用弱连通分量(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 示例数据