如何更改推理规则

时间:2011-03-09 04:57:09

标签: jena inference jena-rules

我正在使用Eclipse和Jena框架来开发Web应用程序。我的申请执行以下操作:

  1. 使用姓名,电子邮件,兴趣(C语言,Java等),职业,用户名和密码等信息注册新用户。

  2. 此信息存储在名为user.rdf的rdf文件中。

  3. 使用新的所需用户名和密码,将创建一个新的用户帐户。新用户的登录将根据用户的兴趣打开数据库中的所有相关书籍。

  4. 现在我需要向新用户推荐以下内容:

  5. 如果他/她对C语言感兴趣,那么将向他推荐C ++书籍,并且列表可以填充到屏幕上。

    我知道这需要一个需要事实和规则的推理引擎。事实将在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 ++的推荐。但对于同样对C语言感兴趣的用户Raj也缺少相同的内容。我明白了这一行 导致只有用户Anvika被感染。但这条线是通过Protege自动添加的。我的程序不这样做。那么如何在我的应用程序中添加该行。如果无法做到这一点,请告诉我如何更改规则以推断出正确的结果。

    请帮帮我。我很震惊这一点。

1 个答案:

答案 0 :(得分:1)

如果使用比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,因此你的规则的第一个条款失败了。