我在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中的两个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
,因为添加字符串被解释为字符串连接(至少在我尝试过的Jena中;在其他SPARQL引擎中,添加两个字符串可能是错误,不返回任何内容)。
如您所见,使用正确的数据类型对于将您的意图传达给使用数据的代码非常重要。 SPARQL示例非常清楚,但是当直接使用RDF API时,会出现同样的问题,包括对象标识,排序等。
如上面的示例所示,SPARQL为xsd:string
,xsd:integer
和xsd:decimal
提供了方便的语法(对于xsd:boolean
和语言标记的字符串,没有显示)。这会将这些数据类型提升到其他数据类型之上。