Skip to content

CPP接口

Siran Yang edited this page Jan 16, 2019 · 1 revision

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分为LocalRemote两种,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> 邻居信息,包含终点,权重,边类型

本小节与下个小节中的tuplevectorstring对应std::tuplestd::vectorstd::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服务实例加入。

Clone this wiki locally