2015-11-30 3 views
2

У меня есть такой запрос:SPARQL: запрос для получения полного списка

CONSTRUCT { 
    ?p a :IndContainer . 
    ?p :contains ?ind . 
} WHERE{ 
    :ClassContainer_1 :contains ?class . 
    ?ind a ?class . 
    BIND (IRI(...) AS ?p) . 
} 

Индивид ClassContainer_1 относится к некоторым классам. Я получаю эти классы и пытаюсь найти людей для этих классов. Затем я пытаюсь создать IndContainer, который должен хранить найденных лиц (точки используются только для упрощения). Итак, я хочу:

  1. Создать особь IndContainer только тогда, когда отдельные лица для всех привязок ?class были найдены;
  2. Создайте индивидуумов IndContainer для всех возможных наборов физических лиц от ?ind (то есть, когда некоторые из ?class имеют нумер отдельных лиц).

Возможно ли создать такой запрос SPARQL? Или нужно использовать какой-то механизм правил?

EDIT (добавить иллюстрации): Положительный пример. Есть:

test:ClassContainer_1 
    rdf:type test:ClassContainer ; 
    test:contains test:Type1 ; 
    test:contains test:Type2 ; 
. 
test:Type1_1 
    rdf:type test:Type1 ; 
. 
test:Type1_2 
    rdf:type test:Type1 ; 
. 
test:Type2_1 
    rdf:type test:Type2 ; 
. 

Хочет получить:

test:IndContainer_1 
    rdf:type test:IndContainer ; 
    test:contains test:Type1_1 ; 
    test:contains test:Type2_1 ; 
. 
test:IndContainer_2 
    rdf:type test:IndContainer ; 
    test:contains test:Type1_2 ; 
    test:contains test:Type2_1 ; 
. 

Отрицательного пример: такие же, как положительное исключения того, что нет особого класса Type2 и поэтому не индивидуумы IndContainer должны быть сгенерированы.

EDIT 2 (проблема проблемы): Мы можем рассмотреть эту проблему с точки зрения составления комбинации. У нас есть две позиции (в моем примере) в каждой комбинации. Количество позиций определяется количеством классов, от которых зависит ClassContainer. Каждая позиция должна быть заполнена одним человеком класса, который соответствует этой позиции. Поэтому в моем примере первая позиция должна быть заполнена одним человеком из класса Type1, вторая - с классом Type2 (но порядок не имеет значения). У нас есть два человека для первого класса и один человек для второго класса. Чтобы получить количество комбинаций, мы можем использовать правило произведения из комбинаторики - 2 * 1 = 2, т. Е. {Type1_1, Type2_1} - первая комбинация, а {Type1_2, Type2_1} - вторая комбинация. Для каждой комбинации необходимо сформировать IndContainer человек.

+0

Можете ли вы показать пример данных, которые у вас есть и данные, которые вы хотите, чтобы ваша конструкция запроса для возврата. Не совсем понятно, что вы хотите. Я думаю, что это возможно, используя SPARQL. –

+0

Добавить иллюстрации для положительных и отрицательных случаев. – DrDecay

+0

Просто заметьте, если вы поместите «@» в свой комментарий, человек получит уведомление.Я не получил предупреждения о вашем комментарии, но был бы, если бы включил в него «@JoshuaTaylor». –

ответ

2

Если я правильно понял ваш вопрос, вам нужен «контейнер» для каждого класса, который содержится в «контейнере класса», который содержит лиц, принадлежащих этому классу. Это не так сложно сделать, если вы можете построить IRI контейнера из IRI класса. Вот некоторые выборочные данные с двух классов А и В, а также несколько примеров (некоторые просто А, некоторые просто B, и некоторые из А и В):

@prefix : <urn:ex:> . 

:container a :ClassContainer ; 
      :contains :A, :B . 

:w a :A .  # an :A 
:x a :A .  # another :A 
:y a :B .  # a :B 
:z a :A, :B . # both an :A and a :B 

Вы запрос является уже довольно близко. Вот один, который работает вместе со своим результатом:

prefix : <urn:ex:> 

construct { 
    ?indContainer a :IndContainer ; 
       :contains ?ind . 
} 
where { 
    :container a :ClassContainer ; 
      :contains ?class . 
    ?ind a ?class . 
    bind(IRI(concat(str(?class),"-container")) as ?indContainer) 
} 
@prefix :  <urn:ex:> . 

:B-container a :IndContainer ; 
     :contains :y , :z . 

:A-container a :IndContainer ; 
     :contains :w , :x , :z . 
+0

В этом случае мы должны иметь 6 комбинаций: {w, y}, {w, z}, {x, y}, {x, z}, {z, y}, {z, z}. Хотя я не рассматриваю случаи с множественным наследованием. – DrDecay

+0

Ах, поэтому, учитывая список классов X, Y и Z, вы ищете всех членов декартова произведения X x Y x ZEg, если в списке есть Dog, Cat, где Dog = {d1, d2} и Cat = {c1, c2, c3}, вам нужно 6 контейнеров, верно? Вы бы хотели: {d1, c1}, {d1, c2}, {d1, c3}, {d2, c1}, {d2, c2}, {d2, c3}? Это будет сложнее; Я не уверен, возможно ли это или нет. –

+0

Да, это правильно. Боюсь, что нужно будет использовать какой-то механизм вывода. Я считаю, что BasVisor и SWI proog являются вариантом. В любом случае, спасибо за внимание. – DrDecay

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