过滤

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

子图投影功能在端到端的 Jupyter Notebook 示例中有详细介绍

在 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 谓词。可以使用 * 来允许所有关系。

配置

Map

用于配置子图创建的其他参数。

表 2. 配置
名称 类型 默认 可选 描述

concurrency

整数

4 [1]

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

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

logProgress

布尔值

true

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

parameters

Map

{}

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

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