Тот факт, что у вас есть только a*
слева, и b*
справа означает, что у вас есть другое условие выбора, чем просто наличие метки. Приведенные данные, как это:
@prefix : <http://example.org/>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
:a1 a :ClassA ; rdfs:label "a1" .
:a2 a :ClassA ; rdfs:label "a2" .
:b1 a :ClassB ; rdfs:label "b1" .
:b2 a :ClassB ; rdfs:label "b2" .
вы можете выбрать ?a
и ?b
по их классам (:ClassA
и :ClassB
), а затем извлекать их метки, а также, с рисунком, как:
?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .
Тогда вы можете получить {alabel} AND {blabel}
с bind
и concat
:
bind(concat("{", ?alabel, "} AND {", ?blabel, "}") as ?AandB)
С их помощью запроса как
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?AandB {
?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .
bind(concat("{", ?alabel, "} AND {", ?blabel, "}") as ?AandB)
}
получит вам вид результатов, которые вы уже можете получить:
-------------------
| AandB |
===================
| "{a2} AND {b2}" |
| "{a2} AND {b1}" |
| "{a1} AND {b2}" |
| "{a1} AND {b1}" |
-------------------
Хитрости теперь использовать group_concat
и неявную группу, чтобы объединить все эти в строка с разделителем " OR "
:
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select (group_concat(?AandB ; separator=" OR ") as ?string) where {
?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .
bind(concat("{", ?alabel, "} AND {", ?blabel, "}") as ?AandB)
}
, чтобы получить результат:
----------------------------------------------------------------------
| string |
======================================================================
| "{a2} AND {b2} OR {a2} AND {b1} OR {a1} AND {b2} OR {a1} AND {b1}" |
----------------------------------------------------------------------
Если вам нравится, вы можете даже избавиться от bind
, и просто введите выражение concat
прямо в group_concat
.Вы можете обнаружить, что легче читать (меньше прыгать) или труднее читать (большой Однострочник), но, по крайней мере, это хорошо, чтобы иметь варианты:
prefix : <http://example.org/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select (group_concat(concat("{",?alabel,"} AND {",?blabel,"}") ; separator=" OR ") as ?string) where {
?a a :ClassA ; rdfs:label ?alabel .
?b a :ClassB ; rdfs:label ?blabel .
}
Есть другие примеры group_concat
плавающих вокруг на StackOverflow которые могли бы быть полезными для вас, а также:
Я не знаю, можно ли это сделать в Прологе AllegroGraph или нет, но это может быть сделано относительно легко с 1,1 запросом SPARQL. (Это не отвечает на ваш вопрос, но я ожидаю, что AllegroGraph поддерживает SPARQL 1.1, поэтому вы можете получить этот результат с помощью AllegroGraph, будь то в Prolog или нет.) –
Спасибо. На самом деле я не мог найти способ сделать это в прологе. Думаю, мне придется вернуться к SPARQL для всего проекта. Можете ли вы объяснить, как это сделать в SPARQL, пожалуйста. – user2598997
Извините, что вы не нашли решения в Prolog, но теперь у вас есть ответ на основе SPARQL. –