2016-10-13 2 views
4

私は2つのグラフを比較しています.1つは単純なリテラルオブジェクトを含むTurtleファイルからのもので、明示的なデータ型IRIを持つファイルからのものです。他の点でグラフは等しい。dotnetrdfのシンプルリテラルと型付きリテラルを比較するには?

グラフA:

<s> <p> "o" 

グラフB:

<s> <p> "o"^^xsd:string 

RDF 1.1 (3.3 Literals)によれば、 "[S] impleリテラルは、データ型IRI http://www.w3.org/2001/XMLSchema#stringと抽象構文リテラルの糖衣構文です"。これは、具体的な構文仕様(N-TriplesTurtleRDF XML)にも反映されています。

だから私は両方の私のグラフタイプXSDで oをURIノード件名、URIノードP述語、およびリテラルノードを持つ単一のトリプルで構成することを期待したい:文字列オブジェクト。これに基づいて私は2つの間に違いがないと思うだろう。

しかし、これは実際にはそうではありません。

var graphStringA = "<http://example.com/subject> <http://example.com/predicate> \"object\"."; 
var graphStringB = "<http://example.com/subject> <http://example.com/predicate> \"object\"^^<http://www.w3.org/2001/XMLSchema#string>."; 

var graphA = new Graph(); 
var graphB = new Graph(); 

StringParser.Parse(graphA, graphStringA); 
StringParser.Parse(graphB, graphStringB); 

var diff = graphA.Difference(graphB); 

追加1との差分レポートのトリプル取り除か1があります。オブジェクトノードのデータ型が異なるため、グラフは異なります。graphA.Triples.First().Object.Datatypeは何も表示されず、graphB.Triples.First().Object.Datatypeは正しいURIです。


私がダウンしLiteralNodeへのすべての道を行く(リテラルのノードについて、その仮定を変更する)のいずれか

  • にあるんだけど、この動作を変更するために私それに表示され、または
  • 作成します新しいGraphDiff(これは、文字列リテラルのデフォルトのデータ型を考慮に入れます)。

この問題を回避するには、「デフォルト」のデータ型削除することです:

private static void RemoveDefaultDatatype(IGraph g) 
{ 
    var triplesWithDefaultDatatype = 
     from triple in g.Triples 
     where triple.Object is ILiteralNode 
     let literal = triple.Object as ILiteralNode 
     where literal.DataType != null 
     where literal.DataType.AbsoluteUri == "http://www.w3.org/2001/XMLSchema#string" || literal.DataType.AbsoluteUri == "http://www.w3.org/2001/XMLSchema#langString" 
     select triple; 

    var triplesWithNoDatatype = 
     from triple in triplesWithDefaultDatatype 
     let literal = triple.Object as ILiteralNode 
     select new Triple(
      triple.Subject, 
      triple.Predicate, 
      g.CreateLiteralNode(
       literal.Value, 
       literal.Language)); 

    g.Assert(triplesWithNoDatatype.ToArray()); 
    g.Retract(triplesWithDefaultDatatype); 
} 

をせずに、RDF 1.1との一貫性のある方法で、型付きリテラルにシンプルなリテラルを比較するdotnetrdfにおける方法はあります上記のような大きな書き直しや回避策に頼っていますか?

答えて

3

dotNetRDFはRDF 1.1に準拠していないと主張しています。準拠するように書き直された支店がありますが、リモートで生産準備ができていません。

構文解析プロセスを制御するとしたら、RDF Handlers APIを使用して着信データの処理をカスタマイズできます。次に、HandleTriple(Triple t)メソッドを必要に応じてオーバーライドすることで、暗黙的にxsd:string型のリテラルをシステムに渡す際に、それを取り除くことができます。ハンドラのAPIを使用して

3

RobVの答えどおり:

class StripStringHandler : BaseRdfHandler, IWrappingRdfHandler 
{ 
    protected override bool HandleTripleInternal(Triple t) 
    { 
     if (t.Object is ILiteralNode) 
     { 
      var literal = t.Object as ILiteralNode; 

      if (literal.DataType != null && (literal.DataType.AbsoluteUri == "http://www.w3.org/2001/XMLSchema#string" || literal.DataType.AbsoluteUri == "http://www.w3.org/2001/XMLSchema#langString")) 
      { 
       var simpleLiteral = this.CreateLiteralNode(literal.Value, literal.Language); 

       t = new Triple(t.Subject, t.Predicate, simpleLiteral); 
      } 
     } 

     return this.handler.HandleTriple(t); 
    } 

    private IRdfHandler handler; 

    public StripStringHandler(IRdfHandler handler) : base(handler) 
    { 
     this.handler = handler; 
    } 

    public IEnumerable<IRdfHandler> InnerHandlers 
    { 
     get 
     { 
      return this.handler.AsEnumerable(); 
     } 
    } 

    protected override void StartRdfInternal() 
    { 
     this.handler.StartRdf(); 
    } 

    protected override void EndRdfInternal(bool ok) 
    { 
     this.handler.EndRdf(ok); 
    } 

    protected override bool HandleBaseUriInternal(Uri baseUri) 
    { 
     return this.handler.HandleBaseUri(baseUri); 
    } 

    protected override bool HandleNamespaceInternal(string prefix, Uri namespaceUri) 
    { 
     return this.handler.HandleNamespace(prefix, namespaceUri); 
    } 

    public override bool AcceptsAll 
    { 
     get 
     { 
      return this.handler.AcceptsAll; 
     } 
    } 
} 

使用法:私はdotNetRDFに、この実装に貢献してきました

class Program 
{ 
    static void Main() 
    { 
     var graphA = Load("<http://example.com/subject> <http://example.com/predicate> \"object\"."); 
     var graphB = Load("<http://example.com/subject> <http://example.com/predicate> \"object\"^^<http://www.w3.org/2001/XMLSchema#string>."); 

     var diff = graphA.Difference(graphB); 

     Debug.Assert(diff.AreEqual); 
    } 

    private static IGraph Load(string source) 
    { 
     var result = new Graph(); 
     var graphHandler = new GraphHandler(result); 
     var strippingHandler = new StripStringHandler(graphHandler); 
     var parser = new TurtleParser(); 

     using (var reader = new StringReader(source)) 
     { 
      parser.Load(strippingHandler, reader); 
     } 

     return result; 
    } 
} 
+0

:https://github.com/dotnetrdf/dotnetrdf/blob /master/Libraries/dotNetRDF/Parsing/Handlers/StripStringHandler.cs –

関連する問題