gpt4 book ai didi

c# - 如何比较 dotnetrdf 中的简单文字和类型文字?

转载 作者:太空狗 更新时间:2023-10-30 00:49:09 24 4
gpt4 key购买 nike

我正在比较两个图表,一个来自具有简单文字对象的 Turtle 文件,另一个来自具有显式数据类型 IRI 的文件。这些图在其他方面是相等的。

图 A:

<s> <p> "o"

图 B:

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

根据 RDF 1.1 (3.3 Literals) , “[s] 简单文字是数据类型为 IRI http://www.w3.org/2001/XMLSchema#string 的抽象语法文字的语法糖”。这也反射(reflect)在具体的语法规范中(N-TriplesTurtleRDF XML)。

所以我希望我的两个图都由一个三元组组成,该三元组具有一个 URI 节点 s 主题、一个 URI 节点 p 谓词和一个文字节点 o 类型为 xsd:string 对象。基于此,我预计两者之间没有区别。

然而实际情况并非如此:

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);

差异报告中有一个添加和一个删除的三元组。这些图不同,因为对象节点的数据类型不同:graphA.Triples.First().Object.Datatype 什么都没有,而 graphB.Triples.First().Object。数据类型 是正确的 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);
}

dotnetrdf 中是否有一种方法可以以符合 RDF 1.1 的方式将简单文字与类型化文字进行比较,而无需像上面那样诉诸重大重写或解决方法?

最佳答案

dotNetRDF 不符合 RDF 1.1,我们也未声称符合。有一个分支被重写为兼容,但它不是远程生产就绪的。

假设您控制解析过程,您可以使用 RDF Handlers API 自定义传入数据的处理。 .然后,您可以根据需要通过覆盖 HandleTriple(Triple t) 方法,在隐式 xsd:string 类型文字进入系统时去除它们。

关于c# - 如何比较 dotnetrdf 中的简单文字和类型文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40027774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com