算法可以在嬴图Manager、嬴图CLI或嬴图Driver中运行。
算法命令
执行算法的UQL子句以algo()
命令开头,在括号内填写相应的算法名称。
示例:algo(degree)
参数配置
在params()
中配置算法参数,并将各键值对包裹成对象格式。
示例:algo(degree).params({ direction: 'in', order: 'asc' })
忽略所有算法参数时,params()
也不可省略。
示例:algo(degree).params()
点边过滤
部分算法(目前有度中心性、PageRank、全图K邻和Louvain)支持使用node_filter()
和edge_filter()
对参与计算的点、边进行过滤。
// 在由@account点和它们之间的边构成的子图中计算UUID为1的节点的度
algo(degree).params({
uuids: 1
}).node_filter({@account}) as d
return d
执行方式
嬴图支持四类算法执行方式,每次运行时需指定一种方式:
执行方式 |
执行参数 |
描述 | 后续处理(1) |
---|---|---|---|
任务回写 | write() |
以任务的方式运行算法,可指定将算法结果回写至文件(RPC 接口)或属性,算法统计值(如果有)将回写至任务信息 | 不支持 |
直接返回 | / | 直接返回算法结果和统计值 | 不支持 |
流式返回 | stream() |
以数据流的形式返回算法结果 | 支持 |
统计返回 | stats() |
以数据流的形式返回算法统计值 | 不支持 |
(1)这意味着在后续的UQL子句中(RETURN子句除外)使用为algo()
子句定义的别名。
1. 任务回写:文件,属性
任务回写包含文件回写、属性回写和统计回写。不能同时进行文件回写和属性回写;在进行文件或属性回写时,统计值(如有)会自动回写至算法任务信息中。
1.1 文件回写
将算法结果回写至一个或多个文件,需配置文件名。回写的文件无表头,每行数据以英文逗号分隔。算法统计值(如有)同时回写至算法任务信息中。
语法:在write()
里包裹file
对象,file
对象的配置项详见各算法介绍
algo(connected_component).params({
cc_type: 1
}).write({
file:{
filename_ids: 'f1',
filename_num: 'f2'
}
})
文件名建议使用.csv或.txt后缀,也可以不使用后缀。
1.2 属性回写
将算法结果回写至一个或多个点属性或边属性,需配置属性名。算法统计值(如有)同时回写至算法任务信息中。
属性回写是全量操作,即回写至当前图集的所有点或边,因此提供属性名称时无需指定Schema。对于任意一个Schema,如果提供的回写属性不存在,则自动创建属性;如果回写属性已存在但数据类型不一致,则该Schema下的属性回写失败。对于有计算结果的点或边,算法结果将写入属性中;对于没有结果的点或边,根据算法结果的数据类型写入0或空字符串等。
语法:write()
里包裹db
对象,db
对象的配置项详见各算法介绍
algo(closeness_centrality).params().write({
db:{
property: "centrality"
}
})
2. 直接返回
对于有统计值的算法,支持定义两个别名,第一个是算法结果别名,第二个的是统计值别名,该顺序不可修改。如果算法没有统计值,只能定义一个别名。
语法:直接定义别名并与RETURN子句组装
algo(degree).params({
direction: 'out'
}) as a1, a2
return a1, a2
3. 流式返回
仅支持定义一个别名,一般该别名代表算法结果。为算法语句定义别名后,继续书写其他子句并使用该别名,但不支持与操作插入、修改或删除元数据的子句组装。
语法:使用stream()
并定义别名
algo(closeness_centrality).params().stream() as cc
where cc.centrality > 0.5
return cc._uuid
4. 统计返回
仅支持定义一个别名,一般该别名代表统计值。为算法语句定义别名后,继续书写其他子句并使用该别名,但不支持与操作插入、修改或删除元数据的子句组装。
语法:使用stats()
并定义别名
algo(lpa).params({
node_label_property: @default.name,
k: 1,
loop_num: 5
}).stats() as labelCount
return labelCount