Skip to content

Euler 2.0 点和边的属性索引

origin edited this page Jun 30, 2020 · 3 revisions

本章的章节内容安排如下:

Euler-2.0新增点和边的属性索引功能,支持根据某个属性对点和边进行全局采样过滤和邻居采样过滤。Euler1.0的全局采样和邻居采样只支持按type进行采样。在最近一段时期,我们发现,图表征学习的算法发展越来越精细化,针对节点和边的某种属性的的采样需求越来越大,所以在Euler-2.0里面提供了按索引采样的功能,并且优化了采样的效率,和直接采样效率相当。

索引类型

全局hash索引

全局采样过滤精确匹配某种属性的点和边。适用于全局采样负例的时候,加上过滤条件,只采样满足条件的负例。支持的查询有:eq,not_eq,in,not_in

全局range索引

全局采样过滤某种属性在某个范围内的点和边。适用于全局采样负例的时候,加上过滤条件,只采样满足条件的负例。支持的查询有:eq,not_eq,ge,le,gt,lt,in,not_in

邻居索引

采样某个点的满足某种属性的邻居节点。适用于邻居采样的时候,加上过滤条件,只采样满足条件的邻居节点。支持的查询与全局range索引相同。

索引构建

Euler-2.0已经提供工具用来生成Euler可用的图数据和索引构建,可以参考如下命令

cd Euler-2.0/euler/tools
sh gen_partitioned_data.sh ../../tools/test_data/graph.json ../../tools/test_data/meta /tmp/euler/ shard_num

graph.json 是图数据的json格式,具体参照数据准备章节

meta 是索引的meta文件,指明使用哪个属性来建立索引,索引的名字,字段类型等

详细情况参考build工具章节

索引文件meta格式

{
  "node":
  {
    "type" : "node_type:int32_t:uint64_t:hash_index",
    "features":{
      "f4":
      {
        "1":"price:float:uint64_t:range_index"
      },
      "f3":
      {
        "0":"att:float:uint64_t:neighbor_index"
      }
    }
  },
  "edge":
  {
    "type" : "edge_type:int32_t:uint64_t:hash_index",
    "features":{
      "f3":
      {
        "0":"edge_value:float:uint64_t:range_index"
      },
      "f4":
      {
        "1":"edge_att:float:uint64_t:neighbor_index"
      }
    }
  }
}

meta 文件采用json格式,node属性和edge属性分开。

  "node":
  {
    "type" : "node_type:int32_t:uint64_t:hash_index",
    "features":{
      "f4":
      {
        "1":"price:float:uint64_t:range_index"
      },
      "f3":
      {
        "0":"att:float:uint64_t:neighbor_index"
      }
    }
  }

这段表示对node建立了3个索引,分别是node的type属性,node的features属性中的f4的list属性的第一维,node的features属性中的f3的list属性的第零维。“type”,“features”,“f4”等字段是graph.json里存在的字段,索引meta必须和graph.json 配合使用

"node_type:int32_t:uint64_t:hash_index" 是索引描述字段,由四元组组成(index_name:key_type:nodeid_type:index_type),分别表示索引的名字(全局唯一),索引值的类型,节点(或边)id的存储类型(需要和图中的节点id存储类型一致),索引类型

单值属性上的索引

对于单值属性type上的索引而言,

"node_type:int32_t:uint64_t:hash_index"

的含义是:索引名字index_name为node_type,索引的key_type是node的type类型,为int32_t;索引的nodeid_type其类型为uint64_t,索引类型是全局hash索引。

list属性上的索引

对于list属性上的索引而言,每个属性是一个向量,所以可以对某个属性向量的某个下标建立索引:

"f3": { "0":"edge_value:float:uint64_t:range_index" }

的含义是:在f3属性上的0下标上建立索引,索引名子为edge_value,key_type是float类型的,nodeid_type是uint64_t类型的,这是一个全局range索引。

hash_index,range_index 分别是全局hash索引,全局range索引,是对这个节点的属性建立的索引

neighbor_index 是邻居索引,本质是全局的一个二重索引,先对节点id建立hash索引,再对属性建立range索引。meta文件中的neighbor_index的描述,是指对节点的邻居按照这个属性进行过滤和采样。

Clone this wiki locally