java - 在 SPARQL 查询中使用 DataTypeProperty 文字不起作用

标签 java sparql rdf jena

我正在尝试执行一个非常简单的 SPARQL 查询,以根据查询字符串中传递的姓名检索一个人的国籍,但我不明白为什么它不起作用。以下是相关的 RDF 规则....

<owl:DatatypeProperty rdf:ID="name">
<rdfs:domain rdf:resource="#NobelWinner"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
<rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string">All laureates have a name.</rdfs:comment>
</owl:DatatypeProperty>

<owl:DatatypeProperty rdf:ID="nationality">
<rdfs:domain rdf:resource="#PersonWinner"/>
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/>
<rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string">
Person laureates were associated with a nation when they won the prize.
</rdfs:comment>
</owl:DatatypeProperty>

代码在 Java servlet 中,看起来像这样,第 42 行带有 SPARQL 查询....

              try {
 34             String prefix1 = "PREFIX nob:<http://swat.cse.lehigh.edu/resources/onto/nobel.owl#> ";
 35             String prefix2 = "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> ";
 36             String prefix3 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> ";
 37             String prefix4 = "PREFIX nobdat:<http://swat.cse.lehigh.edu/resources/data/nobel/nobeldata.owl#> ";
 38             String prefix = prefix1+prefix2+prefix3+prefix4;
 39             String winnerName = request.getParameter("name");
 40
 41             // INSERT QUERY
 42             String queryString  = prefix +
 43                 "SELECT ?nat { ?s nob:name " + winnerName + ". ?s nob:nationality ?nat. }";
 44
 45             String ttlLoc = "/my/ttl/path/loc.ttl";
 47             Store store = SDBFactory.connectStore(ttlLoc);
 48             Dataset ds = DatasetStore.create(store) ;
 49
 50             // CREATE QUERY
 51             Query query = QueryFactory.create(queryString);
 52             QueryExecution qe = QueryExecutionFactory.create(query, ds);


                    while (rs.hasNext()) {
 66                     QuerySolution qs = rs.nextSolution();
 67                     String nationality = qs.getLiteral("?nat").toString();
 68                     out.println("<P>Nationality: " + nationality + "</P>");
 69                 }

我也无法获得查询或任何类似的东西,这些查询或类似的东西会使用字符串文字代替名称来在 Protege IDE 中工作。有任何想法吗?谢谢大家。

最佳答案

winnerName 需要是 SPARQL 常量,即带引号 - 您可以使用单引号:

.... ?s nob:name '" + winnerName + "' . ?s nob:nationality

使用Dataset ds = SBDFcatoryconnectDataset(ttlloc) ;

从长远来看,考虑在 ervlet 初始化时创建数据集,而不是每个请求。

关于java - 在 SPARQL 查询中使用 DataTypeProperty 文字不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727657/

相关文章:

java - 我无法访问对象属性

visualization - 优秀的 RDF 可视化工具

java - 如何从 php 页面发送一些东西到 java 应用程序?

java - Android 动画仅在第一次时有效

SPARQL 查询以获取所有患有哮喘和糖尿病的患者

sparql - 两个资源之间的路径

rdf - 哪些 RDF 模式可用于表示组件及其构成的百分比?

Java:ArrayLists 帮助、引用

java - 警告 : while trying to convert java byte[] to C unsigned char*

sparql - 使用 iSPARQL 通过相似性度量来比较值