Skip to content

Euler 2.0 cpp接口

origin edited this page Jun 28, 2020 · 1 revision

GQL图遍历接口

Euler-2.0提供了GQL语义,使得Euler-2.0能够在不依赖tensorflow的情况下对图结构进行查询。

基本的Euler-2.0的GQL语言例子如下:

sampleN(node_type, count).as(n) # 获取root节点

.sampleNB(edge_types, count, 0).as(nb) # 扩展邻居

.v_select(n).values(f1).as(n_feature) # 获取属性

.v_select(nb).values(f1).as(nb_feature)

使用GQL的步骤主要分为以下三步:

1. 编写GQL语句

基础GQL语句结构主要分为四大部分:获取root节点;从root节点向外扩展;获取节点、边的的属性;as语句。

1.1 获取root节点的方式

采样节点:sampleN(node_type, count)

采样满足某些条件的节点:sampleN(node_type, count).has(price gt 2)

直接获取节点:v(node_list)

查找某些条件的节点:v().has(price gt 2)

过滤某些条件的节点:v(node_list)

1.2 向外扩展邻居的方式

采样邻居:sampleNB(edge_types, count, 0),0是作为没采样到任何邻居时填充的default值

采样满足某些条件的邻居:sampleNB(edge_types, count, 0).has(price gt 2)

获取全部邻居:outV(edge_types)

1.3 获取节点、边的属性

v_select(n).values(f1, f2, f3)

1.4 as语句,为算子的输出命名

as(name)

使用以下代码生成GQL语句的Query对象

std::string gql = "v(node_list).sampleNB(edge_types, count, 0)";

Query query(gql);

2. 分配GQL语句中的输入参数

上述GQL语句中的node_type,edge_types,count,node_list等是作为GQL语句的变量名,还需要为这些变量名分配变量的值,下面的过程展示了如何为变量名分配值。

// 分配变量tensor的内存空间,tensor_name, tensor_shape, tensor_type

Tensor* node_type_t = query.AllocInput("node_type", {1}, kInt32);

// 为变量赋值

node_type_t->Raw<int32_t>()[0] = 1;

3. 执行GQL语句

Euler-2.0在进行GQL语句查询时,会将GQL语句进行编译,转化为计算图,并根据执行环境(单机运行/分布式运行)调用不同的优化规则进行计算图编译优化。这个计算图会被编译器缓存以提高运行效率。

GQL语句使用QueryProxy对象进行执行,支持异步和同步两种运行方式。

GQL语句的返回值由tensor表示,tensor的名字为:“产生tensor的算子输出名字(通过as语句设置):tensor在算子输出列表中的下标”。下面是GQL语句执行的例子。

QueryProxy* proxy = QueryProxy::GetInstance();

Query* query = new Query("v(node_list).sampleNB(edge_types, count, 0).as(nb)");

std::function<void()> callback = query {

Tensor* tensor = query->GetResult("nb:0");

// 处理逻辑

delete query;

}

proxy->RunAsyncGremlin(query, callback);

Clone this wiki locally