0

我正在使用 TopBraid Composer 免费版来编写本体和 SPIN 规则。我正在使用从 TopBraid Composer 免费版保存的 RDF 文件将我的本体加载到 Sesame OpenRDF Workbench。

我有一个 SPIN 规则(更准确地说是 SPIN 构造函数)的应用程序,它根据数百条规则中的哪条应用是动态的。我想找到一种在 SPIN 规则中添加“活动”或“非活动”概念的方法。我愿意为WHERE子句中的每个规则添加一个检查,以便只有“活动”规则。为了说明,假设我创建了 SPIN 的两个子属性:构造函数,分别调用它们myPrefix:activeConstructormyPrefix:inactiveConstuctor.

现在我想在构造函数的 WHERE 子句中添加以下形式的三元组:

?thisConstructorURI a myPrefix:activeConstructor .

这种方法取决于定义?thisConstuctorURI. SPIN 设置?this为与规则关联的类的当前实例。规则 itslef 的 URI 是否有类似的东西。

我也相信,目前,规则驻留在空白节点上。例如,在 Sesame/OpenRDF Workbench 中,我的 sxxicc:Pub7Proposal 类的构造函数具有以下 13 个构造函数的三元组:

SUBJECT              PREDICATE           OBJECT
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox14591
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox14638
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox14710
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox14787
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox14841
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox14927
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox15002
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox15088
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox15114
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox15195
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox15257
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox15336
sxxicc:Pub7Proposal  spin:constructor    _:node1anlqmpiox15377

我真正需要的(我认为)是

  1. 能够引用自己的规则(我的?thisConstructorURI 想法)
  2. 能够在我编写规则时命名规则(例如 sxxicci:Pub7ProposalSecurityClassificationConsistencyCheck

这一切都是为了让我可以一个一个地激活/停用规则(或通过任意命名组中的简单扩展)。关于如何做到这一点的任何想法?

满足上述 1. 类似于spin:violationSource已经支持的约束,可以包含在 a 中spin:ConstraintViolation。但是,我故意使用构造函数而不是约束,主要是因为我不想阻止类的实例化,即使它有违规行为。

恐怕答案是当前的 SPIN 标准和实现不支持这一点,并且需要更改支持实现以扩展标准来做到这一点。

4

1 回答 1

1

我已经确认了一种激活/停用我的构造函数的尴尬方式。请注意,我正在使用以下子属性结构:

spin:constructor
  sxxicc:sxxiPub7ComplianceCheckRule
    sxxicc:activeSxxiPub7ComplianceCheckRule

我将以下构造函数创建为sxxicc:sxxiPub7ComplianceCheckRule

# THE MAJOR FUNCTION IDENTIFIER IS INVALID. (511 02)
CONSTRUCT {
    ?this sxxicc:pub7ProposalHasComplianceMessage "THE MAJOR FUNCTION IDENTIFIER IS INVALID. (511 02)"^^xsd:string .
}
WHERE {
    ?this a sxxicc:Pub7Proposal .
    ?this sxxicc:pub7ProposalHasDataItem ?dataItem511 .
    sxxicc:Pub7Proposal sxxicc:activeSxxiPub7ComplianceCheckRule ?thisRule .
    ?thisRule rdfs:comment "THE MAJOR FUNCTION IDENTIFIER IS INVALID. (511 02)"^^xsd:string .
    ?dataItem511 a sxxicc:Pub7DataItem511 .
    ?dataItem511 sxxicc:pub7DataItemHasStringValue ?majorFunctionID .
    ?this sxxicc:pub7ProposalHasDataItem ?dataItem102 .
    ?dataItem102 a sxxicc:Pub7DataItem102 .
    ?dataItem102 sxxicc:pub7DataItemHasStringValue ?serialNumString .
    BIND (SUBSTR(?serialNumString, 1, 4) AS ?orgString) .
    FILTER (((((?orgString = SUBSTR("AF  X"^^xsd:string, 1, 4)) || (?orgString = SUBSTR("AR  X"^^xsd:string, 1, 4))) || (?orgString = SUBSTR("N   X"^^xsd:string, 1, 4))) || (?orgString = SUBSTR("NS  X"^^xsd:string, 1, 4))) || (?orgString = SUBSTR("MC  X"^^xsd:string, 1, 4))) .
    FILTER (!(((((((((((?majorFunctionID = "AIR OPERATIONS") || (?majorFunctionID = "GROUND OPERATIONS")) || (?majorFunctionID = "SEA OPERATIONS")) || (?majorFunctionID = "SPACE OPERATIONS")) || (?majorFunctionID = "RANGE OPERATIONS")) || (?majorFunctionID = "SURVEILLANCE/RECONNAISSANCE")) || (?majorFunctionID = "SPECIAL OPERATIONS")) || (?majorFunctionID = "C3")) || (?majorFunctionID = "SUSTAINING OPERATIONS")) || (?majorFunctionID = "DOMESTIC SUPPORT OPERATIONS")) || (?majorFunctionID = "OTHER OPERATIONS"))) .
}

此查询与激活最相关的行是:

sxxicc:Pub7Proposal sxxicc:activeSxxiPub7ComplianceCheckRule ?thisRule .
?thisRule rdfs:comment "THE MAJOR FUNCTION IDENTIFIER IS INVALID. (511 02)"^^xsd:string .

默认情况下,此规则无法生成其错误消息,因为它具有超属性但没有活动子属性。我通过断言设置为“Sight Seeing”(不是有效的主要功能标识符)来确认这sxxicc:Pub7Proposal一点dataItem511。这个构造函数没有产生它的错误信息。

然后我从 OpenRDF 工作台“修改/SPARQL 更新”运行以下 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 BugReproduction: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproduction#>
PREFIX bugsi: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#>
PREFIX BugReproductionInstantiations: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/BugReproductionInstantiations#>

INSERT {
    sxxicc:Pub7Proposal sxxicc:activeSxxiPub7ComplianceCheckRule ?thisRule .
}
WHERE {
    sxxicc:Pub7Proposal sxxicc:sxxiPub7ComplianceCheckRule ?thisRule .
    ?thisRule rdfs:comment "THE MAJOR FUNCTION IDENTIFIER IS INVALID. (511 02)"^^xsd:string .
}

我断言了另一个相同sxxicc:Pub7Proposal的(不同的 IRI),并且该规则确实抱怨“Sight Seeing”不是有效的主要功能标识符,正如预期的那样。

请注意,具有相同形式但使用DELETE替换上述INSERT子句(相同的三元组)的子句的查询可能会动态地使构造函数无效。更准确地说,它将防止再次生成错误消息。

这是完成构造函数的动态激活和停用的低效方式。我正在做很多工作来绕过锚定构造函数的空白节点。我使用规则的注释来确保唯一性,并且我使用自己的子属性来限制规则搜索自身的范围。我希望有一种更好的方法来动态激活/停用构造函数规则,而无需完全加载/卸载它们。如果规则引擎本身理解“活动”的概念,这样“非活动”规则就不会不必要地运行而只是发现它们是非活动的,那就太好了。

于 2016-07-24T22:30:59.993 回答