在GraphDB的Lucene连接器中使用通配符

时间:2018-06-25 12:00:51

标签: lucene wildcard graphdb

我正在使用GraphDB的Lucene connectors。我在三元组存储中为实体代码建立了索引my_index,我想使用这样的索引进行子字符串匹配。

示例。

实体代码:

FooBar
FooBaz
BazFoo

Lucene连接器:

PREFIX :<http://www.ontotext.com/connectors/lucene#>
PREFIX inst:<http://www.ontotext.com/connectors/lucene/instance#>
INSERT DATA {
    inst:my_index :createConnector '''
{
  "fields": [
    {
      "fieldName": "code",
      "propertyChain": [
        "http://foo#identifier"
      ],
      "indexed": true,
      "stored": true,
      "analyzed": true,
      "multivalued": true,
      "facet": true
    }
  ],
  "types": [
    http://foo#MyType"
  ],
  "stripMarkup": false
}
''' .
}

SPARQL查询利用Lucene连接器:

PREFIX : <http://www.ontotext.com/connectors/lucene#>
PREFIX inst: <http://www.ontotext.com/connectors/lucene/instance#>

SELECT ?entity {
  ?search a inst:my_index ;
      :query "code:Foo*" ;
      :entities ?entity .
}

我想获取所有以Foo(即FooBarFooBaz)开头的代码的实体,但我得到的是空结果集。

我如何获得它们?

编辑:

在试用了Vassil的answer中的示例之后,我发现问题可能与区分大小写有关。

行为:

  • :query "label:Foo*"不返回

  • :query "label:foo*"返回FooBarFooBaz

1 个答案:

答案 0 :(得分:2)

默认情况下,前缀搜索应该可以直接使用。我怀疑您的查询还有另一个问题。如果使用:query "*:*"搜索所有可能的值,将会发生什么?

这是要检查并与您的数据集重复的测试用例。

生成样本虚拟数据

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
INSERT DATA
{
    <urn:1> a <urn:type>;
        rdfs:label "FooBar".
    <urn:2> a <urn:type>;
        rdfs:label "FooBaz".
    <urn:3> a <urn:type>;
        rdfs:label "BazFoo".
}

您还需要为每个RDF资源定义rdf:type语句。

创建Lucene连接器

PREFIX :<http://www.ontotext.com/connectors/lucene#>
PREFIX inst:<http://www.ontotext.com/connectors/lucene/instance#>
INSERT DATA {
    inst:my_index :createConnector '''
{
  "fields": [
    {
      "fieldName": "label",
      "propertyChain": [
        "http://www.w3.org/2000/01/rdf-schema#label"
      ],
      "indexed": true,
      "stored": true,
      "analyzed": true,
      "multivalued": true,
      "facet": true
    }
  ],
  "types": [
    "urn:type"
  ],
  "stripMarkup": false
}
''' .
}

连接器将为所有rdfs:label类的所有urn:type索引。

测试前缀搜索

PREFIX : <http://www.ontotext.com/connectors/lucene#>
PREFIX inst: <http://www.ontotext.com/connectors/lucene/instance#>

SELECT ?entity {
  ?search a inst:my_index ;
      :query "label:Foo*" ;
      :entities ?entity .
}

数据库返回urn:1urn:2