无法使用 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 关键字。