Как получить человека, который соответствует Objectproperty с Jena?

Рассмотрим следующую онтологию, где PERSON, NAME, SURNAME и IDENTIFICATION — классы. NAME и SURNAME являются подклассом IDENTIFICATION. hasSurname и hasName являются функциональными ObjectProperty. hasValue — это свойство DataTypeProperty с доменом IDENTIFICATION и строкой диапазона.

введите здесь описание изображения

Давайте сделаем автоматический экземпляр этой модели, используя jena с двумя людьми, человек 1 — «Генри Форд», а человек 2 — «Харрисон Форд».

Чтобы справиться с этим повторением, необходимо автоматически создать экземпляр онтологии в соответствии со следующей схемой, где индивидуум name1 используется как для человека1, так и для человека2.

String   NS    = .... // the name space
OntModel model = .... // Jena model to use   

// creating all the individuals with random uri

Individual person1  = model.createIndividual(NS + "PERSON" + Math.random());
Individual name1    = model.createIndividual(NS + "NAME" + Math.random());
Individual surname1 = model.createIndividual(NS + "SURNAME" + Math.random());
Individual person2  = model.createIndividual(NS + "PERSON" + Math.random());
Individual name2    = model.createIndividual(NS + "NAME" + Math.random());
Individual surname2 = model.createIndividual(NS + "SURNAME" + Math.random());

// asserting that ...
// person1 _hasName_ (name1 _hasValue_ "Ford")     
// person1 _hasSurname (surname1 _hasValue_ "Henry")

name1.addProperty(model.getOntProperty(NS + "hasValue"), Resourcefactory.createLiteral("Ford"));
surname1.addProperty(model.getOntProperty(NS + "hasValue"), Resourcefactory.createLiteral("Henry"));
model.add(person1, model.getOntProperty(NS + "hasName"), name1);
model.add(person1, model.getOntProperty(NS + "hasSurname"), surname1);


name1 = null; // loosing reference to name1

// asserting that ...
// person2 _hasName_ name1
// person2 _hasSurname (surname2 _hasValue_ "Harrison")

Как найти человека класса NAME, чье свойство hasvalue является «Фордом», чтобы правильно завершить инстанцирование?

Спасибо за любой ответ.


person Fopa Léon Constantin    schedule 30.10.2012    source источник


Ответы (1)


Концептуально, почему surname1 и surname2 должны быть разными людьми? Использование Math.random() здесь выглядит очень странно. Если вы подумаете о своей заявленной проблеме, у вас есть два человека, Генри Форд и Харрисон Форд, и в вашей модели предметной области вы хотите, чтобы имя и фамилия были отдельными людьми (я предполагаю, что у вас есть для этого веская причина, это странный способ подход к этой конкретной проблеме). Итак, вопрос, который у меня есть для вашего подхода к моделированию: существует ли одна фамилия Форд, которую разделяют оба человека, или есть две фамилии, которые имеют один и тот же литерал hasValue?

Лично я бы подошел к этому, используя общую структуру графа:

ns:ford 
  a ns:Surname ;
  ns:hasValue "Ford".

ns:harrison
  a ns:FirstName ;
  ns:hasValue "Harrison".

ns:henry
  a ns:FirstName ;
  ns:hasValue "Henry".

ns:person1
  a ns:Person ;
  ns:firstName ns:henry ;
  ns:surname ns:ford .

ns:person2
  a ns:Person ;
  ns:firstName ns:harrison ;
  ns:surname ns:ford .

Но я не знаю, какую проблему вы пытаетесь решить, поэтому я не могу сказать, подходит ли вам этот подход. Например, было бы легко найти всех людей с одинаковой фамилией.

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

ns:person1
  a ns:Person ;
  [a ns:SurName ; ns:hasValue "Ford"] ;
  [a ns:FirstName ; ns:hasValue "Henry"].

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

Чтобы ответить на ваш конкретный вопрос, если вы хотите найти конкретный ресурс на основе шаблона его свойств, я бы предложил использовать запрос SPARQL. Вы можете сделать это с помощью шаблона вызовов Jena API, но запросы SPARQL становятся намного более компактными, если вы преодолеете небольшой начальный размер шаблона.

person Ian Dickinson    schedule 31.10.2012
comment
Спасибо @Ian_Dickinson за ваш ответ. Отвечая на ваш вопрос, скажу, что хочу построить граф, на котором фамилию Форд могли бы носить многие люди. Это делается с целью уменьшения размера создаваемого файла совы. Проблема в том, как определить, есть ли уже в моей модели Jena фамилия, с которой я мог бы связать нового человека? Итак, найдите человека класса Фамилия, где его свойство имеет значение, соответствующее «форду». Если нет, я создам новую фамилию, иначе я свяжу нового человека с этой фамилией. В вашем ответе похоже, что SPARQL может помочь (как?) - person Fopa Léon Constantin; 02.11.2012
comment
Если вы внимательно посмотрите на предложенный мной код OWL, вы увидите, что есть только один узел для фамилии Форд с URI ns:ford. В модели Jena, если вы вызовете getResource(), он либо создаст новый ресурс в модели, если его там еще нет, либо повторно использует тот же ресурс, если он есть. Таким образом, вам не нужно использовать SPARQL, если вы используете один и тот же URI. Если вы используете свой URI со случайным добавленным числом, это, очевидно, не сработает. - person Ian Dickinson; 02.11.2012
comment
В моем случае у меня нет uri ресурса. Это связано с тем, что экземпляр этого ресурса был создан несколько циклов назад в коде автоматического создания экземпляра онтологии. Единственная информация, которая у меня есть о ресурсе, это то, что он имеет заданное значение свойства Ford. Поэтому меня интересует среди всех индивидуумов данного класса тот, который имеет заданное значение свойства. - person Fopa Léon Constantin; 02.11.2012
comment
В этом случае используйте SPARQL, как я предложил, или Model.listSubjectsWithProperty() - jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/rdf/ - person Ian Dickinson; 02.11.2012