4

単純なリテラル オブジェクトを含む Turtle ファイルからのグラフと、明示的なデータ型 IRI を含むファイルからのグラフの 2 つのグラフを比較しています。それ以外の点では、グラフは等しいです。

グラフ 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 ) にも反映されています。

したがって、どちらのグラフも、URI ノードs の主語、URI ノードpの述語、およびxsd:stringオブジェクト型のリテラル ノードoを持つ単一のトリプルで構成されると予想されます。これに基づいて、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 の方法はありますか?

4

2 に答える 2

3

dotNetRDF は RDF 1.1 に準拠しておらず、準拠しているとは主張していません。準拠するように書き直されたブランチがありますが、リモートで本番環境に対応していません。

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

于 2016-10-14T13:30:31.263 に答える