过滤

此功能处于 Beta 阶段。有关功能层级的更多信息,请参阅 API 层级

子图投射在端到端示例 Jupyter Notebooks 中有介绍

在 GDS 中,算法可以在根据其节点标签关系类型过滤后的命名图上执行。然而,该过滤后的图仅在算法执行期间存在,并且无法根据属性值进行过滤。如果一个过滤后的图需要多次使用,可以使用子图目录过程在图目录中投射一个新的图。

子图过程中的过滤谓词可以考虑标签、关系类型以及节点和关系属性。新图可以像目录中的任何其他内存图一样使用。投射子图的子图也是可能的。

语法

可以使用 gds.graph.filter() 过程投射新图。
CALL gds.graph.filter(
  graphName: String,
  fromGraphName: String,
  nodeFilter: String,
  relationshipFilter: String,
  configuration: Map
) YIELD
  graphName: String,
  fromGraphName: String,
  nodeFilter: String,
  relationshipFilter: String,
  nodeCount: Integer,
  relationshipCount: Integer,
  projectMillis: Integer
表 1. 参数
名称 类型 描述

graphName

字符串

存储在图目录中的新图的名称。

fromGraphName

字符串

图目录中原始图的名称。

nodeFilter

字符串

用于过滤输入图中节点的 Cypher 谓词。* 可用于允许所有节点。

relationshipFilter

字符串

用于过滤输入图中关系的 Cypher 谓词。* 可用于允许所有关系。

配置

映射

配置子图创建的附加参数。

表 2. 子图特定配置
名称 类型 默认值 可选 描述

concurrency

整数

4 [1]

用于运行算法的并发线程数。

jobId

字符串

内部生成

可用于更轻松地跟踪算法进度的 ID。

logProgress

布尔值

true

如果禁用,将不会记录进度百分比。

parameters

映射

{}

传递到节点和关系过滤器中的用户定义查询参数映射。

1. 在 GDS 会话中,默认值为可用处理器数量

表 3. 结果
名称 类型 描述

graphName

字符串

存储在图目录中的新图的名称。

fromGraphName

字符串

图目录中原始图的名称。

nodeFilter

字符串

节点的过滤谓词。

relationshipFilter

字符串

关系的过滤谓词。

nodeCount

整数

子图中的节点数。

relationshipCount

整数

子图中的关系数。

projectMillis

整数

投射子图所需的毫秒数。

nodeFilterrelationshipFilter 配置键可用于表示过滤谓词。过滤谓词是绑定到单个实体的 Cypher 谓词。实体可以是节点或关系。过滤谓词总是需要评估为 truefalse。如果节点过滤器评估为 true,则节点包含在子图中。如果关系过滤器评估为 true 并且其源节点和目标节点包含在子图中,则关系包含在子图中。

谓词是表达式的组合。最简单的表达式形式是字面量。GDS 目前支持以下字面量

  • 浮点字面量,例如 13.37

  • 整数字面量,例如 42

  • 布尔字面量,即 TRUEFALSE

属性、标签和关系类型表达式绑定到一个实体。节点实体始终由变量 n 标识,关系实体由 r 标识。使用这些变量,我们可以引用

  • 节点标签表达式,例如 n:Person

  • 关系类型表达式,例如 r:KNOWS

  • 节点属性表达式,例如 n.age

  • 关系属性表达式,例如 r.since

布尔谓词组合两个表达式并返回 truefalse。GDS 支持以下布尔谓词

  • 大于/小于,例如 n.age > 42r.since < 1984

  • 大于/小于或等于,例如 n.age >= 42r.since ⇐ 1984

  • 等于,例如 n.age = 23r.since = 2020

  • 逻辑运算符,例如

  • n.age > 23 AND n.age < 42

  • n.age = 23 OR n.age = 42

  • n.age = 23 XOR n.age = 42

  • n.age IS NOT 23

谓词中可使用的变量名并非任意的。节点谓词必须引用变量 n。关系谓词必须引用变量 r

异常是 degree 函数,它简单地返回节点的度。该函数接受关系类型作为参数。多个类型被视为析取。例如,degree() > 42 过滤所有关系类型中度大于 42 的节点。表达式 degree('Foo', 'Bar') > 42 过滤 FooBar 关系之和大于 42 的节点。

