SPARQL выбрать в зависимости от содержания темы - PullRequest
1 голос
/ 26 апреля 2019

Я новичок в SPARQL и пытаюсь выбрать свойство на основе содержимого темы.Например, используя приведенные ниже данные RDF, я хочу вернуть результат, содержащий «var2_1»:

<rdf:Description rdf:about="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var0">
    <rdf:type rdf:resource="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var2_0"/>
</rdf:Description>
<rdf:Description rdf:about="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1">
    <rdf:type rdf:resource="http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var2_1"/>
</rdf:Description>

Это запрос, который я пишу, но он ничего не возвращает, и я не могу найтиспособ указать, что тема должна содержать «var1»:

SELECT ?t 
WHERE {
   ?s rdf:type ?t
   FILTER regex(?s, "var1")
}

Я был бы признателен за помощь в правильном способе сделать это.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

В другом ответе уже указывалось, что ваш ?s является URI, и его следует сопоставлять напрямую, а не с помощью регулярного выражения.Кроме того, стоит помнить, что сопоставление определенных URI становится намного проще, если у вас определены правильные префиксы.Если мы определим префикс для URI файла, то фактический шаблон запроса станет намного проще:

PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>
SELECT ?t 
WHERE {
   fred:var1 rdf:type ?t
}

Запрос может стать еще проще: rdf:type имеет встроенную аббревиатуру «a»,и ключевое слово WHERE является необязательным:

PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>
SELECT ?t {
   fred:var1 a ?t
}

Наконец, если вы действительно хотите использовать регулярное выражение для сопоставления с URI, вы можете сделать это, преобразовав URI встрока, использующая str:

SELECT ?t {
   ?s a ?t
   FILTER regex(str(?s), "var1")
}

Но по сравнению с другими параметрами это будет очень медленно для больших наборов данных.

Наконец, наконец, для поддержки комментария AKSW, вот преобразованный файлиз RDF / XML в Turtle:

PREFIX fred: <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#>

fred:var0 a fred:var2_0.
fred:var1 a fred:var2_1.
2 голосов
/ 26 апреля 2019

Предметом является не строковое литеральное значение, а IRI: http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1.Чтобы соответствовать этому, вы не должны использовать регулярное выражение, а вместо этого использовать сам фактический IRI:

SELECT ?t 
WHERE {
  ?s rdf:type ?t
  FILTER(?s =  <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1>)
}

или более краткий:

SELECT ?t 
WHERE {
   <http://www.ontologydesignpatterns.org/ont/fred/domain.owl#var1> rdf:type ?t
}
...