选择器¶
选择器是字符串或用于图或上下文的键值对。选择器旨在用于指定对象数据的子集,它们不仅可以检索算法的结果,还可以获取图本身的元素。对于不同类型的图或上下文,选择器的语法略有不同。由于我们有5种上下文类型,让我们逐一讨论它们。
不同上下文中的选择器¶
选择器的基本组件是v、e和r,分别表示顶点、边和结果。
警告
边的选择器目前还不支持,但将在后续版本中提供。
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参数,其工作原理类似于切片, 用户可以指定begin和end值,然后只会选择该范围内的顶点。
示例:
context.to_dataframe(selector={'id': 'v.id', 'rank': 'r'}, vertex_range={'begin': '200', 'end': '400'})
注意
vertex_range的值将与顶点ID按字母顺序而非数字顺序进行比较。