SPARQL Jena迭代以获得更多主题的结果
我正在尝试获取有关DBpedia的一些概念的信息。我发现了如何得到1,但更多的是它失败了。我被告知过滤应该有帮助,但处理时间太长,我会超时 我不能做的是价值观{dbpedia:Facebook dbpedia:Google} 所以我一直在寻找另一种方法,但仍然没有;不起作用。这就是我现在的处境:SPARQL Jena迭代以获得更多主题的结果,sparql,jena,dbpedia,Sparql,Jena,Dbpedia,我正在尝试获取有关DBpedia的一些概念的信息。我发现了如何得到1,但更多的是它失败了。我被告知过滤应该有帮助,但处理时间太长,我会超时 我不能做的是价值观{dbpedia:Facebook dbpedia:Google} 所以我一直在寻找另一种方法,但仍然没有;不起作用。这就是我现在的处境: public static String concepts[] = { "Facebook", "Google" }; public static String getQuery(String
public static String concepts[] = { "Facebook", "Google" };
public static String getQuery(String concept) {
return "prefix dbpediaowl: <http://dbpedia.org/ontology/>"
+ " prefix dbpedia: <http://dbpedia.org/resource/>"
+ " prefix owl: <http://www.w3.org/2002/07/owl#>"
+ " prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
+ " PREFIX dbpprop: <http://dbpedia.org/property/>"
+ " prefix dbpedia-owl: <http://dbpedia.org/ontology/>"
+ " select ?s ?p ?o where { "
+ " values ?web { dbpedia:"
+ "Facebook"
+ " } "
+ " { ?web ?p ?o bind( ?web as ?s ) } " + " union "
+ " { ?s ?p ?web bind( ?web as ?o ) } " + " filter( ?p in ( "
+ "dbpprop:available, " + "dbpprop:company, "
+ "dbpprop:inventor, " + "dbpedia-owl:foundedBy, "
+ "dbpedia-owl:subsidiary, " + "dbpprop:foundation, "
+ "dbpprop:founder, " + "dbpprop:industry, "
+ "dbpprop:programmingLanguage, " + "dbpedia-owl:successor )) ";
}
public static void main(String[] args) {
OutputStream os;
PrintStream printStream;
try {
os = new FileOutputStream("C:/Users/alex/Desktop/data.txt");
printStream = new PrintStream(os);
printStream.println("am scris");
for (int i = 0; i < concepts.length; i++) {
printStream.println(i+ " concept");
Query query = QueryFactory.create(getQuery(concepts[i]));
QueryExecution qExe = QueryExecutionFactory.sparqlService(
"http://lod.openlinksw.com/sparql", query);
ResultSet results = qExe.execSelect();
while (results.hasNext()) {
printStream.println(results.nextSolution().toString());
}
}
printStream.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getCause());
}
}
publicstaticstringconcepts[]={“Facebook”、“Google”};
公共静态字符串getQuery(字符串概念){
返回“前缀dbpediaowl:”
+“前缀dbpedia:”
+“前缀owl:”
+“前缀rdf:”
+“前缀dbpprop:”
+“前缀dbpedia owl:”
+“选择?s?p?o,其中{”
+“值?web{dbpedia:”
+“Facebook”
+ " } "
+“{web?p?o绑定(?web as?s)}”+“并集”
+“{s?p?web绑定(?web as?o)}”+”过滤器(?p in(”
+dbpprop:可用,“+”dbpprop:公司
+dbpprop:inventor,“+”dbpedia owl:foundedBy
+dbpedia owl:子公司,“+”dbpprop:基础
+dbpprop:创始人,“+”dbpprop:行业
+“dbpprop:programmingLanguage”,+“dbpedia owl:successiver”);
}
公共静态void main(字符串[]args){
输出流;
打印流打印流;
试一试{
os=新文件输出流(“C:/Users/alex/Desktop/data.txt”);
printStream=新的printStream(os);
printStream.println(“am scris”);
for(int i=0;i
对于一个概念,在SPARQL中效果很好,但我需要调用大约50个。因此我需要知道如何通过编程实现。此外,如果您能帮助我选择谓词(无需过滤),那就太好了,因为我还需要允许大约30-40个谓词
非常感谢!希望你能帮助。我想我们已经用你上一个问题中的
值解决了这个问题。你可以使用过滤器(?s in(dbpedia:Facebook,dbpedia:Google)而不是值{dbpedia:Facebook dbpedia:Google}
。这对主题和属性非常有效。例如,如果你想获得谷歌和Facebook的英文摘要和标签,你可以使用如下查询:
select ?s ?p ?o where {
?s ?p ?o
filter( ?s in (dbpedia:Google, dbpedia:Facebook) )
filter( ?p in (rdfs:label, dbpedia-owl:abstract) )
filter( !isLiteral(?o) || langMatches(lang(?o),"en") )
}
现在,如果您可以摆脱联合
(如果您真的只是从某些主题中查找某些属性的值,那么您可能能够做到这一点),那么您实际上可以按照您希望的方式使用值
块。(实际上,我认为在您的另一个问题中看到的问题行为是由于DBpedia错误造成的;我认为您应该能够同时使用值
和联合
)。也就是说,要为某些指定属性选择非文本和带有英语标记的文本,您可以执行以下操作:
select ?s ?p ?o where {
values ?s { dbpedia:Google dbpedia:Facebook }
values ?p { rdfs:label dbpedia-owl:abstract }
?s ?p ?o
filter( !isLiteral(?o) || langMatches(lang(?o),"en") )
}
过滤器的问题是它们的工作速度较慢,而DBpedia会给我超时。我找到了一个更好的端点镜像DBpedia,但它仍然有它的局限性,我需要检查大约30-40-50个资源。@AlexDoro如果你只是查询某些属性的值,你应该能够摆脱联合
并使用它值
,对吗?是否仍然存在超时问题?