Sparql 在RDF图中为文字定义数据类型的好处是什么?

Sparql 在RDF图中为文字定义数据类型的好处是什么?,sparql,rdf,rdflib,Sparql,Rdf,Rdflib,我正在Python中使用rdflib构建我的第一个rdf图。但是,我不理解定义文字数据类型的明确目的。我已经浏览了文档,并对谷歌和stackoverflow搜索进行了尽职调查,但我似乎找不到对此的实际解释。为什么不把一切都当作一个简单的老字眼呢 从我所做的实验来看,这是为了让您可以使用BIND在Sparql查询中搜索显式术语吗?这也有助于过滤吗?i、 e.过滤器(?var1>?var2),其中var1和var2应表示整数/浮点数/etc?这有助于提高查询速度吗?还是我就差一点 具体来说,为什么要

我正在Python中使用rdflib构建我的第一个rdf图。但是,我不理解定义文字数据类型的明确目的。我已经浏览了文档,并对谷歌和stackoverflow搜索进行了尽职调查,但我似乎找不到对此的实际解释。为什么不把一切都当作一个简单的老字眼呢

从我所做的实验来看,这是为了让您可以使用BIND在Sparql查询中搜索显式术语吗?这也有助于过滤吗?i、 e.过滤器(?var1>?var2),其中var1和var2应表示整数/浮点数/etc?这有助于提高查询速度吗?还是我就差一点

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

mygraph.add((amazingrdf, ns['hasValue'], Literal('42.0', datatype=XSD.float)))
而不仅仅是这个

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

我怀疑我一定忽略了什么目的。我感谢你的帮助和解释-我想在第一次就正确地了解这一点!谢谢

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

ASK { FILTER (9 < 15) }
结果:false,因为在对字符串排序时,9在1之后

使用
xsd:decimal
进行一些相等性检查:

ASK { FILTER (+1.000 = 01.0) }
结果是真的,是相同的数字。现在使用
xsd:string

ASK { FILTER ("9" < "15") }
ASK { FILTER ("+1.000" = "01.0") }
False,因为它们显然是不同的字符串

xsd:integer做数学题

SELECT (1+1 AS ?result) {}
它返回2(作为
xsd:integer
)。现在是字符串:

SELECT ("1"+"1" AS ?result) {}
它以
xsd:string
的形式返回“11”,因为添加字符串被解释为字符串连接(至少在我尝试此操作的Jena中是这样;在其他SPARQL引擎中,添加两个字符串可能是错误的,不会返回任何结果)

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


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

好的,因此我现在的理解是,我应该始终定义一个数据类型,而不是将其作为一个简单的旧文本,因为它使Sparql引擎清楚地了解了数据的意图。谢谢你周到的回答!正确的!如果是数字、布尔值、日期等,那么数据类型应该反映这一点。我认为
Literal(“a”)
Literal(“a”,datatype=XSD.string)
在rdflib中基本上是一样的(它们在SPARQL中是一样的),所以如果它是一个字符串,那么省略数据类型就可以了。是的-
XSD:string+XSD:string
在SPARQL规范中是一个错误,因此它是允许的函数扩展。对于不需要完全实现数据类型的其他XSD数据类型也是如此。