-
Notifications
You must be signed in to change notification settings - Fork 558
Euler 2.0 cpp接口
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语句结构主要分为四大部分:获取root节点;从root节点向外扩展;获取节点、边的的属性;as语句。
采样节点:sampleN(node_type, count)
采样满足某些条件的节点:sampleN(node_type, count).has(price gt 2)
直接获取节点:v(node_list)
查找某些条件的节点:v().has(price gt 2)
过滤某些条件的节点:v(node_list)
采样邻居:sampleNB(edge_types, count, 0),0是作为没采样到任何邻居时填充的default值
采样满足某些条件的邻居:sampleNB(edge_types, count, 0).has(price gt 2)
获取全部邻居:outV(edge_types)
v_select(n).values(f1, f2, f3)
as(name)
使用以下代码生成GQL语句的Query对象
std::string gql = "v(node_list).sampleNB(edge_types, count, 0)";
Query query(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;
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);