我正在尝试整理一些我目前使用的代码更加通用。目前我有一个可行的StringBuilder,但我想将其转换为SelectBuilder对象,以便我可以从其他函数传递不同的主题等,而不是再次编写相同的代码。
我可以传入String但我希望使用jena.SelectBuilder,因为它看起来很整洁。
这是我正在做的工作,理想情况下我希望能够传递名称并设置变量,以及生日(也许我可以寻找birthPlace)
下面的版本有效,因为它返回所有生日,但它不会返回我想要的单个生日,即TonyBlair的生日。
我意识到问题可能并不清楚 - 如何传递值'Tony_Blair',以便查询中的'?name'值替换为此字符串并返回我想要的单个结果?我计划能够传递任何主题和/或谓词。
String name = "Tony_Blair";
SelectBuilder sbi = new SelectBuilder()
.addPrefix("dbr", "http://dbpedia.org/resource/")
.addPrefix("dbp", "http://dbpedia.org/property/")
.addPrefix("dbo", "http://dbpedia.org/ontology/")
//.addVar( "*" ) //the name?
//.addWhere( "dbr:Tony_Blair", "dbp:birthDate", "?dob" );
//.addWhere( "dbr:"+name, "dbp:birthDate", "?dob" );
.addWhere( "?name", "dbp:birthDate", "?dob" );
sbi.setVar(Var.alloc("?name"), NodeFactory.createLiteral("dbr:Tony_Blair"));
Query q = sbi.build() ;
这是旧版本
StringBuilder sb = new StringBuilder();
sb.append("PREFIX dbr: <http://dbpedia.org/resource/> \n");
sb.append("PREFIX dbp: <http://dbpedia.org/property/> \n");
sb.append("PREFIX dbo: <http://dbpedia.org/ontology/> \n");
sb.append("SELECT (STR(?dob) as ?date_of_birth) \n");
sb.append("WHERE {dbr:Tony_Blair dbp:birthDate ?dob} \n");
将变量名称传递给没有'?'的Var.alloc
,它会自动添加。另外,正如@AKSW在他的评论中所述,由于dbr:Tony_Blair
是一个URI,所以调用应该是:
sbi.setVar(Var.alloc("name"), NodeFactory.createURI("dbr:Tony_Blair"));