0

我有一个 RDF 三元组数据库,大致如下:keyword002 isKeywordIn doc0892 keyword002 短语“thisIsATest”

我有一个关键字列表,我想在一个查询中找到匹配项,例如,假设我有 10 个文档,并且我想知道(对于每个文档)关键字“testing3”、“ fubared","noob" 在文档中。

我可以构造什么 SPARQL 查询以便我可以指定一个确切单词的列表(我尝试了一个正则表达式过滤器,但似乎没有用。也给了我部分匹配项,但没有给我文档名称)并取回包含文档的名称和匹配的关键字?

我已经坚持了好几天了,我让它工作,但它是通过几个递归循环并且需要很长时间,我需要大幅加快速度。

* *我的服务器已关闭,所以我现在无法访问我的 Triplestore,但感谢你们的回复!有什么问题我会再发帖,非常感谢!

4

2 回答 2

3

未经测试,但一种方法是:

select distinct ?keyword ?document
where {
  ?keyword ns:isKeywordIn ?document;
           ns:phrase ?phrase.
  FILTER regex( ?phrase, "^(testing3|n00b|fubared)$", "i" )
}

这将为您提供一对文档和关键字,其中关键字匹配任何一种用户输入模式。请注意^ ... $锚点的使用,以便您只获得完整的单词匹配,而不是部分匹配。但是,这可能会很慢,因为没有太多独特的信息可以用来索引查询,因此查询引擎必须测试语料库中的每个关键字。

另一种方法是联合多个关键字的测试:

select distinct ?keyword ?document
where {
  {?keyword ns:phrase "testing3" ; ns:isKeywordIn ?document}
  union
  {?keyword ns:phrase "n00b" ; ns:isKeywordIn ?document}
  union
  {?keyword ns:phrase "fubared" ; ns:isKeywordIn ?document}
}

一个合理的查询优化器应该能够使用更具体的:phrase三元组来索引查询。但是,构造查询稍微复杂一些。另一个缺点是您没有"i"与正则表达式示例中的忽略大小写 ( ) 标志等效的标志,因此您的用户输入必须与您的关键字文本完全匹配。

最后一种替代方法是使用 SPARQL 扩展来利用三元存储旁边的自由文本索引。例如,对于 Jena,请参阅LARQ

于 2012-07-23T17:30:09.167 回答
2

通常,您应该避免在 SPARQL 查询中使用正则表达式。SPARQL 引擎通常不会很好地处理这个问题。那些确实提供了对文字值进行正则表达式或关键字类型搜索的特定功能,通常基于特殊的 Lucene 索引。通常,正则表达式最终只会对任何相关的字面值进行大量正则表达式,这可能非常昂贵。

这应该返回带有关键字“testing3”的文档

select ?doc ?name where {
  ?doc :name ?name .
  ?keyword :isKeywordIn ?doc .
  ?keyword :phrase "testing3" .
}

如果要获取包含两个特定关键字的所有文档:

select ?doc ?name where {
  ?doc :name ?name .
  ?keyword :isKeywordIn ?doc .
  ?keyword :phrase "testing3" .
  ?kw :isKeywordIn ?doc .
  ?kw :phrase "noob" .
}

如果要获取两个特定关键字中的任何一个的所有文档:

select distinct ?doc ?name where { 
  ?doc :name ?name .
  {
    ?keyword :isKeywordIn ?doc .
    ?keyword :phrase "testing3" .
  } union {
    ?kw :isKeywordIn ?doc .
    ?kw :phrase "noob" .
  } 
  }

我认为这会让你想要你正在寻找的,拼写错误和你的领域本体的精确使用无法承受。

于 2012-07-23T17:22:51.583 回答