Я пробовал следующий запрос, но похоже, что он входит в цикл (запрос выполняется внутренне).
Невозможно включить запрос 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; вы просто поднимаетесь на один уровень. Например., Если дерево категорий выглядит
и пользователь заинтересован в Mustang, то вы будете идти до SportsCar и найти Corvette, но вы не будете идти дальше вверх по дереву. (Если у вас есть вывод, вы можете пойти дальше по дереву, но я предполагаю на тот момент, когда вы этого не делаете.) Чтобы следить за подклассами, свяжите дерево, вы можете добавить * к пути к по цепочке:
?retailcat rdfs:subClassOf* ?root .
?othercat rdfs:subClassOf ?root .
Тогда вы получите все классы в дереве (за исключением самого верхнего уровня одного, Automobile).
Что именно вы ожидаете? можете ли вы предоставить некоторые данные rdf? –
Что вы подразумеваете под «другими детьми-понятиями одного и того же корня»? Решения дочерних элементов '? Retailcat' найдены для профиля пользователя или всех категорий?? Retailcat? Или что-то другое? – scotthenninger