概述
Struc2Vec游走是一种有偏的随机游走(Biased Random Walk)。这是Struc2Vec框架的关键组成部分之一,其中游走是在构建的带权多层图中而不是在原图中进行的。详情请参考Struc2Vec算法。
示例图

在一个空图中运行以下语句定义图结构并插入数据:
INSERT (A:default {_id: "A"}),
       (B:default {_id: "B"}),
       (C:default {_id: "C"}),
       (D:default {_id: "D"}),
       (E:default {_id: "E"}),
       (F:default {_id: "F"}),
       (G:default {_id: "G"}),
       (H:default {_id: "H"}),
       (I:default {_id: "I"}),
       (J:default {_id: "J"}),
       (A)-[:default]->(B),
       (A)-[:default]->(C),
       (D)-[:default]->(C),
       (D)-[:default]->(F),
       (E)-[:default]->(C),
       (E)-[:default]->(F),
       (F)-[:default]->(G),
       (G)-[:default]->(J),
       (H)-[:default]->(G),
       (H)-[:default]->(I);
insert().into(@default).nodes([{_id:"A"},{_id:"B"},{_id:"C"},{_id:"D"},{_id:"E"},{_id:"F"},{_id:"G"},{_id:"H"},{_id:"I"},{_id:"J"}]);
insert().into(@default).edges([{_from:"A", _to:"B"}, {_from:"A", _to:"C"}, {_from:"D", _to:"C"}, {_from:"D", _to:"F"}, {_from:"E", _to:"C"}, {_from:"E", _to:"F"}, {_from:"F", _to:"G"}, {_from:"G", _to:"J"}, {_from:"H", _to:"G"}, {_from:"H", _to:"I"}]);
创建HDC图
将当前图集全部加载到HDC服务器hdc-server-1上,并命名为 my_hdc_graph:
CREATE HDC GRAPH my_hdc_graph ON "hdc-server-1" OPTIONS {
  nodes: {"*": ["*"]},
  edges: {"*": ["*"]},
  direction: "undirected",
  load_id: true,
  update: "static"
}
hdc.graph.create("my_hdc_graph", {
  nodes: {"*": ["*"]},
  edges: {"*": ["*"]},
  direction: "undirected",
  load_id: true,
  update: "static"
}).to("hdc-server-1")
参数
算法名:random_walk_struc2vec
| 参数名 | 类型 | 规范 | 默认值 | 可选 | 描述 | 
|---|---|---|---|---|---|
| ids | [] _id | / | / | 是 | 通过 _id指定随机游走的起点;若未设置则计算所有点 | 
| uuids | [] _uuid | / | / | 是 | 通过 _uuid指定随机游走的起点;若未设置则计算所有点 | 
| walk_length | Integer | ≥1 | 1 | 是 | 每次游走的深度,即访问的节点数量 | 
| walk_num | Integer | ≥1 | 1 | 是 | 从每个指定节点开始的游走次数 | 
| k | Integer | [1, 10] | / | 否 | 构建的多层加权图中的层数,层数不能超过原始图的直径 | 
| stay_probability | Float | (0,1] | / | 否 | 留在当前层游走的概率 | 
| return_id_uuid | String | uuid,id,both | uuid | 是 | 在结果中使用 _uuid、_id或同时使用两者来表示点 | 
| limit | Integer | ≥-1 | -1 | 是 | 限制返回的结果数; -1返回所有结果 | 
文件回写
CALL algo.random_walk_struc2vec.write("my_hdc_graph", {
  return_id_uuid: "id",
  walk_length: 5,
  walk_num: 1,
  k: 4,
  stay_probability: 0.8
}, {
  file: {
    filename: "walks"
  }
})
algo(random_walk_struc2vec).params({
  projection: "my_hdc_graph",
  return_id_uuid: "id",
  walk_length: 5,
  walk_num: 1,
  k: 4,
  stay_probability: 0.8
}).write({
  file:{
    filename: 'walks'
}})
结果:
_ids
J,G,F,E,C,
D,F,E,F,E,
F,G,F,
H,I,H,F,
B,A,B,A,B,
A,C,E,D,
E,F,G,H,G,
C,D,F,G,
I,H,G,F,E,
G,D,F,
完整返回
CALL algo.random_walk_struc2vec.run("my_hdc_graph", {
  return_id_uuid: "id",
  ids: ['J'],
  walk_length: 6,
  walk_num: 3,
  k: 4,
  stay_probability: 0.8
}) YIELD walks
RETURN walks
exec{
  algo(random_walk_struc2vec).params({
    return_id_uuid: "id",
    ids: ['J'],
    walk_length: 6,
    walk_num: 3,
    k: 4,
    stay_probability: 0.8
  }) as walks
  return walks
} on my_hdc_graph
结果:
| _ids | 
|---|
| ["J","G","F","C","B"] | 
| ["J","F","H","F","J"] | 
| ["J","G","J","H","F"] | 
流式返回
CALL algo.random_walk_struc2vec.stream("my_hdc_graph", {
  return_id_uuid: "id",
  ids: ['J'],
  walk_length: 6,
  walk_num: 3,
  k: 5,
  stay_probability: 0.7
}) YIELD walks
RETURN walks
exec{
  algo(random_walk_struc2vec).params({
    return_id_uuid: "id",
    ids: ['J'],
    walk_length: 6,
    walk_num: 3,
    k: 5,
    stay_probability: 0.7
  }).stream() as walks
  return walks
} on my_hdc_graph
结果:
| _ids | 
|---|
| ["J","G","I","F"] | 
| ["J","E","J"] | 
| ["J","H","F","A"] | 
