GraphDB + Lucene Index: можно ли получить совпадающий предикат / литерал? - PullRequest
0 голосов
/ 18 ноября 2018

Следуя инструкциям я настроил индекс, который охватывает несколько (буквальных) предикатов:

  PREFIX luc: <http://www.ontotext.com/owlim/lucene#>
  INSERT DATA {
    luc:index             luc:setParam "uris" .
    luc:include           luc:setParam "literals" .
    luc:moleculeSize      luc:setParam "1" .
    luc:includePredicates luc:setParam "http://purl.org/dc/terms/title http://www.w3.org/2000/01/rdf-schema#label http://www.w3.org/2004/02/skos/core#prefLabel http://www.w3.org/2004/02/skos/core#altLabel" .
  }

и

PREFIX luc: <http://www.ontotext.com/owlim/lucene#>
INSERT DATA {
  luc:${Cfg.literalIndex}   luc:createIndex   "true" .
}

Эта часть работаетпросто хорошо.Теперь у меня вопрос: есть ли какой-нибудь способ получить совпадающий предикат или литерал в моем запросе SPARQL ?

Итак, предположим, что следующие данные:

:exA rdfs:label     'label' ;
     dct:title      'title' .

I 'Я хотел бы сделать что-то вроде этого

SELECT *
WHERE {
  ?needle luc:labelIndex "title" ;
          luc:predicate  ?predicate ;
          ?predicate     ?label .
}

Если что-то подобное luc:predicate существует, это может дать мне фактически сопоставленный предикат вместе со значением совпадений.Однако я даже не уверен, что Lucene индексирует предикат, который необходим для включения такой функции.

1 Ответ

0 голосов
/ 18 ноября 2018

Вы не можете сделать это эффективно с помощью старого плагина FTS Lucene. Однако Lucene Connectors легко поддерживает ваш вариант использования. Вот пример случая с некоторыми фиктивными данными:

Пример данных

<urn:a> a <http://www.w3.org/2004/02/skos/core#Concept> ;
    <http://purl.org/dc/terms/title> "title"; 
    <http://www.w3.org/2000/01/rdf-schema#label> "label" ; 
    <http://www.w3.org/2004/02/skos/core#prefLabel> "prefer label"; 
    <http://www.w3.org/2004/02/skos/core#altLabel> "alt label" .

Примечание. Соединители индексируют данные для одного rdf:type. В вашем примере, я считаю, что вы должны иметь skos:Concept.

Создание коннектора Lucene

Соединители будут индексировать для выбранного типа каждое свойство или цепочку свойств в отдельное поле Lucene.

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

INSERT DATA {
    inst:fts :createConnector '''
{
  "types": [
    "http://www.w3.org/2004/02/skos/core#Concept"
  ],
  "fields": [
    {
      "fieldName": "label",
      "propertyChain": [
        "http://www.w3.org/2000/01/rdf-schema#label"
      ]
    },
    {
      "fieldName": "prefLabel",
      "propertyChain": [
        "http://www.w3.org/2004/02/skos/core#prefLabel"
      ]
    },
    {
      "fieldName": "altLabel",
      "propertyChain": [
        "http://www.w3.org/2004/02/skos/core#altLabel"
      ]
    }
  ]
}
''' .
}

Возвращает соответствующие поля и фрагмент

PREFIX : <http://www.ontotext.com/connectors/lucene#>
PREFIX inst: <http://www.ontotext.com/connectors/lucene/instance#>
SELECT ?entity ?snippetField ?snippetText {
    ?search a inst:fts ;
            :query "label" ;
            :entities ?entity .
    ?entity :snippets _:s .
    _:s :snippetField ?snippetField ;
        :snippetText ?snippetText .
}

Где в проекции:

  • ? Entity - это ресурс RDF, которому соответствует свойство или цепочка свойств, т.е.
  • ? SnippetField - имя поля, соответствующее полнотекстовому запросу
  • ? SnippetText - это совпадающее значение фрагмента
...