Sparql 自旋:规则何时运行?

Sparql 自旋:规则何时运行?,sparql,rdf,sesame,topbraid-composer,spin-rdf,Sparql,Rdf,Sesame,Topbraid Composer,Spin Rdf,我正在使用TopBraid免费版创建带有旋转规则的OWL本体。我正在将本体和旋转规则加载到Sesame OpenRDF工作台中: Application Name OpenRDF Workbench Version 4.1.2 Runtime Information Operating System Windows 8.1 6.3 (amd64) Java Runtime Oracle Corporation Java HotSpot(TM) 64-Bit Server VM

我正在使用TopBraid免费版创建带有旋转规则的OWL本体。我正在将本体和旋转规则加载到Sesame OpenRDF工作台中:

Application Name    OpenRDF Workbench
Version 4.1.2
Runtime Information
Operating System    Windows 8.1 6.3 (amd64)
Java Runtime    Oracle Corporation Java HotSpot(TM) 64-Bit Server VM (1.8.0_91)
Process User    Greg
Memory
Used    646 MB
Maximum 3463 MB
我创建了一个简单的测试本体。它有一个类,具有一个旋转规则和一个数据类型属性

CONSTRUCT {
    ?this BugReproduction:hasTimeStamp ?timeStamp .
}
WHERE {
    BIND (now() AS ?timeStamp) .
}
SPIN规则将
xsd:dateTime
时间戳添加到我的测试类的测试实例中。以下是整个测试本体的RDF,包括我的类、数据类型属性和规则(简称):


使用TopBraid Composer创建
时间戳
时间戳
因此,在Sesame中清除my SPIN repository并使用工作台的Modify/Add命令(未选中“use base URI as context identifier”框,这对于避免bug非常重要)。然后,我使用SPARQL更新查询创建类的测试实例:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX sxxicc: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/SXXIComplianceCheck#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX sp: <http://spinrdf.org/sp#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX smf: <http://topbraid.org/sparqlmotionfunctions#>
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX spl: <http://spinrdf.org/spl#>
PREFIX spin: <http://spinrdf.org/spin#>
PREFIX arg: <http://spinrdf.org/arg#>
PREFIX SXXIComplianceCheckIndividuals: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/SXXIComplianceCheckIndividuals#>
PREFIX sxxicci: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/SXXIComplianceCheckIndividuals#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX bugs: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproduction#>
PREFIX bugsi: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#>

INSERT DATA {
    bugsi:aTimeStampBug_test1 a bugs:TimeStampBug .
}
前缀rdf:
前缀sxxicc:
前缀owl:
前缀sp:
前缀rdfs:
前缀smf:
前缀fn:
前缀spl:
前缀旋转:
前缀arg:
前缀SXXIComplianceCheckIndividuals:
前缀sxxicci:
前缀xsd:
前缀错误:
前缀bugsi:
插入数据{
bugsi:aTimeStampBug_test1 a bug:TimeStampBug。
}
然后,我探索生成的bugsi:aTimeStampBug_test1个体,以发现SPIN:rule已经运行了好几次并产生了好几个时间戳。时间戳的数量因测试而异。下面是一个示例结果:

Subject 
Predicate
Object
Context
<http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.571-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.592-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.594-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.595-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.596-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.597-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.598-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.599-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.600-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.601-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.602-05:00   
主题
谓语
对象
上下文
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.571-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.592-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.594-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.595-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.596-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.597-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.598-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.599-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.600-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.601-05:00
小虫繁殖:黑斯廷斯
2016-07-11T20:56:58.602-05:00

因此,对于类的一个实例化,我的SPIN:rule已经运行了好几次。一个SPIN:rule应该为一个类的实例化运行多少次?我以为它只会运行一次,但似乎我错了。

A
SPIN:rule
在类的实例发生更改时在该类的实例上运行。我发布的示例设置了一个无限循环,由我的规则生成另一个规则运行生成另一个更改(新时间戳),等等,直到达到某个模糊的限制。该限制可能与Sesame的整体状态有关(例如,资源或超时驱动),因此我得到了数量可变的时间戳。一个简单的解决方案是使用
SPIN:constructor
,它只在实例化时运行(当类被断言时),而不是在实例化发生变化时运行。

每当类的实例发生变化时,
SPIN:rule
就会在类的实例上运行。我发布的示例设置了一个无限循环,由我的规则生成另一个规则运行生成另一个更改(新时间戳),等等,直到达到某个模糊的限制。该限制可能与Sesame的整体状态有关(例如,资源或超时驱动),因此我得到了数量可变的时间戳。一个简单的解决方案是使用
SPIN:constructor
,它只在实例化时运行(当类被断言时),而不是在实例化发生变化时运行。

您最好在rdf4j用户组上问这个问题,或者将问题作为github问题发布。它应该只对每个类成员运行一次。谢谢@Scottenninger。在将此作为rdf4j的错误报告提交给github之前,我想确认一下。若我在那个里得到了一个有用的答案,我会把它贴在这里,以确保这个记录的完整性。我已经按照Jeen Broekstra的建议把它贴在了gethub上,它被标记为一个bug。当有更多信息可用时,我将进行更新。您最好在rdf4j用户组中询问此问题,或者将此问题作为github问题发布。它应该只对每个类成员运行一次。谢谢@Scottenninger。在将此作为rdf4j的错误报告提交给github之前,我想确认一下。若我在那个里得到了一个有用的答案,我会把它贴在这里,以确保这个记录的完整性。我已经按照Jeen Broekstra的建议把它贴在了gethub上,它被标记为一个bug。我会在有更多信息时更新。
Subject 
Predicate
Object
Context
<http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.571-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.592-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.594-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.595-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.596-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.597-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.598-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.599-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.600-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.601-05:00   
    <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#aTimeStampBug_test1>
    BugReproduction:hasTimeStamp
    2016-07-11T20:56:58.602-05:00