概述
要在HDC图上执行图查询,请使用以下语法:
exec{
<query>
} on <hdcGraphName>
HDC图支持从数据库检索数据的查询,并且查询效率更高。但是,请留意,任何试图在HDC图上写入数据的操作都将失败。
示例图集
在一个空图集中,逐行运行以下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}])
HDC图查询
为全图创建名为hdcGraph
的HDC图:
hdc.graph.create("hdcGraph", {
nodes: {"*": ["*"]},
edges: {"*": ["*"]},
direction: "undirected",
load_id: true,
update: "static",
query: "query",
default: false
}).to("hdc-server-1")
在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图时,若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 |
HDC图不包含点ID
在创建HDC图时,若load_id
选项设定为false
,则HDC图不包含点的_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
上的点,由于HDC图不包含点的_id
,所以引发报错:
exec{
ab().src({_id == "A"}).dest({_id == "C"}).depth(2) as p
return p{*}
} on hdcGraph_no_id
HDC图不包含属性
如果创建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
不支持数据写入
以下查询会引发报错,报错信息显示不支持在HDC图进行点插入操作:
exec{
insert().into(@entity).nodes([{_id: "E"}])
} on hdcGraph