Oracle Property Graph是Oracle数据库提供的一套属性图处理框架,允许开发者在熟悉的Oracle环境中完成图数据的建模、存储、查询和分析。对很多已经深度使用Oracle的企业来说,这套能力意味着不必为了图计算需求单独引入Neo4j或JanusGraph这样的专用图数据库,直接在现有数据库体系内就能构建知识图谱、风控网络、推荐关系链等应用。本文将从数据模型、查询语言和图分析三个层面,详细介绍Oracle属性图的使用方式。

一、属性图数据模型:顶点、边与属性
Oracle Property Graph采用标准的属性图模型,整个图由两类核心实体构成:顶点(Vertex)和边(Edge)。顶点代表业务中的实体,比如一个用户、一个账户、一件商品;边代表实体之间的关系,比如转账、购买、关注。与简单的图模型不同,属性图允许在顶点和边上挂载任意数量的键值对属性,这正是它表达能力强大的关键。
举个风控场景的例子:一个账户顶点可以携带账户名、开户时间、账户等级等属性;一笔转账边上则可以携带金额、时间戳、渠道编号。图分析算法在做环检测或路径搜索时,可以直接利用这些属性做过滤和权重计算,比如只考虑金额大于5000的转账边,这比把属性外挂到关系表里再关联查询要自然得多。
在存储层面,Oracle提供了两种形态。一种是基于关系表的扁平化存储,顶点和边分别落在不同的表中,属性以键值行的方式展开,适合数据量大、批量加载频繁的场景;另一种是Oracle 23c之后引入的原生图支持,图表可以由现有关联表直接生成,开发者用一行CREATE PROPERTY GRAPH语句就能把普通表映射成图,大幅降低了入门门槛。下面是一个基于SQL的图创建示例:
-- 从现有的关联表创建属性图(Oracle 23c原生语法)
CREATE PROPERTY GRAPH account_graph
VERTEX TABLES (
accounts LABEL account PROPERTIES (account_id, name, level)
)
EDGE TABLES (
transfers LABEL transfer
SOURCE KEY (from_account) REFERENCES accounts (account_id)
DESTINATION KEY (to_account) REFERENCES accounts (account_id)
PROPERTIES (amount, transfer_time)
);
这段语句执行后,accounts表中的每一行都会成为图中的一个顶点,transfers表的每一行变成一条有向边。整个过程不需要迁移数据,图只是表数据之上的一个逻辑视图,这对已有大量业务数据的企业来说非常友好。
二、PGQL查询语言:用SQL的思维查图
PGQL(Property Graph Query Language)是Oracle主导的图查询语言,语法风格与SQL高度接近,熟悉SQL的开发者几乎可以无缝上手。PGQL的核心能力是图模式匹配,你用一种类似路径表达式的语法描述想要找的子图结构,数据库负责在整张图中定位所有匹配。
最典型的用法是查找特定模式的路径。比如在反洗钱分析中,一个常见模式是资金经过多跳之后又回到起点,即资金流转成环。用PGQL表达这个模式非常简洁:
-- 查找资金经过2到4跳后回到起点的环路
SELECT src.name AS start_account,
COUNT(t2) AS hop_count,
SUM(t2.amount) AS total_amount
FROM MATCH (src)-[t1:transfer]->()-[t2:transfer]->{1,3}(src)
WHERE t1.amount > 5000
GROUP BY src.name
ORDER BY total_amount DESC;
这条查询中的MATCH子句描述了路径结构,起点和终点都是src变量,中间的{1,3}表示可变长路径。如果用纯SQL实现同样的逻辑,需要写多层自连接或递归WITH子句,代码冗长且优化器很难高效执行。PGQL在图场景下的优势就在于此:模式描述与业务直觉一致,数据库内部会将模式匹配转化为高效的图遍历执行计划。
除了路径匹配,PGQL还支持最短路径计算、图内聚合、正则路径约束等能力。在Oracle 23c中,PGQL已经可以嵌入SQL语句内部使用,图查询结果可以继续与普通表做连接,这让图分析与传统报表分析实现了真正意义上的融合,而不是两套系统之间来回倒数据。
三、图分析算法:从pagerank到社群发现
查询解决的是找模式的问题,而图分析算法解决的是全局结构计算的问题。Oracle Property Graph提供了丰富的内置算法,包括经典的PageRank、介于中心性的Betweenness Centrality、社群发现的Conductance与Louvain风格算法、连通分量、三角计数等,覆盖了社交网络分析和欺诈检测中最常用的算法族。
在执行方式上,Oracle推荐使用PGX(Parallel Graph AnalytiX)作为内存图分析引擎。PGX可以将图数据加载到内存中,利用多线程并行执行算法,千万级顶点的图在内存中跑PageRank通常只需几秒到几十秒。Java开发者可以通过PGX的API完成加载、分析和结果写回的完整流程:
import oracle.pgx.api.*;
public class GraphAnalysisDemo {
public static void main(String[] args) throws Exception {
PgxInstance instance = Pgx.getInstance();
ServerInstance server = instance.createSession("risk-analysis");
// 将数据库中的属性图加载到内存
PgxGraph graph = server.readGraphByName(
"account_graph", GraphSource.PG_VIEW);
// 执行PageRank算法,识别网络中的关键账户
Analyst analyst = server.createAnalyst();
VertexProperty<Double> rank = analyst.pagerank(graph, 0.85, 0.001, 100);
// 输出排名前10的顶点
graph.getVertices().stream()
.sorted((a, b) -> Double.compare(
rank.get(b), rank.get(a)))
.limit(10)
.forEach(v -> System.out.println(
v.getId() + " -> " + rank.get(v)));
}
}
这段代码演示了从图加载到算法执行再到结果消费的完整链路。PageRank算出的分数可以解读为账户在网络中的影响力,在欺诈检测中,异常高的PageRank值往往意味着某个账户是资金归集的核心节点,值得重点排查。类似的思路也可以用于识别担保圈、发现异常社群。
需要说明的是,内存分析的代价是内存消耗。PGX适合做离线或准实时的批量图计算,如果业务要求毫秒级的在线图查询,应该走PGQL路径查询而非把全图塞进内存。实际架构中常见的组合是:交易数据实时写入Oracle表,夜间任务用PGX跑全图算法并将结果写回表中,在线系统通过PGQL查询预计算结果加实时路径,两层配合各取所长。
四、适用场景与选型建议
Oracle Property Graph并不是要替代专用图数据库,它的价值定位很明确:为已经运行在Oracle上的业务系统补上图能力。如果企业的核心数据本来就存在Oracle中,图分析只是众多分析维度之一,那么引入独立图数据库会带来数据同步、运维、安全审计等额外成本,此时属性图方案的整体拥有成本明显更低。
反过来说,如果业务是超大规模的纯图场景,比如数十亿顶点的实时推荐,或者需要图数据库特有的细粒度事务控制,那么专用图数据库或分布式图计算框架仍然是更合适的选择。一个务实的判断标准是:图中数据与核心业务数据的交互频率。交互越紧密,越应该考虑把图能力放在数据库内部;交互越松散,独立图服务的架构灵活度优势才体现得出来。
综合来看,Oracle Property Graph把图建模、PGQL查询和PGX内存分析组合成了一套完整工具链,配合23c的原生图表语法,入门门槛已经降到与写SQL相差无几的水平。对于Oracle存量用户来说,这无疑是切入图分析领域最平滑的一条路径。
Oracle Property Graph属性图图数据库修改时间:2026-09-08 22:35:15