2016-05-31 2 views
0

Я хочу определить корневые категории, соответствующие интересам пользователей. Затем мне нужно вернуть все остальные потенциальные интересы в данном корневом каталоге. Я пробовал следующий запрос, но похоже, что он входит в цикл (запрос выполняется внутри).Множественный запрос SELECT для получения всех детей данного корня

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX owl: <http://www.myweb.com/myontology.owl#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

SELECT ?user ?othercat 
WHERE 
{ 
    ?othercat rdfs:subClassOf ?root . 
    { 
     SELECT ?user ?retailcat ?root 
     WHERE { 
       ?user rdf:type owl:User . 
       ?user owl:hasUserProfile ?userprofile . 
       ?userprofile rdf:type owl:UserProfile . 
       ?userprofile owl:interestedIn ?retailcat . 
       ?entity rdf:type ?type . 
       ?type rdfs:subClassOf* ?retailcat . 
       ?retailcat rdfs:subClassOf ?root . 
     } 
    } 
} 

Действительно, когда я исполняю суб-запрос, он отлично работает, но он возвращает текущие интересы пользователя, без предоставления информации о других детей-концепций одного и того же корня.

Как решить эту проблему?

+0

Что именно вы ожидаете? можете ли вы предоставить некоторые данные rdf? –

+0

Что вы подразумеваете под «другими детьми-понятиями одного и того же корня»? Решения дочерних элементов '? Retailcat' найдены для профиля пользователя или всех категорий?? Retailcat? Или что-то другое? – scotthenninger

ответ

0

Я пробовал следующий запрос, но похоже, что он входит в цикл (запрос выполняется внутренне).

Невозможно включить запрос SPARQL в цикл. Сначала выполняются подзапросы, а затем выполняется закрытый запрос. Невозможно повторно выполнить внутреннюю часть или что-то в этом роде. (. Конечно, запрос может быть дорого и занимает много времени, но это не цикл, и по-прежнему ограничено, в принципе)

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

У вас есть одна часть вашего запроса, которая может сделать вещи довольно дорогими. У вас есть образец

?entity rdf:type ?type . 
?type rdfs:subClassOf* ?retailcat . 

где ? Субъект не подключен ни к чему другому, и не используется нигде. Это означает, что у вас будет решение подзапроса для любого возможного значения ? Entity, и это означает, что вы умножаете количество результатов на число возможных значений ? Entity.

Если я понимаю ваш запрос, вы пытаетесь перейти от интересующих категорий пользователей, до дерева категорий к некоторым корневым концепциям, а затем найти другие категории под этим корнем. Для этого вам действительно не нужен подзапрос; Вы можете сделать это с невложенных запроса:?

select ?user ?othercat { 
    ?user rdf:type owl:User . 
    ?user owl:hasUserProfile ?userprofile . 
    ?userprofile rdf:type owl:UserProfile . 
    ?userprofile owl:interestedIn ?retailcat . 
    ?retailcat rdfs:subClassOf ?root . 
    ?othercat rdfs:subClassOf ?root . 
} 

Это будет найти значения othercat, которые являются братьями и сестрами из retailcat, наряду с retailcat себя?. ? Если вы хотите, чтобы избежать retailcat, вы можете добавить

filter(?othercat != ?retailcat) 

но это не должно реально повлиять на производительность значительно; это всего лишь один результат для фильтрации.

Единственный другой фактор, который вы, возможно, захотите рассмотреть, это то, что вы на самом деле не находите «корень» дерева категорий с rdfs: subClassOf; вы просто поднимаетесь на один уровень. Например., Если дерево категорий выглядит

  • Automobile
    • SUV
    • SportsCar
      • Corvette
      • Mustang

и пользователь заинтересован в Mustang, то вы будете идти до SportsCar и найти Corvette, но вы не будете идти дальше вверх по дереву. (Если у вас есть вывод, вы можете пойти дальше по дереву, но я предполагаю на тот момент, когда вы этого не делаете.) Чтобы следить за подклассами, свяжите дерево, вы можете добавить * к пути к по цепочке:

?retailcat rdfs:subClassOf* ?root . 
?othercat rdfs:subClassOf ?root . 

Тогда вы получите все классы в дереве (за исключением самого верхнего уровня одного, Automobile).

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