选择器

选择器是字符串或用于上下文的键值对。选择器旨在用于指定对象数据的子集,它们不仅可以检索算法的结果,还可以获取图本身的元素。对于不同类型的图或上下文,选择器的语法略有不同。由于我们有5种上下文类型,让我们逐一讨论它们。

不同上下文中的选择器

选择器的基本组件是ver,分别表示顶点、边和结果。

警告

边的选择器目前还不支持,但将在后续版本中提供。

TensorContext

TensorContext 在引擎内部保存一个张量。这种情况下,选择器无关紧要,取而代之的是我们有一个 axis 关键字,用于根据轴来检索张量中的数据。

顶点数据上下文

VertexDataContext 用于兼容简单图的算法,即无标签和属性,且算法结果的形式为每个顶点上恰好有一个数据,例如 graphscope.sssp()graphscope.pagerank()。让我们看看 VertexDataContext 的选择器是什么样的:

  • The syntax of selector on vertex is:
    • v.id: 获取顶点的ID

    • v.data: 获取顶点的数据(如果有的话,表示图上的原始数据,而非计算结果)

  • The syntax of selector of edge is:
    • e.src: 获取边的源ID

    • e.dst: 获取边的目标顶点ID

    • e.data: 获取边上的边数据(如果有的话,表示图上的原始数据)

  • The syntax of selector of results is:
    • r: 获取算法的查询结果。例如执行PageRank后顶点的排名。

带标签顶点数据上下文

LabeledVertexDataContext用于兼容属性图的算法,即图中包含多个标签,每个标签具有若干属性。此类算法的结果形式为每个顶点标签上包含一个数据。典型应用为用户自定义(UDF)算法。

选择首先在标签上进行,然后在属性上进行。

我们使用:来过滤标签,使用.来选择属性。 但结果中不包含属性,只有标签。

  • The syntax of selector of vertex is:
    • v:label_name.id: 获取属于特定顶点标签的ID。

    • v:label_name.property_name: 获取特定顶点标签上特定属性的数据。

  • The syntax of selector of edge is:
    • e:label_name.src: 获取特定边标签的源ID。

    • e:label_name.dst: 获取特定边标签的目标ID。

    • e:label_name.property_name: 获取特定边标签的特定属性数据。

  • The syntax of selector of results is:
    • r:label_name: 获取顶点标签的结果数据。

顶点属性上下文

VertexPropertyContext 用于兼容简单图的算法场景,即图中无标签和属性,且算法结果可在每个顶点上包含多个数据(属性),例如 graphscope.hits()

请注意,VertexPropertyContext的选择器仅在r参数上与VertexDataContext有所不同。

  • The syntax of selector on vertex is:
    • v.id: 获取顶点的ID

    • v.data: 获取顶点的数据(如果有的话,表示图上的原始数据,而非计算结果)

  • The syntax of selector of edge is:
    • e.src: 获取边的源ID

    • e.dst: 获取边的目标顶点ID

    • e.data: 获取边上的边数据(如果有的话,表示图上的原始数据)

  • The syntax of selector of results is:
    • r.column_name: 获取结果中名为column_name的属性。例如graphscope.hits()中的r.hub

带标签的顶点属性上下文

LabeledVertexPropertyContext用于兼容属性图的算法。即图中包含多个标签,每个标签具有若干属性。算法结果的形式为每个标签可包含多组数据(即属性)。

选择首先在标签上进行,然后在属性上进行。

我们使用:来过滤标签,使用.来选择属性。

结果可以具有多个属性。

  • The syntax of selector of vertex is:
    • v:label_name.id: 获取属于特定顶点标签的ID。

    • v:label_name.property_name: 获取特定顶点标签上特定属性的数据。

  • The syntax of selector of edge is:
    • e:label_name.src: 获取特定边标签的源ID。

    • e:label_name.dst: 获取特定边标签的目标ID。

    • e:label_name.property_name: 获取特定边标签的特定属性数据。

  • The syntax of selector of results is:
    • r:label_name.column_name: 获取label_name中名为column_name的属性。

使用选择器的方法

选择器的形式在不同方法中略有差异,

一维结果

返回一维结果的方法有:

  • to_numpy

  • to_vineyard_tensor

选择器是一个字符串,例如:

context.to_numpy('v.id')  # VertexDataContext

context.to_numpy('r')  # VertexDataContext

context.to_numpy('r:person')  # LabeledVertexDataContext

context.to_vineyard_tensor('v.person.name')  # VertexPropertyContext

context.to_vineyard_tensor('r.person.rank')  # LabeledVertexPropertyContext

多维结果

要获取多维结果,我们必须为每个选择器分配一个键。此外,对于给定的选择器,每个键必须是唯一的。

会返回多维结果的方法有:

  • to_dataframe

  • to_vineyard_dataframe

  • 输出

  • output_to_client

Selector 是一个字典,例如:

context.to_dataframe({'id': 'v.id', 'rank': 'r'})  # VertexDataContext

context.to_vineyard_dataframe({'id': 'v.id', 'hub': 'r:person'})  # LabeledVertexDataContext

context.output(path, {'person_id': 'v.person.id', 'age': 'v.hub'})  # VertexPropertyContext

context.output_to_client(path, {'person_id': 'v.person.id', 'res': 'r.person.res'})  # LabeledVertexPropertyContext

顶点范围

可选地,用户可能还希望仅检索由选择器指定的数据子集。 上述方法可以接受一个可选的vertex_range参数,其工作原理类似于切片, 用户可以指定beginend值,然后只会选择该范围内的顶点。

示例:

context.to_dataframe(selector={'id': 'v.id', 'rank': 'r'}, vertex_range={'begin': '200', 'end': '400'})

注意

vertex_range的值将与顶点ID按字母顺序而非数字顺序进行比较。