【问题标题】:How to change the rules for inference如何更改推理规则
【发布时间】:2011-03-09 04:57:08
【问题描述】:

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

  1. 注册新用户,填写姓名、邮箱、兴趣(C语言、Java等)、职业、用户名和密码。

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

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

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

如果他/她对 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++"/>

inference 为用户 Anvika 推荐 LikeC++。但是对于同样对 C 语言感兴趣的用户 Raj 来说也是如此。我明白这条线 已导致仅推断用户 Anvika。但是这条线是通过 Protege 自动添加的。我的程序不这样做。那么如何通过我的应用程序添加该行。如果这不可能,请告诉我如何更改规则以推断出正确的结果。

请帮助我。我被这件事震惊了很长时间。

【问题讨论】:

    标签: jena inference jena-rules


    【解决方案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,因此您的规则的第一个子句失败了。

    【讨论】:

    • 是的,我已经编辑了规则,现在它正在工作。非常感谢。
    • 点击左边的绿色大勾号。如果您将鼠标悬停在它上面,它将向您显示一个带有说明的工具提示。您还可以使用每个问题上的两个三角形按钮对您认为有帮助的答案进行投票或否决。提供此类反馈是 StackOverflow 工作的一部分:其他人将来更有可能找到好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2016-05-06
    相关资源
    最近更新 更多