【问题标题】:What is the benefit of defining datatypes for literals in an RDF graph?在 RDF 图中为文字定义数据类型有什么好处?
【发布时间】:2019-04-01 20:55:10
【问题描述】:

我在 Python 中使用 rdflib 来构建我的第一个 rdf 图。但是,我不明白定义 Literal 数据类型的明确目的。我已经翻阅了文档,并对谷歌和 stackoverflow 搜索进行了尽职调查,但我似乎找不到对此的实际解释。为什么不将所有内容都保留为普通的旧字面量?

根据我的实验,这是否可以让您使用 BIND 在 Sparql 查询中搜索显式术语?这对过滤也有帮助吗?即 FILTER (?var1 > ?var2),其中 var1 和 var2 应该代表整数/浮点数/等?对查询速度有帮助吗?还是我完全没有办法?

具体来说,为什么要在 mygraph 中添加以下三元组

mygraph.add((amazingrdf, ns['hasValue'], Literal('42.0', datatype=XSD.float)))

而不仅仅是这个?

mygraph.add((amazingrdf, ns['hasValue'], Literal("42.0")))

我怀疑我忽略了某些目的。感谢您的帮助和解释 - 我想第一次就学会这个!谢谢!

【问题讨论】:

    标签: sparql rdf rdflib


    【解决方案1】:

    比较 SPARQL 中的两个 xsd:integer 值:

    ASK { FILTER (9 < 15) }
    

    结果:是的。现在xsd:string:

    ASK { FILTER ("9" < "15") }
    

    结果:false,因为在对字符串进行排序时,9 在 1 之后。

    xsd:decimal 的一些相等性检查:

    ASK { FILTER (+1.000 = 01.0) }
    

    结果为真,是同一个数字。现在xsd:string:

    ASK { FILTER ("+1.000" = "01.0") }
    

    错误,因为它们显然是不同的字符串。

    xsd:integer做一些数学运算:

    SELECT (1+1 AS ?result) {}
    

    它返回 2(作为 xsd:integer)。现在是字符串:

    SELECT ("1"+"1" AS ?result) {}
    

    它返回“11”作为xsd:string,因为添加字符串被解释为字符串连接(至少在我尝试过的耶拿;在其他 SPARQL 引擎中,添加两个字符串可能是一个错误,不会返回任何内容)。

    如您所见,使用正确的数据类型对于将您的意图传达给处理数据的代码非常重要。 SPARQL 示例非常清楚地说明了这一点,但是当直接使用 RDF API 时,同样会出现围绕对象标识、排序等问题。

    如上面的示例所示,SPARQL 为xsd:stringxsd:integerxsd:decimal 提供了方便的语法(对于xsd:boolean 和语言标记的字符串,未显示)。这将这些数据类型提升到其他数据类型之上。

    【讨论】:

    • 好的,所以我现在的理解是我应该始终定义一个数据类型,而不是仅仅将其保留为普通的旧字面量,因为它使 Sparql 引擎清楚数据的意图。感谢您周到的回答!
    • 对!如果它是数字、布尔值、日期等,那么数据类型应该反映这一点。我认为 Literal("a")Literal("a", datatype=XSD.string) 在 rdflib 中基本上是相同的(它们在 SPARQL 中是相同的),所以如果它是一个字符串,那么省略数据类型可能会很好。
    • 是 - xsd:string + xsd:string 是 SPARQL 规范中的错误,因此它是允许的函数扩展。对于不需要完全实现数据类型的其他 XSD 数据类型也是如此。
    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    相关资源
    最近更新 更多