2017-09-07 15 views
1

私はRDF4JサーバーとWorkbenchバージョン2.2.2を使用しています。私はRDF4JでSPIN対応のリポジトリを使用しています。多くのspin:constructルールを含むTobBraid Composer Free Edition(TBC FE)で作成したRDFファイルを読んでいます。 TBD FEは、sp:textプロパティを使用して、自分のコンストラクタのSPARQLソースコードを含むように設定されています。私はsp:textトリプルが存在し、SPARQLソースコードをRDF4Jが利用できるようにすると、RDF4Jは同じクエリのRDFトークン化表現を使用する代わりにSPARQLソースを使用するように見えることがわかりました。私の第一および第二の質問は以下のとおりです。両方sp:textとRDF表現がインポートされたRDFファイル内に存在しているときインポートされたRDFファイルにsp:textが存在する場合、RDF4JにSPIN RDFトリプルを使用させる方法はありますか?

  • がどのように私はSPINコンストラクタのRDF表現を使用するRDF4Jに指示することができますか?
  • RDF4JがSPINコンストラクタの表現sp:textを使用する場合、インポートされたRDFファイルの先頭にあるプレフィックス定義を使用する方法をどのように指示できますか?私はこれまでに69のコンストラクタを持ち、数えています。各コンストラクタに接頭辞定義を埋め込むことはできますが、そうすることは無駄になります。

Iはsp:text SPARQLソースコード表現のRDF4Jを奪うと、期待どおり、コンストラクタは、インポートRDFファイルの先頭に定義されたプレフィックスを使用して実行します。私は、私がコンストラクタを定義したクラスをインスタンス化する前に、ソースコードを削除するクエリを実行することによって、ソースコードのRDF4Jを奪い取ることができます。私はその目的を達成するために、このSPARQLの更新クエリを使用しました:

PREFIX sp: <http://spinrdf.org/sp#> 
DELETE {?s sp:text ?o .} WHERE {?s sp:text ?o .} 

私はSPARQLクエリを経由してRDF4Jサーバと通信し、私は建物だGUIで表示のために周りのSPARQLのソースコードを維持したいと思います。私の厄介な暫定修正は、以下の手順5で使用されたSPARQL更新クエリを使用してsp:textプロパティの別のカスタムデータプロパティを置き換えることです。このプロパティ置換は、RDF4JがSPINコンストラクタ用のSPARQLソースコードを見つけられないようにします。 RDF4Jは、代わりに、ルールのトークン化されたRDF表現を解釈します。 RDF4JにSPARQLソースコードからではなくRDFからSPINコンストラクタを強制的に実行させるよりクリーンな方法はありますか?私は、SPARQLソースコードの代わりにRDF表現を解釈するようにRDF4Jに通知する何らかの方法が必要であると考えていますが、私はその方法はわかりません。

