2013-09-20 3 views
1

У меня есть файл RDF, и мне нужно извлечь некоторую информацию из него в одной строке.Могу ли я сделать это в прологе AllegroGraph?

Теперь я использую AllegroGraph с Пролога Engin запроса:

(select (?result) 
     (q ?a !rdfs:label ?alabel) 
     (q ?b !rdfs:label ?blabel) 
     (lisp ?result (string+ ?alabel " AND " ?blabel))) 

, чтобы получить результаты в одной строке:

"{a1} AND {b1}" 
"{a1} AND {b2}" 
"{a2} AND {b1}" 
"{a2} AND {b2}" 

Теперь мне нужно сгруппировать все строки? в результате получается одна строка со строкой «OR». так что я получаю:

"{a1} AND {b1} OR {a1} AND {b2} OR {a2} AND {b1} OR {a2} AND {b2}" 

Есть ли какая-нибудь функция в прологе?

+0

Я не знаю, можно ли это сделать в Прологе AllegroGraph или нет, но это может быть сделано относительно легко с 1,1 запросом SPARQL. (Это не отвечает на ваш вопрос, но я ожидаю, что AllegroGraph поддерживает SPARQL 1.1, поэтому вы можете получить этот результат с помощью AllegroGraph, будь то в Prolog или нет.) –

+0

Спасибо. На самом деле я не мог найти способ сделать это в прологе. Думаю, мне придется вернуться к SPARQL для всего проекта. Можете ли вы объяснить, как это сделать в SPARQL, пожалуйста. – user2598997

+0

Извините, что вы не нашли решения в Prolog, но теперь у вас есть ответ на основе SPARQL. –

ответ

2

Тот факт, что у вас есть только 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 которые могли бы быть полезными для вас, а также:

+0

Спасибо. Этот ответ сработал для меня. – user2598997

Смежные вопросы