我正在Python中使用rdflib来构建我的第一个rdf图。但是,我不明白定义文字数据类型的明确目的。我已经仔细阅读了文档,并通过谷歌和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")))
我怀疑我必须忽略某些目的。感谢您的帮助和解释-我想第一时间正确地学习!谢谢!
答案 0 :(得分:4)
比较SPARQL中的两个xsd:integer
值:
ASK { FILTER (9 < 15) }
结果:是。现在使用xsd:string
:
ASK { FILTER ("9" < "15") }
结果:false,因为对字符串进行排序时,9在1后面。
使用xsd:decimal
进行的一些相等性检查:
ASK { FILTER (+1.000 = 01.0) }
结果为true,它是相同的数字。现在使用xsd:string
:
ASK { FILTER ("+1.000" = "01.0") }
错误,因为它们显然是不同的字符串。
用xsd:integer
做一些数学运算:
SELECT (1+1 AS ?result) {}
它返回2(作为xsd:integer
)。现在是字符串:
SELECT ("1"+"1" AS ?result) {}
它以xsd:string
的形式返回“ 11”,因为添加字符串被解释为字符串连接(至少在我尝试过的Jena中;在其他SPARQL引擎中,添加两个字符串可能是错误,不返回任何内容)
如您所见,使用正确的数据类型对于传达您的意图与数据一起工作的代码很重要。 SPARQL示例清楚地说明了这一点,但是当直接使用RDF API时,围绕对象标识,排序等问题同样会出现。
如上面的示例所示,SPARQL为xsd:string
,xsd:integer
和xsd:decimal
(以及xsd:boolean
和带有语言标签的字符串,未显示)提供了方便的语法)。这将那些数据类型提升到了其他水平。