问题标签 [jena]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 早先打印 InfModel 会在以后更改打印表示?
我在使用推理 API 的 Jena 2.5.5(在 Linux 上)中得到了一种奇怪的效果。以下代码是精简版。我正在创建一个最初为空的模型和一个通用规则推理器。我为某个陈述添加了反身性规则。我将推理器附加到模型以获得 InfModel。然后我创建匹配语句并将其添加到模型中。
结果:InfModel 包含语句及其反向语句。到目前为止一切顺利,这就是它应该做的。
现在,当我System.out.println()
在将匹配语句添加到 Model 之前的 InfModel 时,结果完全不同:规则似乎没有触发,因此,InfModel 最终将不包含原始语句的反向。
将模型写入控制台会如何改变代码的功能?这种行为是否记录在案?
java - 序列化 JENA OntModel 更改
我需要在一个套接字上保持几个Jena模型(特别是 OntModels)同步,并且我想一次做一个更改(出于各种原因——一个是从 OntModels 添加或删除的每个 Statement 是还适应了 JESS 规则库。)。我能够监听 OntModels 上的添加/删除事件,然后创建简单的事件实例,这些实例将添加/删除的语句与指示添加或删除语句的 ChangeType 一起包装,但序列化语句已被证明是问题。
不幸的是,我发现的所有 JENA 序列化文档都与将整个模型序列化为 xml / rdf / n3 / 等有关。由于语句只是字符串的三元组(无论如何,在一个级别上),它似乎应该是微不足道的在语句级别序列化数据。然而,Jena似乎没有提供一个 API 来创建带有“做正确的事情”的纯字符串的语句。类型化文字会出现问题。例如:
我可以创建语句:
但我可以得到的字符串版本如下所示:
(注意^^前没有“)
这不是什么大问题,因为文字仍然可以用正则表达式解析出来,但我无法使用正确的文字创建语句。显而易见的方法 (ModelCon.createStatement(Resource, Property, String)) 生成一个无类型的字符串文字,其中包含传入的字符串的完整值。
有谁知道我如何可靠地序列化(当然还有反序列化)单个 Jena 语句?
java - 阅读具有依赖关系的 Jena OntModel
我对本体和耶拿的概念不熟悉,所以我不确定我的措辞是否正确..
我需要将一系列连接的 owl 文件(通过命名空间依赖项?)读入内存中的 Jena 模型(OntModel?),以便可以运行推理。我该怎么做呢?文件的顺序重要吗?我是否需要调用特定方法来“运行推理引擎”?
semantics - 切换耶拿推理机
我有一个 Jena 本体模型 ( OntModel ),我正在以编程方式对其进行修改。该模型最初是使用默认的 ModelFactory 方法创建的,用于创建本体模型(无参数)。问题是,随着程序的运行和模型的更改,默认的 Jena Reasoner 会运行(运行、运行和运行)。这个过程对于我需要的东西来说太慢了,并且会在大型数据集上耗尽内存。
我将程序更改为使用不同的本体模型工厂方法来创建没有推理器的模型。这运行得非常快,并且没有出现我之前看到的内存问题(即使对于非常大的数据集)。这种方法的问题是我只能通过直接使用它的直接类类型来访问数据(我无法使用它的父类访问对象)。
例如,假设我有两个类资源,“花”和“种子”。这些继承自一个共同的父母,“植物材料”。我的程序获取所有“种子”,运行一个名为“grow”的方法,将“种子”对象转换为“花”对象。使用 Reasoner(甚至是 micro Reasoner)时,“grow”方法运行速度太慢并且内存不足。如果我关闭 Reasoner,那么我将无法使用“植物材料”类访问所有“花”和“种子”。
有没有一种首选的方法(一种快乐的媒介)来做到这一点......允许使用它们的超类访问对象,同时又快又不占用内存?
我一直在寻找一种在运行“增长”方法时“关闭推理器”的方法,然后在方法完成后将其转回。这有可能吗?
java - 在java中将xml:base添加到xml文件
我想将 xml:base 声明添加到 java 中的 xml 文件。我目前在由某些第三方代码生成的 OutputStream 中有 xml 输出。
文件开头是这样的:
我希望它看起来像这样:
我一定是脑子里放了屁什么的,因为我想不出一个务实的好方法。
有任何想法吗?
java - 将 Jena OntModel 与 bnode 同步
这个问题与rcreswick关于Serializing Jena OntModel Changes的问题有关。我在需要通过套接字保持同步的两台(或更多)机器上有 Jena 模型。我需要解决的主要问题是模型可能包含匿名节点(bnodes),它可以源自任何模型。
问题:我是在正确的轨道上,还是有更好、更强大的方法我没有考虑?
我可以想到 3 种方法来解决这个问题:
- 序列化完整模型:这对于同步小更新来说非常昂贵。此外,由于任何一台机器都可能发生变化,我不能只用机器 A 的序列化模型替换机器 B 的模型。我需要合并它们。
- 序列化部分模型:使用专用模型进行序列化,该模型仅包含需要通过套接字发送的更改。这种方法需要特殊的词汇表来表示从模型中删除的语句。据推测,当我将模型从机器 A 序列化到机器 B 时,匿名节点 ID 对于机器 A 将是唯一的,但可能与在机器 B 上创建的匿名节点的 ID 重叠。因此,我必须重命名匿名节点并保留映射从机器 A 的匿名 ID 到机器 B 的 ID,以便正确处理未来的更改。
- 序列化单个语句:这种方法不需要特殊的词汇,但可能不那么健壮。除了匿名节点之外,还有其他我还没有遇到的问题吗?
- Generate global unique bnode ids (NEW):我们可以通过在 ID 前加上唯一的机器 ID 来为匿名节点生成全局唯一的 ID。不幸的是,我还没有弄清楚如何告诉 Jena 使用我的 ID 生成器而不是它自己的。这将允许我们在不重新映射 bnode ID 的情况下序列化单个语句。
这里有一个例子可以让这个讨论更深入一点。假设我在机器 A 上有一个列表,表示为:
我将这个模型从机器 A 序列化到机器 B。现在,因为机器 B 可能已经有一个(不相关的)匿名节点,id 为“a”,我将 id 'a' 重新映射到新的 id 'b':
现在机器 A 上的列表发生了变化:
由于机器 B 之前从未遇到过机器 A 的 id 'b',它添加了一个从机器 A 的 id 'b' 到新的 id 'c' 的新映射:
如果有两台以上的机器,问题会更加复杂。例如,如果有第三台机器 C,它可能有自己的匿名节点“a”,它不同于机器 A 的匿名节点“a”。因此,机器 B 确实需要保存从其他机器的每个匿名节点 ID 到其本地 ID 的映射,而不仅仅是从一般的远程 ID 到本地 ID。在处理传入的更改时,必须考虑更改的来源以正确映射 ID。
java - 生成 Jena Bnode ID
有没有办法覆盖 Jena 生成匿名节点 ID 的默认方法?
理想情况下,我想向 Jena 传递一个生成 ID 的函子,这样我就可以使它们在全球范围内独一无二(而不仅仅是机器独有的)。每当构造 AnonId 时都应使用仿函数。
这与我之前的问题有些相关。
编辑:我意识到 AnonId 有一个带有 id 参数的构造函数。我希望避免到处调用这个构造函数,而是简单地告诉 Jena(一次)如何生成 ID。
编辑 2:即使我不介意到处调用该构造函数,这也可能是不可能的,因为匿名节点可能是由我无权访问的库代码创建的。
hibernate - 有没有办法将休眠会话读取为 RDF 三元组?
我需要根据 WHERE 子句的相关数据位于链接开放数据云中的条件查询本地 Hibernate 托管数据存储中的持久对象。
有没有办法将休眠会话读取为 RDF?如果是这样,我至少可以使用组合数据集来决定从 Hibernate 中检索哪些对象。
正如我所熟悉的那样,该解决方案最好将 Hibernate Session 暴露在 Jena 内部。此外,我需要支持 RDFS 推理和 SPARQL 进行检索。
tree - 检索 rdf:Class 的所有祖先
想象一下以下分类法(无环和有向图):
1) 是否可以使用Jena OWL API检查给定资源(例如 HomoSapiens)是否是“哺乳动物”的子类,而无需递归检索所有父节点?
2)与SPARQL相同的问题。
谢谢
rdf - 从 OWL 本体获取基本命名空间
有没有办法从 OWL 本体文件中获取基本命名空间,而不使用 DOM 或类似的,而只使用 Jena 的 API?例如,来自 OWL 文件:
我怎么能http://www.owl-ontologies.com/Ontology1254827934.owl
在运行时得到?