java - SPARQL 的正则表达式

标签 java rdf sparql apache-jena

我已经从 dbpedia 下载了 dbpedia_quotationsbook.zip其中包含 dbpedia_quotationsbook.nt 三元组。

在这个三元组中

subject is authorname
predicate is "sameas"
object is authorcode

我已经尝试使用 JENA 查询三重存储,正在运行简单的查询。

现在我想要所有作者名与给定字符串部分匹配的作者代码。 所以我尝试了以下查询

select ?code
where
{

FILTER regex(?name, "^Rob")  <http://www.w3.org/2002/07/owl#sameAs> ?code.

}

above query should return all authorcodes whose authorname contains "Rob"

我得到以下异常

Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " "." ". "" at line 5, column 74.
Was expecting one of:
    <IRIref> ...
    <PNAME_NS> ...
    <PNAME_LN> ...
    <BLANK_NODE_LABEL> ...
    <VAR1> ...
    <VAR2> ...
    "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> ...
    "(" ...
    <NIL> ...
    "[" ...
    <ANON> ...

    at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:102)
    at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:53)
    at com.hp.hpl.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:34)
    at com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:148)
    at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:80)
    at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:53)
    at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:41)
    at rdfcreate.NewClass.query(NewClass.java:55)
    at rdfcreate.NewClass.main(NewClass.java:97)

耶拿代码

import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.tdb.TDBFactory;
import com.hp.hpl.jena.util.FileManager;

/**
 *
 * @author swapnil
 */
public class NewClass {
    String read()
        {
               final String tdbDirectory = "C:\\TDBLoadGeoCoordinatesAndLabels"; 


    String dataPath = "F:\\Swapnil Drive\\Project Stuff\\Project data 2015 16\\Freelancer\\SPARQL\\dbpedia_quotationsbook.nt";


     Model tdbModel = TDBFactory.createModel(tdbDirectory);
             /*Incrementally read data to the Model, once per run , RAM > 6 GB*/

             FileManager.get().readModel( tdbModel, dataPath, "N-TRIPLES");

             tdbModel.close();

             return tdbDirectory;
        }

       void query(String tdbDirectory, String query1)
       {


    Dataset dataset = TDBFactory.createDataset(tdbDirectory);
              Model tdb = dataset.getDefaultModel();
              Query query = QueryFactory.create(query1);
              QueryExecution qexec = QueryExecutionFactory.create(query, tdb);
              /*Execute the Query*/
                ResultSet results = qexec.execSelect();
                System.out.println(results.getRowNumber());
                while (results.hasNext()) {
                      // Do something important
                    QuerySolution qs =   results.nextSolution();
              qs.toString();
                    System.out.println("sol "+qs);
                }
                   qexec.close();
               tdb.close() ;
       }

     public static void main(String[] args) {

            NewClass nc = new NewClass();
         String tdbd=    nc.read();
          nc.query(tdbd, "select ?code\n" +
    "WHERE\n" +
    "{\n" +
    "<http://dbpedia.org/resource/Robert_H._Schuller> <http://www.w3.org/2002/07/owl#sameAs> ?code.\n" +
    "}");


       }

}

}

结果

sol ( ?code = http://quotationsbook.com/author/6523 )

上面的查询给了我给定作者的代码。

请帮帮我

最佳答案

您不能混合模式和过滤器。您必须首先使用三重模式绑定(bind)(即选择)?name,然后过滤结果。 Jena 基本上会提示,因为您的 SPARQL 语法无效。

现在,您可以运行下面的查询,但您的数据只包含 dbpedia URI 和 quotationsbook URI 之间的映射。

PREFIX owl: <http://www.w3.org/2002/07/owl#>    
select ?code
where
{
   ?author <name> ?name .
   ?author owl:sameAs ?code .

   FILTER regex(?name, "^Rob")
}

以上意思

  1. 获取作者姓名
  2. 获取作者代码
  3. 仅包括姓名与正则表达式匹配的作者
  4. 选择他们的代码

同样,这仅适用于本地可用的数据。问题是您没有实际姓名。当然,您可以将查询更改为对整个 dbpedia 标识符进行正则表达式,但这并不完美。

FILTER regex(?author, "Rob")

你能做什么,因为dbpedia资源是dereferencable , 将名称三重模式包装在 GRAPH pattern

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

select ?author ?code
where
{
   GRAPH  <file://path/to/dbpedia_quotationsbook.nt>
   {
      ?author owl:sameAs ?code .
   }

   GRAPH ?author
   {
      ?author <http://www.w3.org/2000/01/rdf-schema#label> ?name .
      FILTER regex(?name, "^Rob")
   }
}

这是发生了什么

  1. 从导入文件中获取?author?code(SPARQL GUI 导入到一个图中)
  2. ?author当作图名,这样就可以从网上下载了
  3. 获取?author?name
  4. 过滤以 Rob 开头的 ?name

根据您的 SPARQL 处理器(我使用的是 SPARQL GUI from dotNetRDF toolkit ),有两个重要的部分可以使这项工作正常进行。

这是我得到的结果的屏幕截图。请注意 dbpedia 请求的突出显示设置和 Fiddler 日志。

federated query in SPARQL GUI

底线是我刚刚给了你一个 federated SPARQL query 的例子.

关于java - SPARQL 的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174585/

相关文章:

Java Swing JSpinner 与 NumberEditor 显示空白而不是零

java - MAC 中的 TableViewer ->setWidth(0) 问题

java.lang.outofmemoryError java 内存不足错误

sparql - 在 CONSTRUCT 中跨多个解决方案生成相同的空白节点

rdf - 带片段的耶拿 RDF 资源 URI

sparql - 获取信息是dbp : . ..的

java - 耶拿 queryParseException

java - 输出文本文件中最长的单词

rdf - SPARQL strlen 显示 xs :date 的值不正确

rest - 将 HAL 词汇与 JSON-LD 结合使用