2016-07-21 7 views
0

私はTopBraid Composer Free Editionを使ってオントロジーとスピンルールを構成しています。 TopBraid Composer Free Editionから保存されたRDFファイルを使用して、私のオントロジーをSesame OpenRDF Workbenchにロードしています。アクティブ/非アクティブの概念をスピンルールに追加する方法は?

私は、数百のルールのうちのどれを適用すべきかという点で動的なSPINルール(より正確には、SPINコンストラクタ)のアプリケーションを持っています。 SPINルールに「アクティブ」または「非アクティブ」という概念を追加する方法を見つけたいと思います。 WHERE句の各ルールにチェックを追加して「アクティブな」ルールのみを追加します。たとえば、私はSPINの2つのサブプロパティを作成するとします:コンストラクタをmyPrefix:activeConstructormyPrefix:inactiveConstuctorと呼びます。

今、私は私のコンストラクタのWHERE句にフォームのトリプルを追加したい:

?thisConstructorURI a myPrefix:activeConstructor . 

このアプローチは?thisConstuctorURIを定義することにかかっています。 SPINは、ルールに関連付けられたクラスの現在のインスタンスに?thisを設定します。ルールそのもののURIに似たものがありますか?

私は現在、ルールは空白のノードにあると考えています。例えば、私のsxxiccのコンストラクタ:Pub7Proposalクラスごま/ OpenRDFワークベンチで見て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. ルールです(例えば sxxicci:Pub7ProposalSecurityClassificationConsistencyCheck)私はそれらを書く際のルールに名前を付けることができるように(私の?thisConstructorURI アイデア)
  2. 自分自身を参照することができるよう

これは、ルールを1つずつ(または任意の名前付きグループの単純な拡張によって)有効化/無効化できるようにするためのものです。これを行う方法に関するアイデア?

上記を満足することは、spin:ConstraintViolationに含めることができる制約のために既にサポートされているspin:violationSourceと同様です。しかし、制約の代わりに意図的にコンストラクタを使用しているのは、違反があってもクラスのインスタンス化をブロックしたくないからです。

現在のSPIN標準と実装がこれをサポートしておらず、標準を拡張するためにサポート実装を変更する必要があるのではないかと心配しています。

+0

私は少し進歩しましたが、それは厄介です。コンストラクタは、次のような一意のコメント文字列を持っていると仮定して自分自身を見つけることができます。 'sxxicc:Pub7Proposal sxxicc:activeSxxiPub7ComplianceCheckRule?thisRule。 ?thisRule rdfs:comment "主要な機能識別子は無効です。(511 02)" ^^ xsd:string .' –

答えて

1

私のコンストラクタを有効/無効にするのは難しい方法です。私は、次のサブプロパティの構造を使用していますことに注意してください:

spin:constructor 
    sxxicc:sxxiPub7ComplianceCheckRule 
    sxxicc:activeSxxiPub7ComplianceCheckRule 

私はsxxicc:sxxiPub7ComplianceCheckRuleとして、以下のconststructorを作成します。

# 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:Pub7ProposaldataItem511と "Sight Seeing"(有効な主要な機能識別子ではない)に設定してこれを確認しました。このコンストラクタはエラーメッセージを生成しませんでした。

私はその後、「アクティブ」にこのコンストラクタを変更するには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)をアサートし、このルールは実際には "視力が見える"が予想通りに有効な主要な機能識別子ではないと不平を言った。

上記のINSERT句(同一のトリプル)を置き換えた同じフォームのクエリが、DELETE句を使用すると、コンストラクタを動的に非アクティブにできます。より正確には、エラーメッセージが再度生成されるのを防ぎます。

これは、コンストラクタの動的なアクティブ化と非アクティブ化を効率的に実行する方法ではありません。私はコンストラクタを固定している空のノードを回って多くの作業をしています。一意性を保証するためにルールのコメントを使用しています。自分自身のサブプロパティを使用してルールの検索範囲を制限しています。私はより完全にロード/アンロードせずに、コンストラクタルールを動的にアクティブ化/非アクティブ化するより良い方法を持っていたいと思います。ルールエンジン自体が「アクティブ」という概念を理解していて、「非アクティブ」なルールが不必要に実行されて、それらが非アクティブであることを見つけることができないようにするのは素晴らしいことです。

関連する問題