単純なリテラル オブジェクトを含む 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-Triples、Turtle、RDF 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 の方法はありますか?