无法使用 jena 汇编文件加载 turtle 文件
Fail to load turtle files using jena assembler file
我定义了一个名为 dataset2.ttl 的汇编程序文件。这个文件的内容是:
@prefix tdb: <http://jena.hpl.hp.com/2008/tdb#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset .
tdb:GraphTDB rdfs:subClassOf ja:Model .
<#dataset> rdf:type tdb:DatasetTDB ;
tdb:location "DB" ;
tdb:unionDefaultGraph true ;
.
<#data1> rdf:type tdb:GraphTDB ;
tdb:dataset <#dataset> ;
tdb:graphName <http://example.org/data1> ;
ja:content [ja:externalContent <file:///C:/Users/data/data1.ttl>;];
.
创建数据集的相关 jena 代码是:
public class TDB {
public static void main(String[] args) {
Dataset ds = null;
try {
ds = TDBFactory.assembleDataset("Dataset2.ttl");
if(ds == null) {
System.out.println("initial tdb failed");
} else {
System.out.println("Default Model:");
Model model = ds.getDefaultModel();
ds.begin(ReadWrite.WRITE);
model.write(System.out, "TURTLE");
}
} finally {
if(ds != null) {
ds.close();
}
}
}
data1.ttl中的内容是:
@prefix : <http://example.org/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
:alice
a foaf:Person ;
foaf:name "Alice" ;
foaf:mbox <mailto:alice@example.org> ;
foaf:knows :bob ;
foaf:knows :charlie ;
foaf:knows :snoopy ;
.
:bob
foaf:name "Bob" ;
foaf:knows :charlie ;
.
:charlie
foaf:name "Charlie" ;
foaf:knows :alice ;
.
已使用此代码创建数据集。但是"data1.ttl"的文件中的内容还没有读入模型。我的代码有什么问题?
我会尝试在线验证您的 ttl 文件以确保它们 dataset2.ttl 和 data.ttl 都有效。我注意到你似乎在不需要的时候在末尾添加了一个额外的 semi-colon(它应该只以句号结尾)。
试着把你的线路改成这样:
ja:content [ja:externalContent <file:///C:/Users/data/data1.ttl>] .
<#data1> rdf:type tdb:GraphTDB ;
tdb:dataset <#dataset> ;
tdb:graphName <http://example.org/data1> ;
ja:content [ja:externalContent <file:///C:/Users/data/data1.ttl>;];
.
注意 tdb:GraphTDB
表示附加到数据库中的图形。它不使用 ja:content
加载数据。
作为持久化存储,应该是数据已经加载好了,e.g.bytdbloader
,不是每次使用汇编器的时候。
你还有
<#dataset> rdf:type tdb:DatasetTDB ;
tdb:location "DB" ;
tdb:unionDefaultGraph true ;
.
和
ds = TDBFactory.assembleDataset("Dataset2.ttl");
所以你要求 Jena assemble 一个数据集。该数据集将是 <#dataset>
(按类型查找)。它没有连接您定义的图形,因此被忽略;你可以删除那部分。组装数据集是执行此操作的方法。
您有 tdb:unionDefaultGraph true
,因此查询的默认图是数据集中所有命名图的组合。
从 model.getNamedModel
中选出一个。
如果您使用 SPARQL,请使用 GRAPH
关键字。
我定义了一个名为 dataset2.ttl 的汇编程序文件。这个文件的内容是:
@prefix tdb: <http://jena.hpl.hp.com/2008/tdb#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset .
tdb:GraphTDB rdfs:subClassOf ja:Model .
<#dataset> rdf:type tdb:DatasetTDB ;
tdb:location "DB" ;
tdb:unionDefaultGraph true ;
.
<#data1> rdf:type tdb:GraphTDB ;
tdb:dataset <#dataset> ;
tdb:graphName <http://example.org/data1> ;
ja:content [ja:externalContent <file:///C:/Users/data/data1.ttl>;];
.
创建数据集的相关 jena 代码是:
public class TDB {
public static void main(String[] args) {
Dataset ds = null;
try {
ds = TDBFactory.assembleDataset("Dataset2.ttl");
if(ds == null) {
System.out.println("initial tdb failed");
} else {
System.out.println("Default Model:");
Model model = ds.getDefaultModel();
ds.begin(ReadWrite.WRITE);
model.write(System.out, "TURTLE");
}
} finally {
if(ds != null) {
ds.close();
}
}
}
data1.ttl中的内容是:
@prefix : <http://example.org/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
:alice
a foaf:Person ;
foaf:name "Alice" ;
foaf:mbox <mailto:alice@example.org> ;
foaf:knows :bob ;
foaf:knows :charlie ;
foaf:knows :snoopy ;
.
:bob
foaf:name "Bob" ;
foaf:knows :charlie ;
.
:charlie
foaf:name "Charlie" ;
foaf:knows :alice ;
.
已使用此代码创建数据集。但是"data1.ttl"的文件中的内容还没有读入模型。我的代码有什么问题?
我会尝试在线验证您的 ttl 文件以确保它们 dataset2.ttl 和 data.ttl 都有效。我注意到你似乎在不需要的时候在末尾添加了一个额外的 semi-colon(它应该只以句号结尾)。
试着把你的线路改成这样:
ja:content [ja:externalContent <file:///C:/Users/data/data1.ttl>] .
<#data1> rdf:type tdb:GraphTDB ;
tdb:dataset <#dataset> ;
tdb:graphName <http://example.org/data1> ;
ja:content [ja:externalContent <file:///C:/Users/data/data1.ttl>;];
.
注意 tdb:GraphTDB
表示附加到数据库中的图形。它不使用 ja:content
加载数据。
作为持久化存储,应该是数据已经加载好了,e.g.bytdbloader
,不是每次使用汇编器的时候。
你还有
<#dataset> rdf:type tdb:DatasetTDB ;
tdb:location "DB" ;
tdb:unionDefaultGraph true ;
.
和
ds = TDBFactory.assembleDataset("Dataset2.ttl");
所以你要求 Jena assemble 一个数据集。该数据集将是 <#dataset>
(按类型查找)。它没有连接您定义的图形,因此被忽略;你可以删除那部分。组装数据集是执行此操作的方法。
您有 tdb:unionDefaultGraph true
,因此查询的默认图是数据集中所有命名图的组合。
从 model.getNamedModel
中选出一个。
如果您使用 SPARQL,请使用 GRAPH
关键字。