Java 类名:com.alibaba.alink.operator.batch.graph.VertexNeighborSearchBatchOp
Python 类名:VertexNeighborSearchBatchOp
节点k度邻居子图查询算法,根据用户输入的图数据和一组节点,在图中查找它们的k度邻居,然后导出子图。在子图较小时,还提供图可视化功能。
该组件至少接入一个输入桩,表示图的边集;可选接入第二个输入桩,表示图的点集。组件输出对应于输入桩,分别表示子图的边集和点集,其中点集在第二个输入桩有输入时才有输出。
| 名称 | 中文名称 | 描述 | 类型 | 是否必须? | 取值范围 | 默认值 |
|---|---|---|---|---|---|---|
| edgeSourceCol | 边表中起点所在列 | 边表中起点所在列 | String | ✓ | ||
| edgeTargetCol | 边表中终点所在列 | 边表中终点所在列 | String | ✓ | ||
| sources | 起始节点集合 | 起始节点集合 | String[] | ✓ | ||
| asUndirectedGraph | 是否为无向图 | 是否为无向图 | Boolean | true | ||
| depth | 深度 | 寻找邻居的深度 | Integer | 1 | ||
| vertexIdCol | 节点ID列 | 表示节点ID的列名 | String | “id” |
from pyalink.alink import *
import pandas as pd
useLocalEnv(1)
df = pd.DataFrame([
["Alice", "Lisa", 1., "hello"],
["Lisa", "Alice", 1., "hello"],
["Lisa", "Karry", 1., "hello"],
["Karry", "Lisa", 1., "213"],
["Karry", "Bella", 1., "hello"],
["Bella", "Karry", 1., "h123ello"],
["Bella", "Lucy", 1., "hello"],
["Lucy", "Bella", 1., "hello"],
["Lucy", "Bob", 1., "123"],
["Bob", "Lucy", 1., "hello"],
["John", "Bob", 1., "hello"],
["Bob", "John", 1., "hello"],
["John", "Stella", 1., "123"],
["Stella", "John", 1., "hello"],
["Kate", "Stella", 1., "hello"],
["Stella", "Kate", 1., "hello"],
["Kate", "Jack", 1., "13"],
["Jack", "Kate", 1., "hello"],
["Jess", "Jack", 1., "13"],
["Jack", "Jess", 1., "hello"],
["Jess", "Jacob", 1., "hello"],
["Jacob", "Jess", 1., "123"]]
)
data = BatchOperator.fromDataframe(df, schemaStr="start string, end string, value double, attr string")
op = VertexNeighborSearchBatchOp() \
.setDepth(1) \
.setSources(["John", "Lisa"]) \
.setEdgeSourceCol("start") \
.setEdgeTargetCol("end") \
.setVertexIdCol("name") \
.setAsUndirectedGraph(False)
op.linkFrom(data).print()
import org.apache.flink.types.Row;
import com.alibaba.alink.operator.batch.source.MemSourceBatchOp;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
public class VertexNeighborSearchBatchOpTest {
@Test
public void testDemo() throws Exception {
List <Row> edgesRows = Arrays.asList(
Row.of("Alice", "Lisa", 1., "hello"),
Row.of("Lisa", "Alice", 1., "hello"),
Row.of("Lisa", "Karry", 1., "hello"),
Row.of("Karry", "Lisa", 1., "213"),
Row.of("Karry", "Bella", 1., "hello"),
Row.of("Bella", "Karry", 1., "h123ello"),
Row.of("Bella", "Lucy", 1., "hello"),
Row.of("Lucy", "Bella", 1., "hello"),
Row.of("Lucy", "Bob", 1., "123"),
Row.of("Bob", "Lucy", 1., "hello"),
Row.of("John", "Bob", 1., "hello"),
Row.of("Bob", "John", 1., "hello"),
Row.of("John", "Stella", 1., "123"),
Row.of("Stella", "John", 1., "hello"),
Row.of("Kate", "Stella", 1., "hello"),
Row.of("Stella", "Kate", 1., "hello"),
Row.of("Kate", "Jack", 1., "13"),
Row.of("Jack", "Kate", 1., "hello"),
Row.of("Jess", "Jack", 1., "13"),
Row.of("Jack", "Jess", 1., "hello"),
Row.of("Jess", "Jacob", 1., "hello"),
Row.of("Jacob", "Jess", 1., "123")
);
MemSourceBatchOp edgesSource = new MemSourceBatchOp(edgesRows,
"start string, end string, value double, attr string");
VertexNeighborSearchBatchOp op = new VertexNeighborSearchBatchOp()
.setDepth(1)
.setSources("John", "Lisa")
.setEdgeSourceCol("start")
.setEdgeTargetCol("end")
.setVertexIdCol("name")
.setAsUndirectedGraph(false);
op.linkFrom(edgesSource).print();
}
}
| start | end | value | attr |
|---|---|---|---|
| Alice | Lisa | 1.0000 | hello |
| Lisa | Karry | 1.0000 | hello |
| John | Bob | 1.0000 | hello |
| John | Stella | 1.0000 | 123 |
| Lisa | Alice | 1.0000 | hello |
| Karry | Lisa | 1.0000 | 213 |
| Bob | John | 1.0000 | hello |
| Stella | John | 1.0000 | hello |