この投稿の長さをお詫び申し上げます。この遅いルールの問題を再現できるようにしています。
TopBraid Composer FE を使用して、オントロジーと SPIN コンストラクターを含む RDF ファイルを作成しています。SPIN コンストラクターの目的は、オントロジーで定義されたクラスの個々のインスタンス化におけるコンプライアンスをチェックすることです。SPIN コンストラクターの実行が非常に遅いことがわかりました。その理由を知りたいです。
SPIN コンストラクタを含むオントロジー SXIComplianceCheck18.rdf
リポジトリ (RDFS+SPIN をサポートするメモリ内ストア) を変更/クリアし、このオントロジーを RDF4J ワークベンチにロードします。
次に、2 つの SPARQL Update クエリを順番に使用して、オントロジー (上記の RDF ファイル) で定義されたクラスの個々を作成し、実行中の SPIN コンストラクターを刺激します。
最初の SPARQL Update クエリ (個々のデータ項目をインスタンス化し、必要に応じて解析コンストラクターを呼び出します... すばやく実行されます):
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#>
INSERT DATA
{
sxxicci:testPub7Proposal_DataItem110 a sxxicc:Pub7DataItem110 ;
sxxicc:pub7DataItemHasRawStringValue "(C) M221.5"^^xsd:string .
sxxicci:testPub7Proposal_DataItem500 a sxxicc:Pub7DataItem500 ;
sxxicc:pub7DataItemHasRawStringValue "S181"^^xsd:string .
sxxicci:testPub7Proposal_DataItem300 a sxxicc:Pub7DataItem300 ;
sxxicc:pub7DataItemHasRawStringValue "DC"^^xsd:string .
sxxicci:testPub7Proposal_DataItem113 a sxxicc:Pub7DataItem113 ;
sxxicc:pub7DataItemHasRawStringValue "FX"^^xsd:string .
sxxicci:testPub7Proposal_DataItem511 a sxxicc:Pub7DataItem511 ;
sxxicc:pub7DataItemHasRawStringValue "SIGHT SEEING"^^xsd:string .
sxxicci:testPub7Proposal_DataItem501 a sxxicc:Pub7DataItem501 ;
# sxxicc:pub7DataItemHasRawStringValue "M002"^^xsd:string .
sxxicc:pub7DataItemHasRawStringValue "M018, 160727"^^xsd:string .
sxxicci:testPub7Proposal_DataItem503 a sxxicc:Pub7DataItem503 ;
sxxicc:pub7DataItemHasRawStringValue "CUBESAT, TOM"^^xsd:string .
sxxicci:testPub7Proposal_DataItem504a a sxxicc:Pub7DataItem504 ;
sxxicc:pub7DataItemHasRawStringValue "FAS Agenda line 1"^^xsd:string ;
sxxicc:pub7DataItemHasOrdinalNumber "1"^^xsd:integer .
sxxicci:testPub7Proposal_DataItem504b a sxxicc:Pub7DataItem504 ;
sxxicc:pub7DataItemHasRawStringValue "FAS Agenda line 2"^^xsd:string ;
sxxicc:pub7DataItemHasOrdinalNumber "2"^^xsd:integer .
sxxicci:testPub7Proposal_DataItem504c a sxxicc:Pub7DataItem504 ;
sxxicc:pub7DataItemHasRawStringValue "FAS Agenda line 3"^^xsd:string ;
sxxicc:pub7DataItemHasOrdinalNumber "3"^^xsd:integer .
sxxicci:testPub7Proposal_DataItem504d a sxxicc:Pub7DataItem504 ;
sxxicc:pub7DataItemHasRawStringValue "FAS Agenda line 4"^^xsd:string ;
sxxicc:pub7DataItemHasOrdinalNumber "4"^^xsd:integer .
sxxicci:testPub7Proposal_DataItem504e a sxxicc:Pub7DataItem504 ;
sxxicc:pub7DataItemHasRawStringValue "FAS Agenda line 5"^^xsd:string ;
sxxicc:pub7DataItemHasOrdinalNumber "5"^^xsd:integer .
sxxicci:testPub7Proposal_DataItem504f a sxxicc:Pub7DataItem504 ;
sxxicc:pub7DataItemHasRawStringValue "FAS Agenda line 6"^^xsd:string ;
sxxicc:pub7DataItemHasOrdinalNumber "6"^^xsd:integer .
sxxicci:testPub7Proposal_DataItem144 a sxxicc:Pub7DataItem144 ;
sxxicc:pub7DataItemHasRawStringValue "Y"^^xsd:string .
sxxicci:testPub7Proposal_DataItem005 a sxxicc:Pub7DataItem005 ;
sxxicc:pub7DataItemHasRawStringValue "SF"^^xsd:string .
sxxicci:testPub7Proposal_DataItem102 a sxxicc:Pub7DataItem102 ;
sxxicc:pub7DataItemHasRawStringValue "S 881234"^^xsd:string .
sxxicci:testPub7Proposal_DataItem017 a sxxicc:Pub7DataItem017 ;
sxxicc:pub7DataItemHasRawStringValue "C"^^xsd:string .
}
2 番目の SPARQL Update クエリ (最初のクエリによってインスタンス化されたデータ項目を結合する提案をインスタンス化し、コンプライアンス チェック コンストラクターを実行します... 非常に遅く、私のコンピューターでは約 20 秒実行されます):
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#>
INSERT DATA
{
sxxicci:TestPub7Proposal a sxxicc:Pub7Proposal ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem005 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem017 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem102 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem110 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem113 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem144 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem300 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem500 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem501 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem503 ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem504a ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem504b ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem504c ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem504d ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem504e ;
# sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem504f ;
sxxicc:pub7ProposalHasDataItem sxxicci:testPub7Proposal_DataItem511 .
}
この 2 番目のクエリの実行には、約 20 秒と長い時間がかかります。これは、他のコンプライアンス チェックと一致しません (この RDF には含まれていません)。この 1 つのルールは、他の 13 の同様のルール (主に文字列の解析と比較) の中から分離しました。
(正しいが遅れた)結果:
問題の SPIN コンストラクター (sxxicc:Pub7Proposal
クラス用):
# NEED MINUTE <M> NOTE M002 IN CIRCUIT REMARKS LISTING IRAC DOCUMENT GIVING APPROVAL FOR THIS ASSIGNMENT. (501 08)
CONSTRUCT {
?this sxxicc:pub7ProposalHasComplianceMessage "NEED MINUTE <M> NOTE M002 IN CIRCUIT REMARKS LISTING IRAC DOCUMENT GIVING APPROVAL FOR THIS ASSIGNMENT. (501 08)"^^xsd:string .
}
WHERE {
?this a sxxicc:Pub7Proposal .
?this sxxicc:pub7ProposalHasDataItem ?dataItem102 .
?dataItem102 a sxxicc:Pub7DataItem102 .
?dataItem102 sxxicc:pub7DataItemHasStringValue ?serialNumString .
?this sxxicc:pub7ProposalHasDataItem ?dataItem500 .
?dataItem500 a sxxicc:Pub7DataItem500 .
?dataItem500 sxxicc:pub7DataItemHasStringValue ?iracNotesString .
?this sxxicc:pub7ProposalHasDataItem ?dataItem501 .
?dataItem501 a sxxicc:Pub7DataItem501 .
?dataItem501 sxxicc:pub7DataItemHasStringValue ?notesFreeTextCommentsString .
?this sxxicc:pub7ProposalHasDataItem ?dataItem113 .
?dataItem113 a sxxicc:Pub7DataItem113 .
?dataItem113 sxxicc:pub7DataItemHasStringValue ?stationClassString .
?this sxxicc:pub7ProposalHasDataItem ?dataItem300 .
?dataItem300 a sxxicc:Pub7DataItem300 .
?dataItem300 sxxicc:pub7DataItemHasStringValue ?stateCountryForTransmittingStation .
BIND (SUBSTR(?serialNumString, 1, 4) AS ?orgString) .
BIND (SUBSTR(?stationClassString, 1, 2) AS ?stationClassCode) .
FILTER (((((?orgString = "S "^^xsd:string) && (?iracNotesString = "S181"^^xsd:string)) && (?notesFreeTextCommentsString != "M002"^^xsd:string)) && (?stationClassCode = "FX"^^xsd:string)) && (?stateCountryForTransmittingStation = "DC"^^xsd:string)) .
}
このコンストラクターが最新の PC (AMD クアッド コア 2.3 GHz、16 GB の物理メモリで Windows 8 を実行し、追加のアプリケーションの読み込みがほとんどない) で実行速度が非常に遅いのはなぜですか? 他のコンストラクターは、同じマシン上ですばやく実行され、同じ事実を使用して、明らかに同様のことを行います。
この例を実行したときの Java VisualVM Sampler の出力は次のとおりです。
RDF4J org.eclipse.rdf4j.common.concurrent.locks.LockManager$1.release() および org.eclipse.rdf4j.common.concurrent.locks.LockManager.createLock() が Self Time を支配します。どうして??この時間の消費を避けるためにルールを書き直すためにできることはありますか?
ノート:
- ?this は自動的に設定されるため、SPIN コンストラクターでは WHERE 句の最初のトリプルは必要ありません。ただし、このコンストラクターをワークベンチの SPARQL クエリ (Explore/Query) にコピーしてデバッグを容易にするために、これを含めます。また、CONSTRUCT 句を "SELECT DISTINCT *" に置き換え、コンストラクターのデバッグ用に WHERE 句をそのままにしておくと便利です。
- このコンストラクターの WHERE 句の唯一の目的は、CONSTRUCT 句の固定エラー メッセージのエラー条件が存在することを示すグラフ パターンの一致を提供することです。WHERE 句から CONSTRUCT 句に引き継がれるバインディングはありませんが、WHERE 句は引き続き CONSTRUCT 句のトリプルのアサーションを制御します。
アップデート
コンストラクターから 1 つの FILTER と関連するトリプルを削除して、コンストラクターを変更しました。
FILTER (?iracNotesString = "S181"^^xsd:string) .
?this sxxicc:pub7ProposalHasDataItem ?dataItem500 .
?dataItem500 a sxxicc:Pub7DataItem500 .
?dataItem500 sxxicc:pub7DataItemHasStringValue ?iracNotesString .
これにより、TBC FE で以下に示すコンストラクターが生成されます。
同じ 2 つの SPARQL 更新クエリで同じテストを実行すると、2 番目のクエリの実行時間は 20 秒以上から 2 秒未満に非常に非線形に短縮されます。繰り返しますが、これは正しくないようです。