在SPARQL查询中使用在查询字符串外部声明的变量-使用JSP和Javaservlet

在SPARQL查询中使用在查询字符串外部声明的变量-使用JSP和Javaservlet,java,nlp,sparql,rdf,jena,Java,Nlp,Sparql,Rdf,Jena,我有2个jsp页面。在索引页面中,我选择一个下拉值,并将所选值作为url参数传递给SearchResults页面 http://localhost:8080/SearchResults.jsp?jobCat=InformationTechnology 我正在使用下面的代码捕获传递的参数InformationTechnology。查询应在表单中显示所选值的结果。(我正在选择一个职务类别,结果应显示所选职务类别下的候选人) 下面是我的问题 String queryString = "Select

我有2个jsp页面。在索引页面中,我选择一个下拉值,并将所选值作为url参数传递给SearchResults页面

http://localhost:8080/SearchResults.jsp?jobCat=InformationTechnology
我正在使用下面的代码捕获传递的参数
InformationTechnology
。查询应在表单中显示所选值的结果。(我正在选择一个职务类别,结果应显示所选职务类别下的候选人)

下面是我的问题

String queryString =
"Select ?a ?b"+
" Where { ...."+
" Filter (?a = "+ jobCategory  +")"+// jobCategory is the String variable 
" }";
但我得到了一个异常错误

com.hp.hpl.jena.query.QueryParseException: Encountered " "in" "In "" at line 
1, column 559.
Was expecting one of:
<IRIref> ...
<PNAME_NS> ...
<PNAME_LN> ...
<VAR1> ...
<VAR2> ...
"exists" ...
"not" ...
"count" ...
"min" ...
"max" ...
"sum" ...
"avg" ...
"sample" ...
"group_concat" ...
"bound" ...
"coalesce" ...
"if" ...
"bnode" ...
"iri" ...
"uri" ...
"str" ...
"strlang" ...
"strdt" ...
"datatype" ...
"lang" ...
"langmatches" ...
"isURI" ...
"isIRI" ...
"isBlank" ...
"isLiteral" ...
"isNumeric" ...
"regex" ...
"sameTerm" ...
"RAND" ...
"ABS" ...
"CEIL" ...
"FLOOR" ...
"ROUND" ...
"CONCAT" ...
"SUBSTR" ...
"STRLEN" ...
"UCASE" ...
"LCASE" ...
"ENCODE_FOR_URI" ...
"CONTAINS" ...
"strSTARTS" ...
"strENDS" ...
"YEAR" ...
"MONTH" ...
"DAY" ...
"HOURS" ...
"MINUTES" ...
"SECONDS" ...
"TIMEZONE" ...
"TZ" ...
"NOW" ...
"MD5" ...
"SHA1" ...
"SHA224" ...
"SHA256" ...
"SHA384" ...
"SHA512" ...
"true" ...
"false" ...
<INTEGER> ...
<DECIMAL> ...
<DOUBLE> ...
<INTEGER_POSITIVE> ...
<DECIMAL_POSITIVE> ...
<DOUBLE_POSITIVE> ...
<INTEGER_NEGATIVE> ...
<DECIMAL_NEGATIVE> ...
<DOUBLE_NEGATIVE> ...
<STRING_LITERAL1> ...
<STRING_LITERAL2> ...
<STRING_LITERAL_LONG1> ...
<STRING_LITERAL_LONG2> ...
"(" ...
"!" ...
"+" ...
"-" ...
com.hp.hpl.jena.query.QueryParseException:在第行的“”中遇到“”
1,第559列。
我期待的是:
...
...
...
...
...
“存在”。。。
“不是”。。。
“伯爵”。。。
“敏”。。。
“马克斯”。。。
“总和”。。。
“平均值”。。。
“样本”。。。
“团体会议”。。。
“绑定”。。。
“联合”。。。
“如果”。。。
“bnode”。。。
“iri”。。。
“uri”。。。
“str”。。。
“斯特朗”。。。
“strdt”。。。
“数据类型”。。。
“郎”。。。
“兰格火柴”。。。
“iURI”。。。
“伊西里”。。。
“是空白的”。。。
“岛屿”。。。
“是数字”。。。
“正则表达式”。。。
“sameTerm”。。。
“兰德”。。。
“腹肌”。。。
“细胞”。。。
“地板”。。。
“圆形”。。。
“康卡特”。。。
“SUBSTR”。。。
“斯特伦”。。。
“UCASE”。。。
“LCASE”。。。
“为URI编码”。。。
“包含”。。。
“strSTARTS”。。。
“力量”。。。
“年”。。。
“月”。。。
“天”。。。
“小时”。。。
“分钟”。。。
“秒”。。。
“时区”。。。
“TZ”。。。
“现在”。。。
“MD5”。。。
“沙1”。。。
“SHA224”。。。
“SHA256”。。。
“SHA384”。。。
“SHA512”。。。
“真的”。。。
“假”。。。
...
...
...
...
...
...
...
...
...
...
...
...
...
"(" ...
"!" ...
"+" ...
"-" ...

有没有其他方法可以像在类似场景中一样在SPARQL查询中使用字符串变量。请提前感谢

我假设jobCategory是一个文字/标签?只需直接询问标签即可

String queryString =
"Select ?a ?b"+
" Where { <uri> <uri>\""  + jobCategory +"\"}";
字符串查询字符串=
“选择?a?b”+
“其中{\”“+jobCategory+”\“}”;
我想这是一个URI的查询看起来像

String queryString =
"Select ?a ?b"+
" Where { <uri> <uri> <" + jobCategory+ ">}";
字符串查询字符串=
“选择?a?b”+
“Where{}”;

我有一个解决这个问题的方法。 我使用
regex
获得结果

"filter(regex(?a, \"" + jobCategory + "\"))"

总是,请在解析之前打印最后的查询字符串并查看它-很明显,您必须将URI包装在
之间,只需一句话:package
com.hp.hpl.jena
表示它是旧jena(Jena2)。它不支持SPARQL 1.1 FULLYTANKS用于您的建议@ssz。我已将包更新为org.apache.jenai。如果字符串与您正在搜索的文本完全匹配,则最好处理文本als对象,而不是额外的筛选器,因为正则表达式速度较慢
"filter(regex(?a, \"" + jobCategory + "\"))"