Sparql Jena StmtIterator和数据库

Sparql Jena StmtIterator和数据库,sparql,jena,arq,Sparql,Jena,Arq,我将模型存储在一个三重存储(持久性)中。 我想选择与某个文档名相关的所有个人 我可以用两种方法来做 1) SPARQL请求: PREFIX base:<http://example#> select ?s2 ?p2 ?o2 where { {?doc base:fullName <file:/c:/1.txt>; ?p1 ?o1 } UNION { ?s2 ?p2 ?o2 ; base:documentID ?doc

我将模型存储在一个三重存储(持久性)中。 我想选择与某个文档名相关的所有个人

我可以用两种方法来做

1) SPARQL请求:

 PREFIX base:<http://example#>
  select ?s2 ?p2 ?o2 
    where {
      {?doc base:fullName <file:/c:/1.txt>; ?p1 ?o1
  } UNION { 
    ?s2 ?p2 ?o2 ;
    base:documentID ?doc    } 
  }

你需要后退一点,更清楚地思考你想做什么。您的sparql查询一旦得到纠正(见下文),将在结果集上生成一个迭代器,这将为您提供所查找的每个文档的属性。具体地说,对于结果集中的每个值,
s2
p2
o2
都有一组绑定。这就是您在指定
选择?s2?p2?o2
时所要求的。这通常是您想要的:通常,我们从triple store中选择一些值,以便以某种方式处理它们(例如,将它们呈现到UI上的列表中),为此,我们确实需要对结果使用迭代器。借助SPARQL查询或SPARQL,可以让查询返回模型而不是结果集。然而,您随后需要迭代模型中的资源,因此您不会前进太远(除了您的模型更小并且在内存中)

顺便提一下,您的查询可以改进。变量
p1
o1
使查询引擎做无用的工作,因为您从不使用它们,也不需要联合。更正后,您的查询应为:

PREFIX base:<http://example#>

select ?s2 ?p2 ?o2 
where {
  ?doc base:fullName <file:/c:/1.txt> .
  ?s2 base:documentID ?doc ;
      ?p2 ?o2 .
}
请注意,您的模式设计使其变得更加复杂。例如,如果文档全名资源有一个
base:isFullNameOf
属性,那么您只需进行查找即可获得
doc
。同样,不清楚为什么需要区分
doc
s2
:为什么不简单地将文档属性附加到
doc
资源


最后:否,打开数据库连接不会将整个数据库加载到内存中。但是,TDB确实广泛使用了图形区域的缓存,以提高查询效率。

我明白了。谢谢你的回答。您认为大型持久性三元组更快的方法是:1)发出SPARQL SELECT,获取ResultSet并从中创建模型,或者2)多次使用listStatements()/listSubjectsWithProperty()?还是一样?或者很难说?我有一个文档的三元组-和其他与此文档相关的三元组-个人-我个人不会担心优化。构建你的应用程序,编写大量的单元和功能测试。使代码尽可能清晰和干净。如果结果很慢,根据分析数据进行优化冲刺,告诉您首先在哪里进行优化;我是根据展示的样本提出可能的改进建议的。但最终你最了解你的领域问题,所以你将是判断你需要多少间接层次的最佳人选。
PREFIX base:<http://example#>

select ?s2 ?p2 ?o2 
where {
  ?doc base:fullName <file:/c:/1.txt> .
  ?s2 base:documentID ?doc ;
      ?p2 ?o2 .
}
Model m = ..... ; // your model here
String baseNS = "http://example#";
Resource fileName = m.createResource( "file:/c:/1.txt" );

// create RDF property objects for the properties we need. This can be done in
// a vocab class, or automated with schemagen
Property fullName = m.createProperty( baseNS + "fullName" );
Property documentID = m.createProperty( baseNS + "documentID" );

// find the ?doc with the given fullName
for (ResIterator i = m.listSubjectsWithProperty( fullName, fileName ); i.hasNext(); ) {
  Resource doc = i.next();

  // find all of the ?s2 whose documentID is ?doc
  for (StmtIterator j = m.listStatements( null, documentID, doc ); j.hasNext(); ) {
    Resource s2 = j.next().getSubject();

    // list the properties of ?s2
    for (StmtIterator k = s2.listProperties(); k.hasNext(); ) {
      Statement stmt = k.next();
      Property p2 = stmt.getPredicate();
      RDFNode o2 = stmt.getObject();

      // do something with s2 p2 o2 ...
    }
  }
}