【问题标题】:JenaText: working example for querying RDF filesJenaText:查询 RDF 文件的工作示例
【发布时间】:2014-03-18 11:35:08
【问题描述】:

我正在尝试为Apache Jena Text 制作官方示例以使用 rdf 文件。官方给出的例子是here

老实说,我认为文档太少,示例太笼统。它没有提供一个真正的 rdf 文件作为示例,并且有很多东西需要配置。我正在尝试分析this RDF file

--更新--

我找到了在这个问题的评论中提到的官方示例中使用的文件。

因此,我通过将原始示例与 foaf.rdf 文件混合来定义以下 ttl 文件。现在我有文件foaf.ttl:

@prefix :    <http://localhost/jena_example/#> .
@prefix dc:    <http://purl.org/dc/elements/1.1/> .
@prefix con:   <http://www.w3.org/2000/10/swap/pim/contact#> .
@prefix geo:   <http://www.w3.org/2003/01/geo/wgs84_pos#> .
@prefix foaf:  <http://xmlns.com/foaf/0.1/> .
@prefix s:     <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix cc:    <http://creativecommons.org/ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .


:T1 rdfs:label "X0 X1 X2" .
:T2 rdfs:label "X10 X11 X12" .

:B1 rdfs:label "X1" .
:B2 foaf:name "X1" .
:B3 foaf:name "Sean" .

:Sean
        a          foaf:Person ;
        foaf:name  "Sean Palmer" .


:Tim_Bray
        a          foaf:Person ;
        foaf:name  "X1" .

:me
        foaf:name  "Oshani Seneviratne" .

:John_Gage
        a          foaf:Person ;
        foaf:img   <http://upload.wikimedia.org/wikipedia/commons/d/de/John_Gage.jpg> ;
        foaf:name  "John Gage" .

因此,关于目前为止提到的原始Java文件,我在main中设置:

public static void main(String [] args){
    TextQuery.init();
    Dataset ds = createCode();
    //Dataset ds = createAssembler() ;
    loadData(ds, "foaf.ttl") ;
    queryData(ds) ;        
}

queryData 方法中我有:

             String pre = StrUtils.strjoinNL
        ( "PREFIX : <http://localhost/jena_example/#>"
        , "PREFIX dc: <http://purl.org/dc/elements/1.1/>"
        , "PREFIX con: <http://www.w3.org/2000/10/swap/pim/contact#>"
        , "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>"
        , "PREFIX foaf: <http://xmlns.com/foaf/0.1/>"
        , "PREFIX s: <http://www.w3.org/2000/01/rdf-schema#>"
        , "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
        , "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
        , "PREFIX cc: <http://creativecommons.org/ns#>"
        , "PREFIX text: <http://jena.apache.org/text#>"
        , "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>") ;       


    String qs = StrUtils.strjoinNL
        ( "SELECT * "
        , " { ?res text:query ('X*' 10) ;"
        , "      rdfs:label ?label"
        , " }") ;     

createCode() 我有:

    // Define the index mapping 
    EntityDefinition entDef = new EntityDefinition("uri", "text", RDFS.label.asNode()) ;

结果是:

-----------------------
| res | label         |
=======================
| :T1 | "X0 X1 X2"    |
| :T2 | "X10 X11 X12" |
| :B1 | "X1"          |
-----------------------

但是,我报告说 X1 也包含在三元组中:

:B2 foaf:name "X1" .

B2 不在结果集中。有人可能会说:“你必须定义一个索引”。嗯,很奇怪的是,如果我设置在createCode():

    // Define the index mapping 
    EntityDefinition entDef = new EntityDefinition("blablabla", "blablabla", RDFS.label.asNode()) ;

结果不变!

那么,EntityDefinition 的作用是什么? 我做错了什么?

【问题讨论】:

  • 您正在搜索字符串'Text*'。我不确定如何处理正则表达式,但是当我查看您加载的the file 时,我什至没有看到字符串Text 的任何出现。你为什么期待结果?我确实看到了 foaf:name 的值 Dean Jackson 的值。 ?about text:query ('Dean' 20) 得到结果了吗?
  • 对不起,我最初是准备一个带有通用 RDF 文件的通用示例,但后来我决定放真正的代码。我更新问题!感谢您指出!
  • 好的,里面还有Johns。如果不使用 * 进行搜索,您会得到什么?
  • 此外,由于似乎需要提前提供一些configuration,如果您希望获得有用的回复,您可能也需要提供这些信息。这里还不足以重现您所看到的问题。
  • 顺便说一句,我同意此组件的文档有些薄弱,我已提交 JENA-644 以跟踪改进

标签: java rdf jena text-search


【解决方案1】:

您的问题主要归结于您的实体定义 AFAICT,我相当确定您使用的实体定义您的文本索引将为空。如果您使用过基于磁盘的 Lucene 索引,则可以使用 Luke 之类的工具来确认这一点。

你的实体定义如下:

EntityDefinition entDef = new EntityDefinition("rdf:about", "rdf:resource", RDFS.label.asNode()) ;

这在几个方面存在问题:

  1. entityField(第一个参数)不能使用前缀名称,需要使用完整的 URI
  2. rdf:about 不是真正的 URI,它是 RDF/XML 的语法细节,因此索引它总是不会索引任何内容

还需要注意的是,您显示的是不完整的代码,它仅与访问现有文本索引有关。没有什么可以显示您是否以及如何实际索引 RDF 中的文本。

【讨论】:

  • 我不知道!如果我设置EntityDefinition entDef = new EntityDefinition("http://www.w3.org/1999/02/22-rdf-syntax-ns#resource", "http://www.w3.org/1999/02/22-rdf-syntax-ns#about", RDFS.label.asNode()); 也是一样的
  • 正如我在回答中指出的那样,您的问题不完整,无论实体定义如何,都不清楚您是否实际创建了有效的文本索引以及是否已将其连接到查询数据集.如需进一步帮助,请提供完整示例
  • 我明白了!我没有创建任何索引!我只是按照官方文档中提供的唯一示例中的报告,即文件JenaTextExample1.java。在那里,没有报告索引。
  • 我更新了示例,以便人们可以在家中重复实验
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多