过滤

此功能处于 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

整数

投影子图所需的毫秒数。

nodeFilter 和 relationshipFilter 配置键可用于表达过滤谓词。过滤谓词是绑定到单个实体的 Cypher 谓词。实体可以是节点或关系。过滤谓词的计算结果必须始终为 true 或 false。如果节点过滤器的计算结果为 true,则节点包含在子图中。如果关系过滤器的计算结果为 true 且其源节点和目标节点都包含在子图中,则关系包含在子图中。

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

  • 浮点型字面量,例如 13.37

  • 整型字面量,例如 42

  • 布尔型字面量,即 TRUE 和 FALSE

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

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

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

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

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

布尔谓词结合了两个表达式并返回 true 或 false。GDS 支持以下布尔谓词:

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

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

  • 相等,例如 n.age = 23 或 r.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 过滤掉 Foo 和 Bar 关系总数大于 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

© . This site is unofficial and not affiliated with Neo4j, Inc.