Как изменить правила для вывода - PullRequest
0 голосов
/ 09 марта 2011

Я использую Eclipse с инфраструктурой Jena для разработки веб-приложения. Мое приложение выполняет следующие действия:

  1. Регистрация новых пользователей с информацией об имени, электронной почте, интересах (язык C, Java и т. Д.), Профессии, имени пользователя и пароля.

  2. Эта информация хранится в rdf-файле с именем user.rdf.

  3. С новым желаемым именем пользователя и паролем создается новая учетная запись пользователя. Вход нового пользователя открывает все соответствующие книги в базе данных в соответствии с интересами пользователя.

  4. Теперь я рекомендую новому пользователю следующее:

Если он / она интересуется языком Си, ему будут рекомендованы книги по С ++, и этот список можно будет вывести на экран.

Я знаю, что это требует механизма вывода, который нуждается в фактах и ​​правилах. Факты будут в файле rdf, который хранит интерес пользователей. Файл правил будет отображаться на основе правил, когда рекомендация будет выполнена.

У меня есть файл user.rdf со следующим содержимым.

 <rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:kb="http://protege.stanford.edu/kb#"
 xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
 <rdf:Description rdf:about="http://protege.stanford.edu/kb#Suresh">
  <rdfs:label>Suresh</rdfs:label>
 <kb:Uname>suresh</kb:Uname>
 <kb:Password>suresh</kb:Password>
 <kb:Occupation>Agent</kb:Occupation>
 <kb:Interest>Java</kb:Interest>
 <kb:Fname>Suresh</kb:Fname>
 <kb:Email>suresh_345@yahoo.co.in</kb:Email>
 <rdf:type rdf:resource="http://protege.stanford.edu/kb#USER"/>
  </rdf:Description>
 <rdf:Description rdf:about="http://protege.stanford.edu/kb#Raj">
 <kb:Email>ra@gmail.com</kb:Email>
 <kb:Name>Raj</kb:Name>
 <kb:Password>lkj</kb:Password>
 <kb:Uname>raj</kb:Uname>
 <kb:Interest>C Language</kb:Interest>
 <kb:Occupation>Student</kb:Occupation>
 </rdf:Description>
  <rdf:Description rdf:about="http://protege.stanford.edu/kb#Anvika">
  <rdfs:label>Anvika</rdfs:label>
  <kb:Uname>anu</kb:Uname>
 <kb:Password>anu</kb:Password>
 <kb:Occupation>Student</kb:Occupation>
 <kb:Interest>C Language</kb:Interest>
 <kb:Fname>Anvika</kb:Fname>
 <kb:Email>anu@gmail.com</kb:Email>
 <rdf:type rdf:resource="http://protege.stanford.edu/kb#USER"/>
 </rdf:Description>
 </rdf:RDF>

Пользователи Suresh и Anvika фактически были созданы в Protege, и затем файл будет обновлен с другими данными пользователя через приложение.

Файл test.rules имеет следующее:

   @prefix kb: http://protege.stanford.edu/kb#
 [likec++: (?s rdf:type kb:LikeC++) 
    <- 
      (?s rdf:type kb:USER)
    (?s kb:Interest ?i)
     regex(?i,'C Language')
 ]

Вывод, который приходит

<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:kb="http://protege.stanford.edu/kb#"
xmlns:j.0="http://protege.stanford.edu/kb#LikeC++"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" > 
<rdf:Description rdf:about="http://protege.stanford.edu/kb#Suresh">
<rdf:type rdf:resource="http://protege.stanford.edu/kb#USER"/>
<kb:Email>suresh_345@yahoo.co.in</kb:Email>
<kb:Fname>Suresh</kb:Fname>
<kb:Interest>Java</kb:Interest>
<kb:Occupation>Agent</kb:Occupation>
<kb:Password>suresh</kb:Password>
<kb:Uname>suresh</kb:Uname>
<rdfs:label>Suresh</rdfs:label>
</rdf:Description>
<rdf:Description rdf:about="http://protege.stanford.edu/kb#Raj">
<kb:Occupation>Student</kb:Occupation>
 <kb:Interest>C Language</kb:Interest>
 <kb:Uname>raj</kb:Uname>
  <kb:Password>lkj</kb:Password>
  <kb:Name>Raj</kb:Name>
  <kb:Email>ra@gmail.com</kb:Email>
  </rdf:Description>
  <rdf:Description rdf:about="http://protege.stanford.edu/kb#Anvika">
   <rdf:type rdf:resource="http://protege.stanford.edu/kb#USER"/>
   <kb:Email>anu@gmail.com</kb:Email>
   <kb:Fname>Anvika</kb:Fname>
   <kb:Interest>C Language</kb:Interest>
   <kb:Occupation>Student</kb:Occupation>
  <kb:Password>anu</kb:Password>
  <kb:Uname>anu</kb:Uname>
  <rdfs:label>Anvika</rdfs:label>
   <rdf:type rdf:resource="http://protege.stanford.edu/kb#LikeC++"/>
 </rdf:Description>
</rdf:RDF>

Теперь из-за линии, имеющей

  <rdf:type rdf:resource="http://protege.stanford.edu/kb#LikeC++"/>

вывод дает пользователю Anvika рекомендацию LikeC ++. Но то же самое отсутствует для пользователя Raj, который также интересуется языком Си. Я понял, что линия вызвало заражение только пользователя Anvika. Но эта строка была автоматически добавлена ​​через Protege. Моя программа этого не делает. Итак, как мне добавить эту строку через мое приложение. Если это невозможно, скажите, пожалуйста, как мне изменить правила, чтобы получить правильные результаты.

Пожалуйста, помогите мне. Я поражен этим в течение долгого времени.

1 Ответ

1 голос
/ 09 марта 2011

Ответ становится более понятным, если вы используете менее подробные записи, чем RDF / XML. После копирования файла user.rdf я сделал следующее:

java jena.rdfcat -out Turtle user.rdf

(предполагается, что у вас правильно установлена ​​переменная среды CLASSPATH). Выходные данные:

@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix kb:      <http://protege.stanford.edu/kb#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

kb:Suresh
  a       kb:USER ;
  rdfs:label "Suresh" ;
  kb:Email "suresh_345@yahoo.co.in" ;
  kb:Fname "Suresh" ;
  kb:Interest "Java" ;
  kb:Occupation "Agent" ;
  kb:Password "suresh" ;
  kb:Uname "suresh" .

kb:Raj
  kb:Email "ra@gmail.com" ;
  kb:Interest "C Language" ;
  kb:Name "Raj" ;
  kb:Occupation "Student" ;
  kb:Password "lkj" ;
  kb:Uname "raj" .

kb:Anvika
  a       kb:USER ;
  rdfs:label "Anvika" ;
  kb:Email "anu@gmail.com" ;
  kb:Fname "Anvika" ;
  kb:Interest "C Language" ;
  kb:Occupation "Student" ;
  kb:Password "anu" ;
  kb:Uname "anu" .

из которого вы можете видеть, что kb: Raj не имеет rdf:type kb:USER, следовательно, не соответствует первому пункту вашего правила.

...