如何防止三元组在以编程方式上传到 Dydra 时混淆?
How to prevent triples from getting mixed up while uploading to Dydra programmatically?
我正在尝试从我计算机上的芝麻三重存储将一些数据上传到 Dydra。虽然从 Sesame 下载工作正常,但三元组会混淆(当一个对象成为另一个对象时,s-p-o 关系会发生变化)。有人可以解释为什么会发生这种情况以及如何解决吗?代码如下:
#Querying the triplestore to retrieve all results
sesameSparqlEndpoint = 'http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name'
sparql = SPARQLWrapper(sesameSparqlEndpoint)
queryStringDownload = 'SELECT * WHERE {?s ?p ?o}'
dataGraph = Graph()
sparql.setQuery(queryStringDownload)
sparql.method = 'GET'
sparql.setReturnFormat(JSON)
output = sparql.query().convert()
print output
for i in range(len(output['results']['bindings'])):
#The encoding is necessary to parse non-English characters
output['results']['bindings'][i]['s']['value'].encode('utf-8')
try:
subject_extract = output['results']['bindings'][i]['s']['value']
if 'http' in subject_extract:
subject = "<" + subject_extract + ">"
subject_url = URIRef(subject)
print subject_url
predicate_extract = output['results']['bindings'][i]['p']['value']
if 'http' in predicate_extract:
predicate = "<" + predicate_extract + ">"
predicate_url = URIRef(predicate)
print predicate_url
objec_extract = output['results']['bindings'][i]['o']['value']
if 'http' in objec_extract:
objec = "<" + objec_extract + ">"
objec_url = URIRef(objec)
print objec_url
else:
objec = objec_extract
objec_wip = '"' + objec + '"'
objec_url = URIRef(objec_wip)
# Loading the data on a graph
dataGraph.add((subject_url,predicate_url,objec_url))
except UnicodeError as error:
print error
#Print all statements in dataGraph
for stmt in dataGraph:
pprint.pprint(stmt)
# Upload to Dydra
URL = 'http://dydra.com/login'
key = 'my_key'
with requests.Session() as s:
resp = s.get(URL)
soup = BeautifulSoup(resp.text,"html5lib")
csrfToken = soup.find('meta',{'name':'csrf-token'}).get('content')
# print csrf_token
payload = {
'account[login]':key,
'account[password]':'',
'csrfmiddlewaretoken':csrfToken,
'next':'/'
}
# print payload
p = s.post(URL,data=payload, headers=dict(Referer=URL))
# print p.text
r = s.get('http://dydra.com/username/rep_name/sparql')
# print r.text
dydraSparqlEndpoint = 'http://dydra.com/username/rep_name/sparql'
for stmt in dataGraph:
queryStringUpload = 'INSERT DATA {%s %s %s}' % stmt
sparql = SPARQLWrapper(dydraSparqlEndpoint)
sparql.setCredentials(key,key)
sparql.setQuery(queryStringUpload)
sparql.method = 'POST'
sparql.query()
复制数据的一种更简单的方法(除了使用 CONSTRUCT 查询而不是 SELECT,就像我在评论中提到的那样)就是让 Dydra 本身直接访问您的 Sesame 端点,因为通过 SERVICE-clause 的示例。
在您的 Dydra 数据库上执行以下操作,并且(一段时间后,取决于您的 Sesame 数据库有多大),所有内容都将被复制过来:
INSERT { ?s ?p ?o }
WHERE {
SERVICE <http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name>
{ ?s ?p ?o }
}
如果以上方法在 Dydra 上不起作用,您也可以使用 URI http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name/statements
从您的 Sesame 商店直接访问 RDF 语句。假设 Dydra 有一个上传功能,您可以在其中提供 RDF 文档的 URL,您可以简单地向它提供上述 URI,它应该能够加载它。
如果进行以下更改,上面的代码可以工作:
- 使用 CONSTRUCT 查询而不是 SELECT。详情在这里 -> How to iterate over CONSTRUCT output from rdflib?
- 使用密钥作为帐户[登录名]和帐户[密码]的输入
但是,这可能不是最有效的方法。首先,对每个三元组进行单独的 INSERT 并不是一个好方法。 Dydra 不会以这种方式记录所有语句(我只插入了大约 30% 的三元组)。相反,使用Jeen建议的http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name/statements
方法使我能够成功移植所有数据。
我正在尝试从我计算机上的芝麻三重存储将一些数据上传到 Dydra。虽然从 Sesame 下载工作正常,但三元组会混淆(当一个对象成为另一个对象时,s-p-o 关系会发生变化)。有人可以解释为什么会发生这种情况以及如何解决吗?代码如下:
#Querying the triplestore to retrieve all results
sesameSparqlEndpoint = 'http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name'
sparql = SPARQLWrapper(sesameSparqlEndpoint)
queryStringDownload = 'SELECT * WHERE {?s ?p ?o}'
dataGraph = Graph()
sparql.setQuery(queryStringDownload)
sparql.method = 'GET'
sparql.setReturnFormat(JSON)
output = sparql.query().convert()
print output
for i in range(len(output['results']['bindings'])):
#The encoding is necessary to parse non-English characters
output['results']['bindings'][i]['s']['value'].encode('utf-8')
try:
subject_extract = output['results']['bindings'][i]['s']['value']
if 'http' in subject_extract:
subject = "<" + subject_extract + ">"
subject_url = URIRef(subject)
print subject_url
predicate_extract = output['results']['bindings'][i]['p']['value']
if 'http' in predicate_extract:
predicate = "<" + predicate_extract + ">"
predicate_url = URIRef(predicate)
print predicate_url
objec_extract = output['results']['bindings'][i]['o']['value']
if 'http' in objec_extract:
objec = "<" + objec_extract + ">"
objec_url = URIRef(objec)
print objec_url
else:
objec = objec_extract
objec_wip = '"' + objec + '"'
objec_url = URIRef(objec_wip)
# Loading the data on a graph
dataGraph.add((subject_url,predicate_url,objec_url))
except UnicodeError as error:
print error
#Print all statements in dataGraph
for stmt in dataGraph:
pprint.pprint(stmt)
# Upload to Dydra
URL = 'http://dydra.com/login'
key = 'my_key'
with requests.Session() as s:
resp = s.get(URL)
soup = BeautifulSoup(resp.text,"html5lib")
csrfToken = soup.find('meta',{'name':'csrf-token'}).get('content')
# print csrf_token
payload = {
'account[login]':key,
'account[password]':'',
'csrfmiddlewaretoken':csrfToken,
'next':'/'
}
# print payload
p = s.post(URL,data=payload, headers=dict(Referer=URL))
# print p.text
r = s.get('http://dydra.com/username/rep_name/sparql')
# print r.text
dydraSparqlEndpoint = 'http://dydra.com/username/rep_name/sparql'
for stmt in dataGraph:
queryStringUpload = 'INSERT DATA {%s %s %s}' % stmt
sparql = SPARQLWrapper(dydraSparqlEndpoint)
sparql.setCredentials(key,key)
sparql.setQuery(queryStringUpload)
sparql.method = 'POST'
sparql.query()
复制数据的一种更简单的方法(除了使用 CONSTRUCT 查询而不是 SELECT,就像我在评论中提到的那样)就是让 Dydra 本身直接访问您的 Sesame 端点,因为通过 SERVICE-clause 的示例。
在您的 Dydra 数据库上执行以下操作,并且(一段时间后,取决于您的 Sesame 数据库有多大),所有内容都将被复制过来:
INSERT { ?s ?p ?o }
WHERE {
SERVICE <http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name>
{ ?s ?p ?o }
}
如果以上方法在 Dydra 上不起作用,您也可以使用 URI http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name/statements
从您的 Sesame 商店直接访问 RDF 语句。假设 Dydra 有一个上传功能,您可以在其中提供 RDF 文档的 URL,您可以简单地向它提供上述 URI,它应该能够加载它。
如果进行以下更改,上面的代码可以工作:
- 使用 CONSTRUCT 查询而不是 SELECT。详情在这里 -> How to iterate over CONSTRUCT output from rdflib?
- 使用密钥作为帐户[登录名]和帐户[密码]的输入
但是,这可能不是最有效的方法。首先,对每个三元组进行单独的 INSERT 并不是一个好方法。 Dydra 不会以这种方式记录所有语句(我只插入了大约 30% 的三元组)。相反,使用Jeen建议的http://my.ip.ad.here:8080/openrdf-sesame/repositories/rep_name/statements
方法使我能够成功移植所有数据。