-
Notifications
You must be signed in to change notification settings - Fork 558
CPP接口
Euler提供不依赖机器学习框架的C++接口,可以作为独立的图引擎使用。用户可以通过euler::client
中的Graph
类访问图引擎。参考头文件euler/client/graph.h。
#include <chrono>
#include <iostream>
#include <vector>
#include <thread>
#include "euler/client/graph.h"
int main() {
euler::client::GraphConfig config;
config.Add("mode", "Local");
config.Add("directory", "."); // 图数据目录
auto graph = euler::client::Graph::NewGraph(config);
graph->GetFullNeighbor(
{0, 1}, {0, 1}, [](const euler::client::IDWeightPairVec &result) {
for (const auto &neighbors : result) {
for (const auto &tuple : neighbors) {
euler::client::NodeID target;
float weight;
int32_t edge_type;
std::tie(target, weight, edge_type) = tuple;
std::cout << "(" << target << ", "
<< weight << ", "
<< edge_type << ") ";
}
std::cout << std::endl;
}
});
std::this_thread::sleep_for(std::chrono::milliseconds(100));
graph->GetNodeBinaryFeature(
{1, 2}, {0}, [](const euler::client::BinaryFatureVec& result) {
for (const auto &features : result) {
for (const std::string &feature: features) {
std::cout << feature;
}
std::cout << std::endl;
}
});
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
对这个例子中的图运行上面的程序会输出:
(1, 2, 0) (2, 4, 0)
(2, 3, 1)
a fruit 6 phone
a start s8 phone
用户在访问图之前需要初始化一个Graph
对象,这可以通过一个GraphConfig
或者配置文件获得:
std::unique_ptr<Graph> NewGraph(const std::string& config_file);
std::unique_ptr<Graph> NewGraph(const GraphConfig& config);
上面例子中也可以用一下的配置文件进行初始化:
mode=Local
directory=.
其中mode分为Local和Remote两种,Local模式在本进程内存中初始化一份图引擎,Remote模式通过RPC访问一组图引擎服务。两种模式分别对应不同的配置:
mode | Local |
---|---|
directory | 图数据目录,目前支持Unix文件系统 |
load_type | 加载的方式,fast / compact |
Mode | Remote |
---|---|
zk_server | Zookeeper地址,形式为ip:port,用于获取服务元信息 |
zk_path | Zookeeper节点,用于获取服务元信息 |
num_retries | RPC重试次数,非正数表示无限重试,默认10 |
num_channels_per_host | 每节点连接数,默认1 |
bad_host_cleanup_interval | 坏节点复用检测间隔,默认1 |
bad_host_timeout | 坏节点复用超时时间,默认10 |
若使用Remote模式,则需要额外启动一组Euler服务。
类型 | 定义 | 含义 |
---|---|---|
NodeID |
uint64_t |
顶点ID |
EdgeID |
tuple<NodeID, NodeID, int32_t> |
边ID,由起点、终点、边类型确定 |
IDWeightPair |
tuple<NodeID, float, int32_t> |
邻居信息,包含终点,权重,边类型 |
本小节与下个小节中的tuple
、vector
、string
对应std::tuple
、std::vector
和std::string
。
如上文中的例子所示,目前Euler提供的C++接口均为异步接口。接口的最后一个参数是一个形式为std::function<void(const ResultType& result)>
的回调函数,该回调函数会在相应的数据被获取后调用。
所有的结果以行优先的形式返回,即vector<vector<IDWeightPair>>
的第一维对应请求中的各个顶点,第二维对应单个顶点的各个邻居;vector<vector<vector<T>>>
的第一维对于请求中的各个顶点/边,第二维对于单个顶点的各个属性,第三维对应单个顶点单个属性的各个值。
接口 | 参数 | 返回值 | 含义 |
---|---|---|---|
SampleNode |
int node_type 顶点类型int count 采样个数 |
vector<NodeID> 顶点集合 |
按类型对顶点采样 |
SampleEdge |
int edge_type 边类型int count 采样个数 |
vector<EdgeID> 边集合 |
按类型对边采样 |
SampleNeighbor |
vector<NodeID> node_ids 顶点集合vector<int> edge_types 边类型集合int count 采样个数 |
vector<vector<IDWeightPair>> 邻居集合 |
按类型对请求中顶点的出边采样 |
GetTopKNeighbor |
vector<NodeID> node_ids 顶点集合vector<int> edge_types 边类型集合int k k |
vector<vector<IDWeightPair>> 邻居集合 |
按类型获取请求中顶点权重最大的出边 |
GetFullNeighbor |
vector<NodeID> node_ids 顶点集合vector<int> edge_types 边类型集合 |
vector<vector<IDWeightPair>> 邻居集合 |
按类型获取请求中顶点的出边 |
GetSortedFullNeighbor |
vector<NodeID> node_ids 顶点集合vector<int> edge_types 边类型集合 |
vector<vector<IDWeightPair>> 邻居集合 |
按类型获取请求中顶点的出边,并按终点ID排序 |
BiasedSampleNeighbor |
vector<NodeID> node_ids 顶点集合vector<NodeID> parent_node_ids 上步顶点集合vector<int> edge_types 边集合vector<int> patent_edge_types 上步边集合int count 采样个数 float p 回采参数float q 外采参数 |
vector<vector<IDWeightPair>> 邻居集合 |
类似SampleNeighbor,Node2Vec中的单步Biased采样 |
GetNodeFloat32Feature |
vector<NodeID> node_ids 顶点集合vector<int> fids 属性编号列表 |
vector<vector<vector<float>>> float属性 |
获取请求中顶点的部分float属性 |
GetNodeUint64Feature |
vector<NodeID> node_ids 顶点集合vector<int> fids 属性编号列表 |
vector<vector<vector<uint64_t>>> uint64属性 |
获取请求中顶点的部分uint64属性 |
GetNodeBinaryFeature |
vector<NodeID> node_ids 顶点集合vector<int> fids 属性编号列表 |
vector<vector<string>> binary属性 |
获取请求中顶点的部分binary属性 |
GetEdgeFloat32Feature |
vector<EdgeID> edge_ids 边集合vector<int> fids 属性编号列表 |
vector<vector<vector<float>>> float属性 |
获取请求中边的部分float属性 |
GetEdgeUint64Feature |
vector<EdgeID> edge_ids 边集合vector<int> fids 属性编号列表 |
vector<vector<vector<uint64_t>> uint64属性 |
获取请求中边的部分uint64属性 |
GetEdgeBinaryFeature |
vector<EdgeID> edge_ids 边集合vector<int> fids 属性编号列表 |
vector<vector<string>> binary属性 |
获取请求中边的部分binary属性 |
当使用Remote模式时,用户需要通过euler::service
中的StartService
启动一组图服务。参考头文件euler/service/graph_service.h。
void StartService(const ServiceConfig& conf);
euler::service::StartService({
{"directory", "/path/to/data"},
{"loader_type", "hdfs"},
{"hdfs_addr", "namenode.example.com"},
{"hdfs_port", "9000"},
{"shard_idx", "0"},
{"shard_num", "1"},
{"zk_addr", "zk.example.com:2181"},
{"zk_path", "/path/for/euler"},
{"global_sampler_type", "node"},
{"graph_type", "compact"}
});
其参数中的配置项为:
键 | 值含义 |
---|---|
directory | 图数据目录 |
loader_type | 文件系统类型,local或hdfs |
hdfs_addr | HDFS Namenode地址 |
hdfs_port | HDFS Namenode端口 |
shard_idx | shard编号 |
shard_num | shard数目 |
zk_addr | Zookeeper地址,形式为ip:port,用于发布服务元信息 |
zk_path | Zookeeper节点,用于获取服务元信息 |
global_sampler_type | 全局采样器类型,all / node / edge / none |
graph_type | 图引擎类型,compact或fast |
server_thread_num | RPC服务工作线程数,默认为CPU核心数 |
在启动Euler服务时,整张图被切分为多个shard,每个shard可以有多个Euler服务实例加入。