そして今、血みどろの詳細については、このような状況が再現可能にする...

  1. はRDF4Jワークベンチを使用してRDF4JにおけるSPIN可能なリポジトリを作成します。鉱山をクリアRDF4Jワークベンチ([変更]→[クリア)
  2. RDF4Jワークベンチを使用してロードpub7.rdfを使用してリポジトリ
  3. TakeRDF4J4SPIN(リポジトリ→新しいリポジトリ)と命名されました...このRDFファイルは、ファイルの先頭に関連するすべてのプレフィックスを定義することを

を(未確認コンテキスト識別子として使用するベースURI/wの追加→変更)注:

<?xml version="1.0"?> 
<rdf:RDF 
    xmlns:fn="http://www.w3.org/2005/xpath-functions#" 
    xmlns:soo="http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#" 
    xmlns:spolicy="http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/spolicy#" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:spin="http://spinrdf.org/spin#" 
    xmlns:sp="http://spinrdf.org/sp#" 
    xmlns:smf="http://topbraid.org/sparqlmotionfunctions#" 
    xmlns:owl="http://www.w3.org/2002/07/owl#" 
    xmlns:arg="http://spinrdf.org/arg#" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 
    xmlns:pub7="http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#" 
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" 
    xmlns:spl="http://spinrdf.org/spl#" 
    xml:base="http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7"> 

もSPINコンストラクタが取り付けられていることに注意してくださいクラスpub7:Pub7TestClassにある:

CONSTRUCT { 
    ?this spin:hasConstraintViolation _:b0 . 
    _:b0 a spin:ConstraintViolation ; 
     rdfs:label "Test message." ; 
     spin:violationRoot ?this ; 
     spin:violationLevel spin:Error ; 
     spolicy:sPActionRecordHasTimestamp ?timestamp . 
} 
WHERE { 
    BIND(now() AS ?timestamp) . 
} 
pub7:Pub7TestClassのインスタンスを作成する
  • 試み<オール= "4" を起動> ...
  • 私が原因実行しようとするRDF4Jワークベンチで報告された接頭辞未定義エラーになるはずである

    PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#> 
    PREFIX pub7: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#> 
    
    INSERT DATA { 
        inst:aPub7TestClassInstance_test1 a pub7:Pub7TestClass . 
    } 
    

    ...インスタンスを作成するためにRDF4Jワークベンチの[変更]→[SPARQLアップデートでこのSPARQL更新クエリを使用

    コンストラクタ上方sp:text SPARQLソースコード表現に基づい:

    org.eclipse.rdf4j.query.UpdateExecutionException: org.eclipse.rdf4j.repository.RepositoryException: org.eclipse.rdf4j.sail.SailException: org.eclipse.rdf4j.query.MalformedQueryException: org.eclipse.rdf4j.query.parser.sparql.ast.VisitorException: QName 'spin:hasConstraintViolation' uses an undefined prefix 
    
  • 現在使用RDF4JからSPINコンストラクタsp:textを隠す
      次のSPARQL更新クエリ:

    です。

    PREFIX sp: <http://spinrdf.org/sp#> 
    PREFIX soo: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#> 
    DELETE { 
        ?originalPolicyURI sp:systemProperty ?policySourceCodeString . 
        ?originalPolicyURI sp:text ?policySourceCodeString . 
    } 
    INSERT { 
        ?originalPolicyURI soo:policySourceCode ?policySourceCodeString . 
    } 
    WHERE { 
        ?originalPolicyURI sp:text ?policySourceCodeString . 
    } 
    

    すぐテストクラスをインスタンス化するステップ4に示すSPARQL更新クエリを再実行

  • 。今回は更新クエリをエラーなく実行する必要があります。

  • RDF4J WorkbenchのExplore→Explore機能を使用して、作成したインスタンシエーション/個人を確認してください。inst:aPub7TestClassInstance_test1。テストコンストラクタが実際にsp:text表現なしでこの時間実行したことを示す証拠を提供して、spin:hasConstratintViolationプロパティを介してインスタンス化に制約違反通知があることがわかるはずであり、強制的にSPINコンストラクタのRDFトークン化表現を使用する必要があります。

  • 答えて

    0

    スピンルールにプレフィックスを含めることに関する私の二次的な問題に対処するために、部分的で洗練された回避策があります。初期化のステップとして、次のSPARQL更新クエリを実行して、sp:text文字列のそれぞれに必要なプレフィックスを追加します。もちろん、この回避策は、私が使用しているプレフィックスマッピングをクエリーに埋め込むため、限られています。他の接頭辞が必要な場合は、以下の照会を編集して新しい照会定義を組み込む必要があります。

    クラス/ルール/プロパティ定義のオントロジーがRDF4Jにロードされた後で、私のインスタンス化をロードする前に、初期化のステップとして使用しているSPARQL Updateクエリは次のとおりです。 (インスタンスのオントロジーはSPINのコンストラクタを呼び出すことから始まるので、タイミングが重要である。)

    PREFIX sp: <http://spinrdf.org/sp#> 
    
    DELETE { 
        ?rule sp:text ?ruleText . 
    } 
    INSERT { 
        ?rule sp:text ?newRuleText . 
    } 
    WHERE { 
        ?rule sp:text ?ruleText . 
        BIND (IF (CONTAINS(?ruleText, "fn:"),  "PREFIX fn: <http://www.w3.org/2005/xpath-functions#>\n","") 
         AS ?prefixComponent00) . 
        BIND (IF (CONTAINS(?ruleText, "owl:"),  "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n","") 
         AS ?prefixComponent01) . 
        BIND (IF (CONTAINS(?ruleText, "spin:"), "PREFIX spin: <http://spinrdf.org/spin#>\n","") 
         AS ?prefixComponent02) . 
        BIND (IF (CONTAINS(?ruleText, "spl:"),  "PREFIX spl: <http://spinrdf.org/spl#>\n","") 
         AS ?prefixComponent03) . 
        BIND (IF (CONTAINS(?ruleText, "sp:"),  "PREFIX sp: <http://spinrdf.org/sp#>\n","") 
         AS ?prefixComponent04) . 
        BIND (IF (CONTAINS(?ruleText, "par:"),  "PREFIX par: <http://parliament.semwebcentral.org/parliament#>\n","") 
         AS ?prefixComponent05) . 
        BIND (IF (CONTAINS(?ruleText, "rdf:"),  "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n","") 
         AS ?prefixComponent06) . 
        BIND (IF (CONTAINS(?ruleText, "rdfs:"), "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n","") 
         AS ?prefixComponent07) . 
        BIND (IF (CONTAINS(?ruleText, "time:"), "PREFIX time: <http://www.w3.org/2006/time#>\n","") 
         AS ?prefixComponent08) . 
        BIND (IF (CONTAINS(?ruleText, "xsd:"),  "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n","") 
         AS ?prefixComponent09) . 
        BIND (IF (CONTAINS(?ruleText, "geo:"),  "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n","") 
         AS ?prefixComponent10) . 
        BIND (IF (CONTAINS(?ruleText, "geof:"), "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n:","") 
         AS ?prefixComponent11) . 
        BIND (IF (CONTAINS(?ruleText, "inst:"), "PREFIX inst: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/Instantiations#>\n","") 
         AS ?prefixComponent12) . 
        BIND (IF (CONTAINS(?ruleText, "pub7:"), "PREFIX pub7: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub7#>\n","") 
         AS ?prefixComponent13) . 
        BIND (IF (CONTAINS(?ruleText, "pub8:"), "PREFIX pub8: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Interface/Pub8#>\n","") 
         AS ?prefixComponent14) . 
        BIND (IF (CONTAINS(?ruleText, "soo:"),  "PREFIX soo: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/SpectrumOperationsOntology#>\n","") 
         AS ?prefixComponent15) . 
        BIND (IF (CONTAINS(?ruleText, "spolicy:"), "PREFIX spolicy: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/spolicy#>\n","") 
         AS ?prefixComponent16) . 
        BIND (IF (CONTAINS(?ruleText, "sharing:"), "PREFIX sharing: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/sharing#>\n","") 
         AS ?prefixComponent17) . 
        BIND (IF (CONTAINS(?ruleText, "dd1494:"), "PREFIX dd1494: <http://www.disa.mil/dso/a2i/ontologies/PBSM/Sharing/dd1494#>\n","") 
         AS ?prefixComponent18) . 
        BIND (IF (CONTAINS(?ruleText, "Nuvio:"), "PREFIX Nuvio: <http://cogradio.org/ont/Nuvio.owl#>\n","") 
         AS ?prefixComponent19) . 
        BIND (IF (CONTAINS(?ruleText, "CRO2:"), "PREFIX CRO2: <http://cogradio.org/ont/CRO2.owl#>\n","") 
         AS ?prefixComponent20) . 
        BIND (IF (CONTAINS(?ruleText, "olo:"),  "PREFIX olo: <http://purl.org/ontology/olo/core#>\n","") 
         AS ?prefixComponent21) . 
        BIND (CONCAT( 
         ?prefixComponent00, 
         ?prefixComponent01, 
         ?prefixComponent02, 
         ?prefixComponent03, 
         ?prefixComponent04, 
         ?prefixComponent05, 
         ?prefixComponent06, 
         ?prefixComponent07, 
         ?prefixComponent08, 
         ?prefixComponent09, 
         ?prefixComponent10, 
         ?prefixComponent11, 
         ?prefixComponent12, 
         ?prefixComponent13, 
         ?prefixComponent14, 
         ?prefixComponent15, 
         ?prefixComponent16, 
         ?prefixComponent17, 
         ?prefixComponent18, 
         ?prefixComponent19, 
         ?prefixComponent20, 
         ?prefixComponent21 
        ) AS ?prefixes) . 
        BIND (CONCAT(?prefixes, "\n", ?ruleText) AS ?newRuleText) . 
    } 
    

    接頭辞の定義が埋め込まれた文字列に含まれる起こった場合には上記のクエリは、偽陽性をもとに接頭辞の定義が含まれる可能性がありますまたはコメント。たとえば、リテラル"Greg’s solo: five measures"^^xsd:stringは、恐らく上記のクエリに接頭辞olo:の定義を含めることになります。ただし、必須ではない接頭辞を含めることで、パフォーマンスに大きな影響はなく、正確性には影響しませんでした。上のクエリで一致する単純なCONTAINSの代わりに正規表現を使うと、より良い結果が得られます。