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

问题描述 投票:0回答:1

我正在尝试整理一些我目前使用的代码更加通用。目前我有一个可行的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");
java sparql jena
1个回答
1
投票

将变量名称传递给没有'?'的Var.alloc,它会自动添加。另外,正如@AKSW在他的评论中所述,由于dbr:Tony_Blair是一个URI,所以调用应该是:

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

© www.soinside.com 2019 - 2024. All rights reserved.