- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我成功地使用 Jena API 和 Eclipse 创建、修改、合并本体。我还在 Eclipse 中成功启动了 OWL 推理器和 Pellet 推理器。
现在我想了解如何使用 Jena API 在 Eclipse 中编写简单的规则以及是否有一种或多种方法可以执行此操作。
例如,在 Protégé 中,我曾经在 SWRL 中编写这样的规则,以计算三角形分布的平均值:
TriangularDistribution(?t), hasLowerLimit(?t,?a), hasUpperLimit(?t,?c), hasMode(?t,?b), add(?ab, ?a, ?b), add(?abc, ?ab, ?c), divide(?m, ?abc, 3) -> hasMean(?t, ?m)
如何使用 Jena 翻译它?
========升级========
为了更好地理解如何在耶拿创建规则,我按照 https://jena.apache.org/documentation/inference/#RULEexamples 中的示例进行操作。
我创建了三个文件:第一个是“ReasoningJena.java”
package test01;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.reasoner.*;
import com.hp.hpl.jena.reasoner.rulesys.*;
import com.hp.hpl.jena.vocabulary.ReasonerVocabulary;
import com.hp.hpl.jena.util.*;
import java.io.*;
public class ReasoningJena {
private static Model reason(Model input) {
// Register a namespace to be used in the rules
String flUri = "http://www.snee.com/ns/demo#";
PrintUtil.registerPrefix("fl", flUri);
// Create an (RDF) specification of a hybrid reasoner which loads its rules from an external file.
Model m = ModelFactory.createDefaultModel();
Resource configuration = m.createResource();
configuration.addProperty(ReasonerVocabulary.PROPruleMode, "hybrid");
configuration.addProperty(ReasonerVocabulary.PROPruleSet, "C:/Users/pecore/Desktop/file.rules");
// Create an instance of such a reasoner
Reasoner reasoner = GenericRuleReasonerFactory.theInstance().create(configuration);
// Infere new knowledge on the input model, generating a new one
InfModel infmodel = ModelFactory.createInfModel(reasoner, input);
return infmodel;
}
private static Model readModelFromFile(String filePath) throws Exception {
// Create an empty model
Model model = ModelFactory.createDefaultModel();
// Use the FileManager to find the input file
InputStream in = new FileInputStream(new File(filePath));
// Read the RDF/XML file
model.read(in, "");
return model;
}
public static void main(String[] args){
try {
Model model = readModelFromFile("C:/Users/pecore/Desktop/demoData.rdf");
System.out.println("The model has " + model.size() + " statements");
// Do the reasoning
model = reason(model);
System.out.println("After inferencing the model has " + model.size() + " statements");
}
catch(Exception e) {
e.printStackTrace();
}
}
}
rdf 文件是:“demoData.rdf”
<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
<!ENTITY rdf 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
<!ENTITY rdfs 'http://www.w3.org/2000/01/rdf-schema#'>
<!ENTITY demo 'http://jena.hpl.hp.com/demo#'>
]>
<rdf:RDF xmlns:rdf="&rdf;"
xmlns:rdfs="&rdfs;"
xmlns:demo="&demo;"
xmlns="&demo;"
>
<demo:TransProp rdf:about="&demo;p" />
<rdf:Description rdf:about="&demo;a">
<p rdf:resource="&demo;b" />
</rdf:Description>
<rdf:Description rdf:about="&demo;c">
<p rdf:resource="&demo;a" />
</rdf:Description>
<rdf:Description rdf:about="&demo;b">
<p rdf:resource="&demo;d" />
</rdf:Description>
</rdf:RDF>
规则文件是:“file.rules”
@prefix = "http://www.snee.com/ns/demo#";
[transitiveRule: (?A demo:p ?B), (?B demo:p ?C) -> (?A > demo:p ?C) ];
我在 Eclipse SW 版本中运行所有内容:Luna Service Release 2 (4.4.2) 和 JDK 1.7我得到了这些错误:
log4j:WARN No appenders could be found for logger (org.apache.jena.riot.system.stream.JenaIOEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
The model has 4 statements
com.hp.hpl.jena.shared.PrefixMapping$IllegalPrefixException: =
at com.hp.hpl.jena.shared.impl.PrefixMappingImpl.checkLegal(PrefixMappingImpl.java:157)
at com.hp.hpl.jena.shared.impl.PrefixMappingImpl.setNsPrefix(PrefixMappingImpl.java:67)
at com.hp.hpl.jena.shared.impl.PrefixMappingImpl.setNsPrefixes(PrefixMappingImpl.java:147)
at com.hp.hpl.jena.reasoner.rulesys.Rule$Parser.registerPrefixMap(Rule.java:716)
at com.hp.hpl.jena.reasoner.rulesys.Rule.rulesParserFromReader(Rule.java:567)
at com.hp.hpl.jena.reasoner.rulesys.Util.loadRuleParserFromResourceFile(Util.java:264)
at com.hp.hpl.jena.reasoner.rulesys.FBRuleReasoner.loadRules(FBRuleReasoner.java:270)
at com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner.doSetParameter(GenericRuleReasoner.java:301)
at com.hp.hpl.jena.reasoner.rulesys.FBRuleReasoner.doSetRDFNodeParameter(FBRuleReasoner.java:370)
at com.hp.hpl.jena.reasoner.rulesys.FBRuleReasoner.loadConfiguration(FBRuleReasoner.java:101)
at com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasoner.<init>(GenericRuleReasoner.java:96)
at com.hp.hpl.jena.reasoner.rulesys.GenericRuleReasonerFactory.create(GenericRuleReasonerFactory.java:56)
at test01.ReasoningJena.reason(ReasoningJena.java:24)
at test01.ReasoningJena.main(ReasoningJena.java:55)
为什么?
============更新2============我对“file.rules”内部代码进行了一些更改,将其更正为:
@prefix demo: <http://domain/demo#>.
[transitiveRule: (?A demo:p ?B), (?B demo:p ?C) -> (?A > demo:p ?C) ]
我得到了这个错误代码:
log4j:WARN No appenders could be found for logger (org.apache.jena.riot.system.stream.JenaIOEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
org.apache.jena.riot.RiotException: [line: 1, col: 8 ] The processing instruction target matching "[xX][mM][lL]" is not allowed.
at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:136)
at org.apache.jena.riot.lang.LangRDFXML$ErrorHandlerBridge.fatalError(LangRDFXML.java:253)
at com.hp.hpl.jena.rdfxml.xmlinput.impl.ARPSaxErrorHandler.fatalError(ARPSaxErrorHandler.java:48)
at com.hp.hpl.jena.rdfxml.xmlinput.impl.XMLHandler.warning(XMLHandler.java:200)
at com.hp.hpl.jena.rdfxml.xmlinput.impl.XMLHandler.fatalError(XMLHandler.java:230)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.scanPIData(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanPIData(Unknown Source)
at org.apache.xerces.impl.XMLScanner.scanPI(Unknown Source)
at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at com.hp.hpl.jena.rdfxml.xmlinput.impl.RDFXMLParser.parse(RDFXMLParser.java:151)
at com.hp.hpl.jena.rdfxml.xmlinput.ARP.load(ARP.java:119)
at org.apache.jena.riot.lang.LangRDFXML.parse(LangRDFXML.java:143)
at org.apache.jena.riot.RDFParserRegistry$ReaderRIOTLang.read(RDFParserRegistry.java:185)
at org.apache.jena.riot.RDFDataMgr.process(RDFDataMgr.java:906)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:257)
at org.apache.jena.riot.RDFDataMgr.read(RDFDataMgr.java:243)
at org.apache.jena.riot.adapters.RDFReaderRIOT_Web.read(RDFReaderRIOT_Web.java:62)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:247)
at zero.readModelFromFile(zero.java:40)
at zero.main(zero.java:50)
最佳答案
这里有几个不同的问题。 Stack Overflow 和其他地方有很多关于如何编写 Jena 规则的示例,因此我认为这里的关键问题是如何重写这个特定的 SWRL 规则。如果您没有表现出任何尝试,我们不知道您遇到了什么问题,但我认为 SWRL 规则如下:
TriangularDistribution(?t), hasLowerLimit(?t,?a), hasUpperLimit(?t,?c), hasMode(?t,?b), add(?ab, ?a, ?b), add(?abc, ?ab, ?c), divide(?m, ?abc, 3) → hasMean(?t, ?m)
会简单地变成这样:
@prefix : <...>
[(?x rdf:type TriangularDistribution)
(?t :hasLowerLimit ?a)
(?t :hasUpperLimit ?c)
(?t :hasMode ?b)
sum(?a, ?b, ?ab)
add(?ab, ?c, ?abc)
quotient(?abc, 3, ?m)
->
(?t :hasMean ?m)]
我不记得耶拿的数学内置函数,所以我查看了 builtin primitives 的列表.
关于java - Jena API规则测试: how many and what are the methods to write rules in Jena?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30455253/
我正在执行 UPDATE .WRITE() 语句,并发现它显然只有在您像这样定义它时才有效: string sql = "UPDATE [dbo].[Table] SET [Column].WRITE
我在 Unix 系统上用 C 编程。我知道: write(fd,"ABCD",4); 比这样做更好: write(fd, "A", 1); write(fd, "B", 1); write(fd, "
func hash(s string) uint32 { h := fnv.New32a() h.Write([]byte(s)) return h.Sum32() } 对于这
在经典的 asp 页面中,有人告诉我您可以使用 vbscript 或 jscript。而 jscript 就是 javascript。 所以我不确定 Response.Write、Response.W
当 openssl 子进程尝试 write() 到本地目录时,我收到此错误。在调用 write() 之前连接已关闭。它没有与 ssl 连接,因为我什至无法从 nodejs 文档启动示例代码。 我错过了
最近我在试验netty。我遇到了以下问题: ctx.channel().write(new TextWebSocketFrame("hello")) 没有在客户端返回 hello,但是 ctx.cha
请解释以下内容: def feed(data): import os print "DATA LEN: %s" % len(data) f = open("copy", "w") f.
有什么区别debug.write 和 Trace.write ?每个应该什么时候使用? 最佳答案 在典型的发布构建配置中,Debug class 被禁用并且什么都不做。 Trace但是,仍然可以在发行
我只是想知道,就性能而言,哪个更好(我在 FileStream 中使用 StreamWriter): 多次调用 Stream.Write(): StreamWriter sw = new Stream
我发现自己写给 stringwriter,然后在函数末尾执行 resp.Write(sw.ToString())。这是不必要的吗?如果我多次使用 HttpResponse.Write,即使我的页面是
我正在尝试通过 JavaScript 文件从 electron 打开一个新窗口,它可以工作,并打开了新窗口,但我无法将 HTML/文本写入新文件。我收到那个错误: Cannot read proper
我们对 QIODevice::write 的一般行为和具体的 QTcpSocket 实现感到非常困惑。有一个 similar question已经,但答案并不令人满意。主要的混淆源于分别提到的 byt
我知道这听起来像是一个愚蠢的问题: write(*,*) 和 write(6,*) ?我在我研究所的 super 计算机上运行一个复杂的代码,它通过一个不同于 6 的单元号输出一个数据文件,显然编译的
我有一个结构体,它可以通过一系列复杂的方法调用转换为文本,其中包含大量 write!调用。此文本可以写入文件或调试日志。我正在决定是否使用 fmt::Write 或 io::Write .我不能真正使
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
In the C standard library, an output can't be followed by an input and vice versa. 对于Linux API,可以在re
我希望能够为一件事做 document.write。然后延迟半秒,然后再记录。写一些。你知道这是否可能吗?而且,如果是这样,怎么办?到目前为止,我已经尝试过了,但没有奏效: document.writ
为什么通过 onclick 属性调用的 write() 函数解析为 document.write() 并替换文档?有什么办法可以阻止这种情况发生吗? Write Function Alternat
我想创建一个包含多个“页面”的文本文件,并将每个页面的字节偏移量记录在一个单独的文件中。为此,我将字符串打印到主输出文件并使用 bytes_written += file.write(str) 计算字
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!