RDF中的三重复制,权威观点?

时间:2009-12-08 06:12:21

标签: rdf triplestore

如果三重商店包含两倍于相同的三元组,那么(如果存在)关于此冗余的权威位置是什么?

此外,是否允许三元组在同一上下文中存储两次相同的三元组?

我问这个是因为在rdflib显然你可以存储两次(或更多)相同的三倍。这是读者

import rdflib
from rdflib import store

s = rdflib.plugin.get('MySQL', store.Store)('rdfstore')

config_string = "host=localhost,password=foo,user=foo,db=foo"
rt = s.open(config_string,create=False)
if rt != store.VALID_STORE:
    s.open(config_string,create=True)

graph = rdflib.ConjunctiveGraph(s, identifier = rdflib.URIRef("urn:uuid:a19f9b78-cc43-4866-b9a1-4b009fe91f52"))
rows = graph.query("SELECT ?id ?value { ?id <http://localhost#ha> ?value . }")
for r in rows:
    print r[0], r[1]

这是作家

import rdflib
from rdflib import store

s = rdflib.plugin.get('MySQL', store.Store)('rdfstore')

config_string = "host=localhost,password=foo,user=foo,db=foo"
rt = s.open(config_string,create=False)
if rt != store.VALID_STORE:
    s.open(config_string,create=True)

graph = rdflib.ConjunctiveGraph(s, identifier = rdflib.URIRef("urn:uuid:a19f9b78-cc43-4866-b9a1-4b009fe91f52"))
graph.add( ( rdflib.URIRef("http://localhost/1000"), rdflib.URIRef("http://localhost#ha"), rdflib.Literal("18")) )
graph.commit()

这是我获得的

sbo@dhcp-045:~/tmp/gd $ python ./reader2.py 
table kb_7b066eca61_relations Doesn't exist
table kb_7b066eca61_relations Doesn't exist
sbo@dhcp-045:~/tmp/gd $ python ./reader2.py 
sbo@dhcp-045:~/tmp/gd $ python ./reader2.py 
sbo@dhcp-045:~/tmp/gd $ python ./writer2.py 
sbo@dhcp-045:~/tmp/gd $ python ./reader2.py 
http://localhost/1000 18
sbo@dhcp-045:~/tmp/gd $ python ./writer2.py 
sbo@dhcp-045:~/tmp/gd $ python ./reader2.py 
http://localhost/1000 18
http://localhost/1000 18

对我而言,这似乎是一个错误。修改后的版本告诉我两个三元组属于同一个上下文,并且确实有两个三元组

len : 2
http://localhost/1000 18
http://localhost/1000 18
(rdflib.URIRef('http://localhost/1000'), rdflib.URIRef('http://localhost#ha'), rdflib.Literal(u'18'), <Graph identifier=urn:uuid:a19f9b78-cc43-4866-b9a1-4b009fe91f52 (<class 'rdflib.Graph.Graph'>)>)
(rdflib.URIRef('http://localhost/1000'), rdflib.URIRef('http://localhost#ha'), rdflib.Literal(u'18'), <Graph identifier=urn:uuid:a19f9b78-cc43-4866-b9a1-4b009fe91f52 (<class 'rdflib.Graph.Graph'>)>)

3 个答案:

答案 0 :(得分:7)

RDF三重存储是一组三元组,因此根据定义,相同的三元组不能出现两次。但是,大多数rdf存储实际上是四元存储(rdf图形集也称为数据集),在这种情况下,三元组可能会出现多次。这有时被称为上下文,具体取决于商店(例如我的,Redland)。权限取决于用户定义特定图形名称/上下文名称的含义。

答案 1 :(得分:2)

应该记住,任何特定三元组可能具有与其他三元组不同的元数据 - 否则相同 - 三元组。元数据,例如三元组的原始来源,可能的连接信息强度等等。仅计算三元组的拷贝数以便判断连接的相对强度与其他可能的矛盾连接相比也是可行的。因此,一如既往,这一切都取决于您打算如何处理数据。

答案 2 :(得分:1)

RDF是一种用于表达事实声明的语言,可以组织并分组为图形。如果图形包含两次“Alice is a Person”,那只是多余的。因此,在图表中,三元组被标准化;重复它们是没有意义的。但是,应用程序,商店和SPARQL可查询系统通常会收集来自不同来源的事实声明。当您想要采用多图形视角并在不同来源中查找相同的三元组时,SPARQL语言具有“GRAPH”关键字。