在 Jena 中替换 SPARQL 查询中的变量
Replace variables within a SPARQL query in Jena
我需要在 SPARQL 查询中替换一些变量(indx、placx、datx、tempx),为此我正在使用以下代码:
ParameterizedSparqlString ps = new ParameterizedSparqlString();
ps.setCommandText("INSERT DATA" +
"{" +
":indx :locatedIn :placx ;" + ":onDate datx ;" + ":measures tempx ." +
"}");
ps.setIri(":","http://www.example.com/tempsensor#");
ps.setLiteral("indx",ind);
ps.setLiteral("placx",plac);
ps.setLiteral("datx",dat);
ps.setLiteral("tempx",temp);
System.out.println(ps.toString());
在 运行 上,它简单地打印出:
插入数据{:indx :locatedIn :placx ;:onDate datx ;:measures tempx .}
如何在查询中成功插入值?
更新 #1
代码中引入的变化如下:
ps.setBaseUri("http://www.example.com/tempsensor#");
ps.setCommandText("PREFIX : <http://www.example.com/tempsensor#>\n"+
"INSERT DATA\n" +
"{\n" +
" ?indx :locatedIn ?placx ;" + ":onDate ?datx ;" + " :measures ?tempx .\n" +
"}");
ps.setIri("?indx", ps.getBaseUri()+ind);
ps.setIri("placx",ps.getBaseUri()+plac);
ps.setLiteral("datx",dat);
ps.setLiteral("tempx",temp);
System.out.println(ps.toString());
我得到的输出为:
PREFIX : <http://www.example.com/tempsensor#>
INSERT DATA
{
<#ind1> :locatedIn <#Delhi> ;:onDate "2015-02-01" ; :measures 13 .
}
我不知道我哪里做错了。我需要这样的输出:
PREFIX : <http://www.example.com/tempsensor#>
INSERT DATA
{
:ind1 :locatedIn :Delhi ; :onDate 2015-02-01 ; :measures 13 .
}
即 ind1 应该没有引号、尖括号,# 和日期应该没有引号。 locatedIn 是一个 objecttypeProperty,onDate 和 measures 是 Datatype 属性。实际上,我需要逐行从 CSV 中读取数据并插入到 ontology 中。为此,我想编写脚本,我将在其中读取 CSV 行并将其转换为 SPARQL 字符串。在下一步中,我将使用创建的这个字符串进行更新 SPARQL 查询。
您需要在查询中使用变量,而不是常量。例如,您的字符串最初应该是:
insert data { ?indx :locatedIn ?placx ... }
然后就可以使用各种setXXX函数了。但是,请注意,不仅仅是 setLiteral。此处不应使用 setLiteral 设置 ?indx 的值,因为文字不能是 RDF 中三元组的 subjects。对于这种情况,您会想要使用 setIri。有关完整列表,请参阅 ParameterizedSparqlString 的文档。
我需要在 SPARQL 查询中替换一些变量(indx、placx、datx、tempx),为此我正在使用以下代码:
ParameterizedSparqlString ps = new ParameterizedSparqlString();
ps.setCommandText("INSERT DATA" +
"{" +
":indx :locatedIn :placx ;" + ":onDate datx ;" + ":measures tempx ." +
"}");
ps.setIri(":","http://www.example.com/tempsensor#");
ps.setLiteral("indx",ind);
ps.setLiteral("placx",plac);
ps.setLiteral("datx",dat);
ps.setLiteral("tempx",temp);
System.out.println(ps.toString());
在 运行 上,它简单地打印出:
插入数据{:indx :locatedIn :placx ;:onDate datx ;:measures tempx .}
如何在查询中成功插入值?
更新 #1
代码中引入的变化如下:
ps.setBaseUri("http://www.example.com/tempsensor#"); ps.setCommandText("PREFIX : <http://www.example.com/tempsensor#>\n"+ "INSERT DATA\n" + "{\n" + " ?indx :locatedIn ?placx ;" + ":onDate ?datx ;" + " :measures ?tempx .\n" + "}"); ps.setIri("?indx", ps.getBaseUri()+ind); ps.setIri("placx",ps.getBaseUri()+plac); ps.setLiteral("datx",dat); ps.setLiteral("tempx",temp); System.out.println(ps.toString());
我得到的输出为:
PREFIX : <http://www.example.com/tempsensor#>
INSERT DATA
{
<#ind1> :locatedIn <#Delhi> ;:onDate "2015-02-01" ; :measures 13 .
}
我不知道我哪里做错了。我需要这样的输出:
PREFIX : <http://www.example.com/tempsensor#>
INSERT DATA
{
:ind1 :locatedIn :Delhi ; :onDate 2015-02-01 ; :measures 13 .
}
即 ind1 应该没有引号、尖括号,# 和日期应该没有引号。 locatedIn 是一个 objecttypeProperty,onDate 和 measures 是 Datatype 属性。实际上,我需要逐行从 CSV 中读取数据并插入到 ontology 中。为此,我想编写脚本,我将在其中读取 CSV 行并将其转换为 SPARQL 字符串。在下一步中,我将使用创建的这个字符串进行更新 SPARQL 查询。
您需要在查询中使用变量,而不是常量。例如,您的字符串最初应该是:
insert data { ?indx :locatedIn ?placx ... }
然后就可以使用各种setXXX函数了。但是,请注意,不仅仅是 setLiteral。此处不应使用 setLiteral 设置 ?indx 的值,因为文字不能是 RDF 中三元组的 subjects。对于这种情况,您会想要使用 setIri。有关完整列表,请参阅 ParameterizedSparqlString 的文档。