概述
HDC投影驻留在HDC(高密度计算)服务器的内存中,其中包含从分片服务器物理存储中加载的图集的全部或部分数据。
HDC投影支持所有图算法和数据检索图查询。
管理HDC投影
显示HDC投影
获取当前图集的所有HDC投影信息:
hdc.graph.show()
获取其中一个特定HDC投影信息,如名为hdcGraph_1
的投影:
hdc.graph.show("hdcGraph_1")
语句返回表_projectList
,包含以下字段:
字段 |
描述 |
---|---|
project_name |
投影名称 |
project_type |
投影类型;HDC投影的类型为hdc |
graph_name |
加载数据的源图集名称 |
status |
投影的当前状态,包括DONE 、CREATING 、FAILED 和UNKNOWN |
stats |
投影包含的点边统计数据,包括schema、属性和总数 |
is_default |
说明该投影是否为当前图集的默认HDC投影 |
hdc_server_name |
托管投影的HDC服务器名称 |
hdc_server_status |
HDC服务器的当前状态,包括ACTIVE 和DEAD |
config |
HDC投影的配置 |
当使用hdc.graph.show("<projectName>")
获取特定投影信息时,会额外返回两个表:
_graph_from_<hdcName>
:显示<hdcName>
上创建的所有HDC投影_algoList_from_<hdcName>
:列出安装在<hdcName>
上的所有算法
其中,<hdcName>
是投影所在的HDC服务器名称。
创建HDC投影
使用语句hdc.graph.create().to()
可在HDC服务器上创建一个当前图集的内存投影。创建过程以作业形式执行,稍后可使用语句show().job(<id?>)
来验证投影是否创建成功。
hdc.graph.create("<projectName>", {
nodes: {
"<schema1?>": ["<property1?>", "<property2?>", ...],
"<schema2?>": ["<property1?>", "<property2?>", ...],
...
},
edges: {
"<schema1?>": ["<property1?>", "<property2?>", ...],
"<schema2?>": ["<property1?>", "<property2?>", ...],
...
},
direction: "<edgeDirection?>",
load_id: <boolean?>,
update: "<dataSyncMode>",
query: "query",
default: <boolean?>
}).to("<hdcName>")
方法 | 参数 | 描述 | 可选 | |
---|---|---|---|---|
create() |
<projectName> |
投影名称。HDC服务器上的HDC投影名称必须唯一,且不可与同一图集下的分布式投影重名 | 否 | |
配置映射 | nodes |
根据schema和属性指明待投影的点。默认加载_uuid ,可通过load_id 配置是否加载_id 。设置为"*": ["*"] 时加载所有点 |
是 | |
edges |
根据schema和属性指明待投影的边。默认加载所有系统属性。设置为"*": ["*"] 时加载所有边 |
是 | ||
direction |
由于每条边在物理空间存储了两次(终点和一条入边以及起点和一条出边),您可选择使用in 只投影入边,使用out 只投影出边,或使用undirected (默认项)投影入边和出边。注意,使用in 或out 会在计算过程中将图遍历限制为指定的方向 |
是 | ||
load_id |
设置为false 时,投影各点不加载_id 值以节约内存空间;默认为true |
是 | ||
update |
设置数据同步模式。目前仅支持static 模式(默认),在该模式下,物理存储中的任何数据变更均不会同步至投影中 |
是 | ||
query |
这是一个保留参数,用于设置一个查询语句来指定要投影的数据。目前仅可设置为query |
否 | ||
default |
设置为true 时,指定本投影为当前图集的默认HDC投影;默认为false |
是 | ||
to() |
<hdcName> |
托管投影的HDC服务器名称 | 否 |
将当前图集全部投影到hdc-server-1
上并命名为hdcGraph
:
hdc.graph.create("hdcGraph", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: true
}).to("hdc-server-1")
将当前图集投影到hdc-server-1
上并命名为hdcGraph_1
,其中点@account
和@movie
仅投影指定属性,边 @rate
仅投影入边,且不加载点的_id
值:
hdc.graph.create("hdcGraph_1", {
nodes: {
"account": ["name", "gender"],
"movie": ["name", "year"]
},
edges: {"rate": ["*"]},
direction: "in",
load_id: false,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
删除HDC投影
使用语句hdc.graph.drop()
可以从HDC服务器上删除当前图集的HDC投影。
以下示例删除了名为hdcGraph_1
的HDC投影:
hdc.graph.drop("hdcGraph_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}])
为全图创建名为hdcGraph
的HDC投影:
hdc.graph.create("hdcGraph", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
执行查询
使用语法exec{<query>} on <projectName>
在HDC投影上执行UQL查询。注意,仅支持在HDC投影上执行数据检索类查询。
在hdcGraph
上执行ab()
查询:
exec{
ab().src({_id == "A"}).dest({_id == "C"}).depth(2) as p
return p
} on hdcGraph
结果:
p |
---|
A -> B -> C |
A -> D <- C |
在hdcGraph
上执行khop()
查询:
exec{
khop().src({_id == "A"}).depth(1).direction(right) as n
return count(n)
} on hdcGraph
结果:
count(n) |
---|
3 |
数据写入语句无法在HDC投影上执行。例如以下查询会引发报错,报错信息显示不支持点插入操作。
exec{
insert().into(@entity).nodes([{_id: "E"}])
} on hdcGraph
执行算法
HDC算法在HDC投影上执行。HDC算法支持以下六种执行模式:文件回写、数据库回写、统计回写、完整返回、流式返回和统计返回。
回写模式
使用语法algo().params().write()
在HDC投影上以回写模式(文件回写、数据库回写和统计回写)执行算法。params()
方法必须包含参数project
以指定投影名称。
文件回写
在投影hdcGraph
上执行度中心性算法,计算所有点的出度并将结果回写到文件degree.txt
中:
algo(degree).params({
project: "hdcGraph",
return_id_uuid: "id",
direction: "out"
}).write({
file: {
filename: "degree.txt"
}
})
结果:
_id,degree_centrality
D,0
B,1
A,3
C,1
数据库回写
在投影hdcGraph
上执行度中心性算法,计算所有点的度并将结果回写到点属性degree
中:
algo(degree).params({
project: "hdcGraph"
}).write({
db: {
property: "degree"
}
})
统计回写
在投影hdcGraph
上执行三角形计算算法,计算图中三角形的个数并将统计概述写至作业中:
algo(triangle_counting).params({
project: "hdcGraph",
result_type: 1
}).write({
stats: {}
})
结果:
triangle_count |
---|
2 |
返回模式
使用语法exec{<algo>} on <projectName>
在HDC投影上以返回模式(完整返回、流式返回和统计返回)执行算法。
完整返回
在投影hdcGraph
上执行度中心性算法,计算所有点的出度并返回结果:
exec{
algo(degree).params({
return_id_uuid: "id",
direction: "out"
}) as r
return r
} on hdcGraph
结果:
_id | degree_centrality |
---|---|
D | 0 |
B | 1 |
A | 3 |
C | 1 |
流式返回
在投影hdcGraph
上执行度中心性算法,计算所有点的出度并返回结果:
exec{
algo(degree).params({
return_id_uuid: "id",
direction: "out"
}).stream() as r
return r
} on hdcGraph
结果:
_id | degree_centrality |
---|---|
D | 0 |
B | 1 |
A | 3 |
C | 1 |
统计返回
在投影hdcGraph
上执行三角形计算算法,计算图中三角形的个数并返回统计概述:
exec{
algo(triangle_counting).params({
result_type: 1
}).stats() as s
return s
} on hdcGraph
结果:
triangle_count |
---|
2 |
图遍历方向
在创建HDC投影时,若direction
选项设定为in
或out
,图遍历会被对应限制在入边或出边上。若在查询或算法中遍历缺失的方向,则会引发报错或生成空结果。
创建HDC投影hdcGraph_in_edges
,其中包含所有点和入边:
hdc.graph.create("hdcGraph_in_edges", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "in",
load_id: true,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
本条khop()
查询试图在投影hdcGraph_in_edges
上寻找出边(右向边),没有结果返回。
exec{
khop().src({_id == "A"}).depth(1).direction(right) as n
return count(n)
} on hdcGraph_in_edges
结果:
count(n) |
---|
0 |
本条查询中,度中心性算法计算投影hdcGraph_in_edges
上所有点的出度,结果均为0。
exec{
algo(degree).params({
return_id_uuid: "id",
direction: "out"
}) as r
return r
} on hdcGraph_in_edges
结果:
_id | degree_centrality |
---|---|
D | 0 |
B | 0 |
A | 0 |
C | 0 |
投影不包含点ID
在创建HDC投影时,若load_id
选项设定为false
,则投影不包含点的_id
值。若在查询或算法中引用了_id
,则会引发报错或生成空结果。算法回写文件会用_uuid
值替代_id
值。
创建HDC投影hdcGraph_no_id
,其中不包含点的_id
值:
hdc.graph.create("hdcGraph_no_id", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: false,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
本条ab()
查询使用_id
过滤投影hdcGraph_no_id
上的点,由于投影不包含点的_id
,所以引发报错:
exec{
ab().src({_id == "A"}).dest({_id == "C"}).depth(2) as p
return p{*}
} on hdcGraph_no_id
度中心性算法计算投影hdcGraph_no_id
上所有点的度,由于投影不包含点的_id
值,结果中对应列的值均为空:
exec{
algo(degree).params({
return_id_uuid: "id"
}) as r
return r
} on hdcGraph_no_id
结果:
_id | degree_centrality |
---|---|
2 | |
2 | |
3 | |
3 |
度中心性算法计算投影hdcGraph_no_id
上所有点的度,并将结果回写至文件degree.txt
上,其中点的_id
被替换成_uuid
:
algo(degree).params({
project: "hdcGraph_no_id",
return_id_uuid: "id"
}).write({
file: {
filename: "degree.txt"
}
})
结果:
_uuid,degree_centrality
288232575174967298,2
3530824306881724417,2
10016007770295238657,3
12033620403357220866,3
投影不包含属性
如果创建HDC投影时未包含某些属性,则在查询或算法引用这些属性时会引发报错或生成空结果。
创建HDC投影hdcGraph_no_weight
,其中包含所有点以及边@link
的系统属性:
hdc.graph.create("hdcGraph_no_weight", {
nodes: {"*": ["*"]},
edges: {"link": []},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
本条ab()
查询在投影hdcGraph_no_weight
上查找最短路径,以边属性@link.weight
计算权重。由于weight
属性缺失,查询会引发报错:
exec{
ab().src({_id == "A"}).dest({_id == "C"}).depth(2).shortest(@link.weight) as p
return p
} on hdcGraph_no_weight
度中心性算法根据边属性@link.weight
加权计算投影hdcGraph_no_weight
上所有点的度。由于weight
属性缺失,查询会引发报错:
exec{
algo(degree).params({
edge_schema_property: "@link.weight"
}) as r
return r
} on hdcGraph_no_weight