概述
分布式投影驻留在相应分片服务器的内存中,数据持久存储在这些服务器上。分布式投影可包含图集的全部或部分数据,支持图算法的执行,但不支持执行图数据查询。
管理分布式投影
显示分布式投影
获取当前图集的所有分布式投影信息:
show().project()
语句返回表_projectList
,包含以下字段:
字段 |
描述 |
---|---|
project_name |
投影名称 |
project_type |
投影类型;分布式投影的类型为pregel |
graph_name |
加载数据的源图集名称 |
status |
投影的当前状态,包括DONE 、CREATING 、FAILED 和UNKNOWN |
stats |
每个分片的点边统计数据,包括当前图集的主副本address 、edge_in_count 、edge_out_count 和node_count |
config |
分布式投影的配置 |
创建分布式投影
使用语句create.project()
可在分片服务器上创建一个当前图集的内存投影。创建过程以作业形式执行,稍后可以使用语句show().job(<id?>)
验证投影是否创建成功。
create().project(
"<projectName>",
{
nodes: {
"<schema1?>": ["<property1?>", "<property2?>", ...],
"<schema2?>": ["<property1?>", "<property2?>", ...],
...
},
edges: {
"<schema1?>": ["<property1?>", "<property2?>", ...],
"<schema2?>": ["<property1?>", "<property2?>", ...],
...
},
direction: "<edgeDirection?>",
load_id: <boolean?>
}
)
方法 | 参数 | Description | 可选 | |
---|---|---|---|---|
project() |
<projectName> |
投影名称。同一数据库下,分布式投影名称必须唯一,且不可与同一图集下的HDC投影重名 | 否 | |
配置映射 | nodes |
根据schema和属性指定待投影的点。默认加载_uuid ,可通过配置load_id 选择是否加载_id 。使用"*": ["*"] 加载所有点 |
是 | |
edges |
根据schema和属性指定待投影的边。默认加载所有系统属性。使用"*": ["*"] 加载所有边 |
是 | ||
direction |
由于每条边在物理空间存储了两次(终点和一条入边以及起点和一条出边),您可选择使用in 只投影入边,使用out 只投影出边,或使用undirected (默认设置)投影入边和出边。请注意,使用in 或out 会在计算过程中限制图遍历为指定方向 |
否 | ||
load_id |
设置为false 时,投影各点不加载_id 值以节约内存空间;默认为true |
是 |
将当前图集全部投影到分片服务器上并命名为distGraph
:
create().project("distGraph", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true
})
将当前图集投影到分片服务器上并命名为distGraph_1
,其中点@account
和@movie
仅投影指定属性,边@rate
仅投影入边,且不加载点的_id
值:
create().project("distGraph_1", {
nodes: {
"account": ["name", "gender"],
"movie": ["name", "year"]
},
edges: {"rate": ["*"]},
direction: "in",
load_id: false
})
删除分布式投影
使用语句drop().project()
可以从分片服务器上删除当前图集的分布式投影。
以下示例删除了名为distGraph_1
的分布式投影:
drop().project("distGraph_1")
示例图集和投影
在一个空图集中,逐行运行以下UQL语句,创建示例图集:
create().node_schema("entity").edge_schema("link")
create().edge_property(@link, "weight", float)
insert().into(@entity).nodes([{_id:"A"},{_id:"B"},{_id:"C"},{_id:"D"}])
insert().into(@link).edges([{_from:"A", _to:"B", weight:1},{_from:"A", _to:"C", weight:1.5},{_from:"A", _to:"D", weight:0.5},{_from:"B", _to:"C", weight:2},{_from:"C", _to:"D", weight:0.5}])
为全图创建名为distGraph
的分布式投影:
create().project("distGraph", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true
})
执行算法
分布式算法在分布式投影上执行。使用语法algo().params().write()
以文件回写模式和数据库回写模式执行分布式算法。params()
方法必须包含参数project
以指定投影名称。
文件回写
在投影distGraph
上执行度中心性算法,计算所有点的出度并将结果回写到文件degree.txt
中:
algo(degree).params({
project: "distGraph",
return_id_uuid: "id",
direction: "out"
}).write({
file: {
filename: "degree.txt"
}
})
结果:
_id,degree_centrality
C,1
A,3
B,1
D,0
数据库回写
在投影distGraph
执行度中心性算法,计算所有点的出度并将结果回写到点属性degree
中:
algo(degree).params({
project: "distGraph",
return_id_uuid: "id",
direction: "out"
}).write({
db: {
property: "degree"
}
})
图遍历方向
在创建分布式投影时,若direction
选项设定为in
或out
,图遍历会被限制在对应的入边或出边上。若在算法中遍历缺失的方向,则会引发报错或生成空结果。
创建分布式投影distGraph_in_edges
,其中包含所有点和入边:
create().project("distGraph_in_edges", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "in",
load_id: true
})
度中心性算法计算投影distGraph_in_edges
上所有点的出度,结果均为0:
algo(degree).params({
project: "distGraph_in_edges",
return_id_uuid: "id",
direction: "out"
}).write({
file: {
filename: "degree.txt"
}
})
_id,degree_centrality
C,0
A,0
D,0
B,0
投影不包含点ID
在创建分布式投影时,若load_id
选项设定为false
,则投影不包含点的_id
值。若在算法中引用了_id
,则会引发报错或生成空结果。算法回写文件会用_uuid
值替代_id
值。
创建分布式投影distGraph_no_id
,其中不包含点的_id
值:
create().project("distGraph_no_id", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: false
})
度中心性算法计算投影distGraph_no_id
上所有点的度,并将结果回写到文件degree.txt
中,由点的_uuid
值替代点的_id
值:
algo(degree).params({
project: "distGraph_no_id",
return_id_uuid: "id"
}).write({
file: {
filename: "degree.txt"
}
})
_uuid,degree_centrality
12033620403357220866,1
10016007770295238657,3
288232575174967298,0
3530824306881724417,1
投影不包含属性
如果创建分布式投影时未包含某些属性,则在算法引用这些属性时会引发报错或生成空结果。
创建分布式投影distGraph_no_weight
,其中包含所有点以及边的系统属性:
create().project("distGraph_no_weight", {
nodes: {"*": ["*"]},
edges: {"link": []},
direction: "undirected",
load_id: true
})
度中心性算法根据边属性@link.weight
加权计算投影distGraph_no_weight
上所有点的度。由于weight
属性缺失,查询会引发报错:
algo(degree).params({
project: "distGraph_no_weight",
edge_property: "@link.weight"
}).write({
file: {
filename: "degree.txt"
}
})