示例

以下所有示例都应在空数据库中运行。

示例通常使用Cypher 投射。原生投射将在未来的版本中弃用。

为了演示 GDS 的子图投射功能,我们将在 Neo4j 中创建一个小型社交图。

以下 Cypher 语句将在 Neo4j 数据库中创建示例图
CREATE
  (p0:Person { age: 16 }),
  (p1:Person { age: 18 }),
  (p2:Person { age: 20 }),
  (b0:Book   { isbn: 1234 }),
  (b1:Book   { isbn: 4242 }),
  (p0)-[:KNOWS { since: 2010 }]->(p1),
  (p0)-[:KNOWS { since: 2018 }]->(p2),
  (p0)-[:READS]->(b0),
  (p1)-[:READS]->(b0),
  (p2)-[:READS]->(b1)
投射社交网络图
MATCH (n:Person)-[r:KNOWS|READS]->(m:Person|Book)
RETURN gds.graph.project('social-graph', n, m,
  {
    sourceNodeLabels: labels(n),
    targetNodeLabels: labels(m),
    sourceNodeProperties: n { .age },
    targetNodeProperties: CASE WHEN m:Person THEN m { .age } ELSE {} END,
    relationshipType: type(r),
    relationshipProperties: CASE WHEN r:KNOWS THEN r { .since } ELSE {} END
  }
)

节点过滤

创建一个只包含特定年龄段用户的新图
CALL gds.graph.filter(
  'teenagers',
  'social-graph',
  'n.age > 13 AND n.age <= 18',
  '*'
)
YIELD graphName, fromGraphName, nodeCount, relationshipCount
表 4. 结果
graphName fromGraphName nodeCount relationshipCount

"teenagers"

"social-graph"

2

1

节点度过滤

创建一个只包含关系数超过两个的节点的新图
CALL gds.graph.filter(
  'degree-graph',
  'social-graph',
  'degree() > 2',
  '*'
)
YIELD graphName, fromGraphName, nodeCount, relationshipCount
表 5. 结果
graphName fromGraphName nodeCount relationshipCount

"degree-graph"

"social-graph"

1

0

节点和关系过滤

创建一个只包含特定年龄段用户且在给定时间点之后相互认识的新图
CALL gds.graph.filter(
  'teenagers',
  'social-graph',
  'n.age > 13 AND n.age <= 18',
  'r.since >= 2012.0'
)
YIELD graphName, fromGraphName, nodeCount, relationshipCount
表 6. 结果
graphName fromGraphName nodeCount relationshipCount

"teenagers"

"social-graph"

2

0

二分图子图

创建一个由 READS 关系类型连接的书籍和用户之间的二分图
CALL gds.graph.filter(
  'teenagers-books',
  'social-graph',
  'n:Book OR n:Person',
  'r:READS'
)
YIELD graphName, fromGraphName, nodeCount, relationshipCount
表 7. 结果
graphName fromGraphName nodeCount relationshipCount

"teenagers-books"

"social-graph"

5

3

二分图节点过滤

上一个示例可以通过仅应用于个人的附加过滤器进行扩展
CALL gds.graph.filter(
  'teenagers-books',
  'social-graph',
  'n:Book OR (n:Person AND n.age > 18)',
  'r:READS'
)
YIELD graphName, fromGraphName, nodeCount, relationshipCount
表 8. 结果
graphName fromGraphName nodeCount relationshipCount

"teenagers-books"

"social-graph"

3

1

使用查询参数

Cypher 类似,也可以设置查询参数。例如,我们可以使用参数而不是整数字面量重写上面的节点过滤示例

创建一个只包含特定年龄段用户的新图
CALL gds.graph.filter(
  'teenagers-parameterized',
  'social-graph',
  'n.age > $lower AND n.age <= $upper',
  '*',
  { parameters: { lower: 13, upper: 18 } }
)
YIELD graphName, fromGraphName, nodeCount, relationshipCount
表 9. 结果
graphName fromGraphName nodeCount relationshipCount

"teenagers-parameterized"

"social-graph"

2

1

© . All rights reserved.