如何在SPARQL SPIN规则声明中使用CONSTRUCT / WHERE

时间:2014-08-17 15:09:00

标签: sparql jena construct topbraid-composer spin-rdf

摘要

提前感谢您帮助我编写一个CONSTRUCT / WHERE语句,该语句可以在TopBraid Composer免费版中声明为SPIN规则并使用。

我试图在spin:rule声明中嵌入SPARQL CONSTRUCT / WHERE语句,然后执行它。我将在下面的陈述1或2中返回零推论。我使用的是Java 7,Eclipse 4.3和TopBraid Composer免费版。我已成功在类表单(语句3)中将语句3作为SPIN构造函数声明运行。我已成功在SPARQL查询编辑器(解释器)中运行语句4,我已将其交叉发布到用户论坛。

详情

事实1:我无法将声明1作为SPIN规则运行。

----陈述1 ---

CONSTRUCT {
?this owl:hasKey ?x .
}
WHERE {
BIND (spif:generateUUID() AS ?x) .
}

事实2:我无法将声明2作为SPIN规则运行。

----陈述2 ----

CONSTRUCT {
?this owl:hasKey ?x .
}
WHERE {
?this rdfs:subClassOf node:entity .
BIND (spif:generateUUID() AS ?x) .
}
--No Error Message--

事实3:但是我在类表单的构造函数字段中成功使用了语句3.

----陈述3 ----

CONSTRUCT {
?this owl:hasKey ?x .
}
WHERE {
BIND (spif:generateUUID() AS ?x) .
}
Success: When a new instance is created a new triple indicating a key is created.

事实4:我在SPARQL查询编辑器中成功使用了语句4,这是类似的。

----陈述4 ----

CONSTRUCT {
?s owl:hasKey ?x .
}
WHERE {
?s rdf:type node:word_use
BIND (spif:generateUUID() AS ?x) .
}
Success: When statement is run all current instances get keys.

事实5:我没有在Ontology Profile表单中检查任何SPARQL规则库。

事实6:我导入了以下两个库。

<http://spinrdf.org/spin> from local file TopBraid/SPIN/spin.ttl.
<http://spinrdf.org/sp> from local file TopBraid/SPIN/sp.ttl

事实7:文件中的命名空间是:

Base URI (Location) - http://example.org/
Default Namespace - http://example.org/

But the Base URI keeps getting reset to:
http://www.semanticweb.org/owl/owlapi/turtle

ace_lexicon - http://attempto.ifi.uzh.ch/ace_lexicon#
arc - http://example.org/arc#
arg - http://spinrdf.org/arg#
concept - http://example.org/concept#
node - http://www.example.org/node#
owl - http://www.w3.org/2002/07/owl#
rdf - http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs - http://www.w3.org/2001/01/rdf-schema#
skos - http://www.w3.org/2004/02/skos/core#
sp - http://spinrdf.org/sp#
spif - http://spinrdf.org/spif#
spin - http://spinrdf.org/spin#
spl - http://spinrdf.org/spl#
word_sense - http://example.org/word_sense#
word_term - http://example.org/word_term#
word_use - http://example.org/word_use#

事实8:我使用的类有以下断言。

Name - node:unclassified_concept
SubClassOf - node:entity

事实9:节点:unclassified_concept类的实例如下所述。

URI - http://example.org/concept#regardless_of1
rdfs:comment - without attention to
rdfs:isDefinedBy - <http://en.wiktionary.org/wiki/regardless_of>
rdfs:label - regardless of

事实10:我成功使用了Jena Generic Rules推理以及OWL_MEM_RULE_INF OntModelSpec,读/写,基本模型,inf模型和ont模型。

上下文

我的问题的背景如下。我正在使用Java和Jena构建并迭代地执行本体和规则集,以证明OWL / RDF的概念代表,考虑和响应非平凡类型书面英语。我使用的句子是非平凡的(41个单词,3个条款等)。当没有针对任何OWL / RDF规则(传递性等)运行时,当前本体有1422个断言。我正在使用TopBraid Composer来补充Jena编程,以确保我符合约定和标准。

1 个答案:

答案 0 :(得分:0)

这篇文章概述了我发布的问题的解决方案。我能够通过响应用户论坛的人来解决这个问题。 https://groups.google.com/forum/#!forum/topbraid-users

我想运行的CONSTRUCT / WHERE语句(修订后)是:

CONSTRUCT {
?this owl:hasKey ?x .
}
WHERE {
?this rdf:type node:unclassified_concept .
BIND (spif:generateUUID() AS ?x) .
}

但是,如果我将此语句放在TBC中类表单的spin:rule字段中并按下图标进行推理,我将不会得到任何推论,并且推理器会花费很多时间。

解决方案是创建一个spin属性的子属性:将spin:rulePropertyMaxIterationCount设置为1的规则(以避免通过运行内置函数生成无限循环 - 在我的情况下为spin:generateUUID()。)

然后我需要&#34;拉&#34;或者将新的子属性(我将其命名为&#34; runOnce&#34;)放入我试图为其创建依赖于内置的CONSTRUCT / WHERE规则的类表单中。

最后,在类表单中,我需要在新的子属性RunOnce上选择添加空行,然后在那里输入我原来的CONSTRUCT / WHERE语句。

然后我运行推理,该类使用了规则。

简而言之,如果您想在TBC中的类中嵌入规则,并且该规则使用内置函数,则需要

-Create a subproperty of spin:rule that has rulePropertyMaxIterationCount 
   set to 1.
-Include this subproperty in the classes form.
-Embed your CONSTRUCT/WHERE statement that uses the built-in within that 
   subproperty on the classes form by selecting insert blank line and 
   copying/pasting it       in there.

请注意,TBC支持的SPIN内置函数是一个比我认为的SPIN API文档更小的集合。 TBC支持的内置插件列表在TBC产品中。

Help>
  Help Contents>
    TopBraid Composer>
      Application Development Tools>
        SPARQL Motion Scripts>
          SPARQL Motion Functions Reference

希望这有助于某人。