Это последний вопрос по моему последнему, так как я до сих пор борюсь с этой темой ... Мне нужно выбрать некоторые темы из моей модели, соответствующие конкретным требованиям.Как выбрать объекты с определенными свойствами из RDF с Jena?
Если я перечислю свои заявления (это только короткая часть продукции), я получаю что-то вроде этого:
WorkOrder2 hasType Workorder .
WorkOrder2 hasResult Fuselage22 .
WorkOrder2 type NamedIndividual .
Теперь я хотел бы, чтобы выбрать и перебирать thourgh всех предметов, которые hasType Workorder
. Моя идея была что-то вроде этого:
public static ArrayList<String> listAllWorkorders(Model model) {
ArrayList<String> workorders = new ArrayList<String>();
// list of all work orders associated with given fuselage and work
// station
ResIterator it = model.listSubjectsWithProperty(
ResourceFactory.createProperty(ArumCorePrefix + "hasType"), ArumCorePrefix + "Workorder");
while (it.hasNext()) {
Resource r = it.next();
String workorder = trimPrefix(r.toString());
workorders.add(workorder);
}
// sort the result alphabetically
Collections.sort(workorders);
return workorders;
}
Однако, он не возвращает ничего ... Если я использую listSubjectsWithProperty
без второго аргумента (String), он работает, но возвращает не только Workorders, но некоторые вещи toher с hasType
собственности , чего я не хочу. Что не так с моим кодом! Могу ли я использовать что-то вроде этого и заставить его работать? Dont беспокоиться о static
использования этой функции (я буду заботиться о этом, не изящным способом, как только я udnerstand, что случилось.)
Кроме того, я хотел бы реализовать некоторые более compelx фильтрации - например выбор предметов с несколькими свойствами, которые все должны соответствовать, чтобы их вернуть, например hasType Workorder, hasResult someResult, inStation station
и т. д. Поддерживает ли Jena что-то вроде этого! Если нет, то какой общий подход?
Спасибо за любые советы!
И последующее: Как проверить, присутствует ли какое-либо утверждение в моей модели? Я знаю, что существует метод model.contains(Statements s)
, но мне нужно создать оператор в аргументе в roder для вызова этого метода? Разве нет более элегантного способа, как model.contains(Resource r, Property p, Resource o)
?
Спасибо за ваш ответ, но у меня все еще есть проблема: когда я вызываю model.contains (wororder, hasResult, NS + "fuselage22") ;, он говорит false, и я не знаю, почему .. resource.has (свойство p) тоже не работает, даже несмотря на то, что сателлиты там нет ... – Smajl
Существует разница между 'NS + 'fuselage22" ', которая является строкой, и' model.getResource (NS + "fuselage22") ', которая создает ресурс. Операторы, которые содержат модель (в данном случае), имеют _resources_ как свои объекты, а не строки. Вот почему я сделал, например, «окончательный ресурс workOrder2 = model.getResource (NS +« WorkOrder2 »);'. Вам нужно сделать «final Resource fuselage22 = model.getResource (NS +« fuselage22 »);'. –