我正在使用TopBraid Composer Free Edition来编写本体和SPIN规则。我正在使用TopBraid Composer Free Edition中保存的RDF文件将我的本体加载到Sesame OpenRDF Workbench中。
我有一个SPIN规则(更准确地说,SPIN构造函数)的应用程序,它是动态的,可以应用数百个规则中的哪一个。我想找到一种方法,将"活动"或"非活动"的概念添加到SPIN规则中。我愿意为WHERE
子句中的每个规则添加一个复选框,以便只有"活动"规则。为了进行说明,假设我创建了SPIN的两个子属性:构造函数,称它们为myPrefix:activeConstructor
和myPrefix:inactiveConstuctor
。
现在,我想在构造函数的WHERE子句中添加一个三重形式:
?thisConstructorURI a myPrefix:activeConstructor .
这种方法依赖于定义?thisConstuctorURI
。SPIN将?this
设置为与规则关联的类的当前实例。规则的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
我真正需要的(我想)是
- 能够引用自己的规则(我的
?thisConstructorURI
想法) - 能够在编写规则时命名规则(例如。
sxxicci:Pub7ProposalSecurityClassificationConsistencyCheck
)
这一切都是为了让我可以一个接一个地激活/停用规则(或者在任意命名的组中进行简单扩展)。有什么想法吗?
满意1。以上类似于已经针对可包括在CCD_ 9中的约束而支持的CCD_。然而,我非常有意地使用构造函数而不是约束,主要是因为我不想阻止类的实例化,即使它有冲突。
恐怕答案是当前的SPIN标准和实现不支持这一点,并且需要更改支持实现来扩展标准来实现这一点。
我确认了一种激活/停用构造函数的尴尬方法。请注意,我使用的是以下子属性结构:
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 .
默认情况下,此规则无法生成错误消息,因为它具有超级属性,但没有活动子属性。我通过断言sxxicc:Pub7Proposal
来证实这一点,dataItem511
设置为"Sight Seeing"(不是有效的主要功能标识符)。此构造函数未生成其错误消息。
然后,我从OpenRDF工作台"Modify/SPARQL Update"运行以下SPARQL Update查询,将此构造函数更改为"active":
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
子句(相同的三元组)的查询可以动态地停用构造函数。更确切地说,它将防止错误消息再次生成。
这是一种低效的方法来实现构造函数的动态激活和去激活。我正在做很多工作来绕过锚定构造函数的空白节点。我使用规则的注释来确保唯一性,并使用我自己的子属性来限制规则搜索自身的范围。我希望有一种更好的方法来动态激活/停用构造函数规则,而不需要完全加载/卸载它们。如果规则引擎本身理解"活动"的概念,那么"非活动"规则就不会不必要地运行,只发现它们是非活动的,那就太好了。