Apache Jena
→ 返回图数据库
Apache 基金会维护的 Java 语义 Web 框架,提供 RDF 数据处理、SPARQL 查询、OWL 推理和三元组存储(TDB)能力。常用于构建知识图谱应用的后端服务。
核心组件
| 组件 | 说明 |
|---|---|
| Model API | RDF 图的 Java 操作接口 |
| ARQ | SPARQL 1.1 查询引擎 |
| TDB / TDB2 | 本地磁盘三元组存储,TDB2 为推荐版本 |
| Fuseki | SPARQL HTTP 服务器,提供 REST 端点 |
| Inference API | 内置 RDFS / OWL 推理引擎 |
| RDF Connection | 远程 SPARQL 端点客户端 |
依赖
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<type>pom</type>
<version>4.10.0</version>
</dependency>
<!-- Fuseki 服务器(可选) -->
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-fuseki-main</artifactId>
<version>4.10.0</version>
</dependency>RDF Model 操作
// 创建内存模型
Model model = ModelFactory.createDefaultModel();
// 添加三元组
String ns = "http://example.org/";
Resource alice = model.createResource(ns + "Alice");
Property knows = model.createProperty(ns + "knows");
Resource bob = model.createResource(ns + "Bob");
alice.addProperty(knows, bob);
alice.addProperty(FOAF.name, "Alice");
// 读取 Turtle 文件
model.read("data.ttl", "TURTLE");
// 写出为 Turtle
model.write(System.out, "TURTLE");SPARQL 查询(ARQ)
String sparql = """
PREFIX ex: <http://example.org/>
SELECT ?name
WHERE {
?person ex:knows ex:Bob .
?person <http://xmlns.com/foaf/0.1/name> ?name .
}
""";
Query query = QueryFactory.create(sparql);
try (QueryExecution qe = QueryExecutionFactory.create(query, model)) {
ResultSet results = qe.execSelect();
while (results.hasNext()) {
QuerySolution sol = results.nextSolution();
System.out.println(sol.getLiteral("name").getString());
}
}TDB2 持久化存储
// 创建或打开 TDB2 数据集
Dataset dataset = TDB2Factory.connectDataset("./tdb2-store");
// 写入事务
dataset.begin(ReadWrite.WRITE);
try {
Model model = dataset.getDefaultModel();
model.add(...);
dataset.commit();
} finally {
dataset.end();
}
// 查询事务
dataset.begin(ReadWrite.READ);
try (QueryExecution qe = QueryExecutionFactory.create(query, dataset)) {
ResultSet rs = qe.execSelect();
// ...
} finally {
dataset.end();
}Fuseki SPARQL 服务器
// 嵌入式启动
FusekiServer server = FusekiServer.create()
.add("/ds", dataset)
.port(3030)
.build();
server.start();
// SPARQL 端点:http://localhost:3030/ds/query
// http://localhost:3030/ds/update# 独立部署
./fuseki-server --tdb2 --loc=./tdb2-store /ds推理
// RDFS 推理
Model schema = ModelFactory.createDefaultModel();
schema.read("ontology.ttl", "TURTLE");
Reasoner reasoner = ReasonerRegistry.getRDFSReasoner();
reasoner = reasoner.bindSchema(schema);
InfModel infModel = ModelFactory.createInfModel(reasoner, data);
// infModel 自动包含推断出的三元组与 GraphDB 对比
| 维度 | Jena + TDB2 | GraphDB |
|---|---|---|
| 类型 | 开发框架 + 嵌入式存储 | 独立数据库服务 |
| 部署 | 嵌入 Java 应用 | 独立服务器 |
| 推理 | 基础 RDFS/OWL | 完整 OWL 2 RL |
| 扩展性 | 单机 | 支持集群 |
| 适用场景 | Java 应用集成、快速原型 | 生产级知识图谱服务 |