我正在使用Eclipse和Jena框架来开发Web应用程序。我的申请执行以下操作:
使用姓名,电子邮件,兴趣(C语言,Java等),职业,用户名和密码等信息注册新用户。
此信息存储在名为user.rdf的rdf文件中。
使用新的所需用户名和密码,将创建一个新的用户帐户。新用户的登录将根据用户的兴趣打开数据库中的所有相关书籍。
现在我需要向新用户推荐以下内容:
如果他/她对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自动添加的。我的程序不这样做。那么如何在我的应用程序中添加该行。如果无法做到这一点,请告诉我如何更改规则以推断出正确的结果。
请帮帮我。我很震惊这一点。
答案 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
,因此你的规则的第一个条款失败了。