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

时间:2019-02-26 12:01:07

标签: java sparql jena

我正在尝试整理一些我目前拥有的代码,使其更加通用。目前,我有一个可以正常工作的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");

1 个答案:

答案 0 :(得分:1)

将变量名不带'?'传递到Var.alloc,它会自动添加。另外,正如@AKSW在他的评论中所述,由于dbr:Tony_Blair是URI,因此调用应为:

sbi.setVar(Var.alloc("name"), NodeFactory.createURI("dbr:Tony_Blair"));