将 SparQL 查询转换为 QueryBuilder 对象,以便我可以使用准备好的语句

Converting SparQL query into a QueryBuilder object so i can use prepared statements

我正在尝试整理我目前拥有的一些代码,使其更通用一些。目前我有一个 StringBuilder 可以工作,但我想将它转换成一个 SelectBuilder 对象,这样我就可以从其他函数传入不同的主题等,而不需要再次编写相同的代码。

我可以传入字符串,但我希望使用 jena.SelectBuilder,因为它看起来很整洁。

这就是我目前正在做的事情,理想情况下我希望能够传入姓名并设置该变量,以及生日(也许我可以寻找 birthPlace)

下面的版本有效,因为它 returns 所有的生日,但它没有返回我想要的单一生日',即 TonyBlair 的生日。

我意识到问题可能不明确 - 如何传入值 'Tony_Blair' 以便查询中的 '?name' 值被此字符串替换并返回给我单个我想要的结果?我计划能够传递任何主题 and/or 谓词。

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"));