我正在尝试获取有关DBpedia上某些概念的信息。我发现了如何获得1,但是更多它失败了。我被告知过滤应该有所帮助,但处理时间太长,我得到超时。
我不能做的是VALUES?{dbpedia:Facebook dbpedia:Google}
所以我寻找另一种方法,但它仍然没有工作。这就是我现在的位置:
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());
}
}
对于一次一个概念,在SPARQL中它工作正常,但我需要调用其中的50个。所以我需要知道如何以编程方式完成它。另外,如果你能帮助我选择谓词(没有过滤)会很棒,因为我还需要允许大约30-40个谓词。
非常感谢!希望你能帮忙。
答案 0 :(得分:0)
我认为我们在上一个问题Sparql about dbpedia:World_Wide_Web中使用VALUES ?s { dbpedia:Facebook dbpedia:Google }
解决了问题。您可以使用values ?s { dbpedia:Facebook dbpedia:Google }
而不是filter( ?s in (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") )
}
现在,如果你可以摆脱union
(你可以做到,如果你真的只是在寻找某些科目的某些属性的值),那么你实际上可以使用values
阻挡你想要的方式。 (实际上,我认为在您的其他问题中看到的问题行为是由于DBpedia错误;我认为您应该能够同时使用values
和union
。)也就是说,选择非文字,以及具有某些指定属性的英语标记的文字,您可以这样做:
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") )
}