为了从python在ApacheJena中存储一些数据,我想进行一个从DICT列表到RDF的通用转换,并可能返回查询
对于Dict到RDF的列表,我尝试了实现“insertListofDicts”(见下文) 并使用“testListOfDictInsert”对其进行了测试(见下文)。 结果如下,当使用ApacheJena Fuseki服务器进行尝试时,会导致400:Bad请求
对于简单字符串类型,以及对于其他基本Python类型,需要修复哪些问题才能使其正常工作?
请在以下网址查找源代码:
@prefix foaf: <http://xmlns.com/foaf/0.1/>
INSERT DATA {
foaf:Person/Elizabeth+Alexandra+Mary+Windsor foaf:Person#name "Elizabeth Alexandra Mary Windsor".
foaf:Person/Elizabeth+Alexandra+Mary+Windsor foaf:Person#born "1926-04-21".
foaf:Person/Elizabeth+Alexandra+Mary+Windsor foaf:Person#wikidataurl "https://www.wikidata.org/wiki/Q9682".
foaf:Person/George+of+Cambridge foaf:Person#name "George of Cambridge".
foaf:Person/George+of+Cambridge foaf:Person#born "2013-07-22".
foaf:Person/George+of+Cambridge foaf:Person#wikidataurl "https://www.wikidata.org/wiki/Q1359041".
foaf:Person/Harry+Duke+of+Sussex foaf:Person#name "Harry Duke of Sussex".
foaf:Person/Harry+Duke+of+Sussex foaf:Person#born "1984-09-15".
foaf:Person/Harry+Duke+of+Sussex foaf:Person#wikidataurl "https://www.wikidata.org/wiki/Q152316".
}
testListOfDictInsert
def testListOfDictInsert(self):
'''
test inserting a list of Dicts using FOAF example
https://en.wikipedia.org/wiki/FOAF_(ontology)
'''
listofDicts=[
{'name': 'Elizabeth Alexandra Mary Windsor', 'born': '1926-04-21', 'age': 94, 'ofAge': True , 'wikidataurl': 'https://www.wikidata.org/wiki/Q9682' },
{'name': 'George of Cambridge', 'born': '2013-07-22', 'age': 7, 'ofAge': False, 'wikidataurl': 'https://www.wikidata.org/wiki/Q1359041'},
{'name': 'Harry Duke of Sussex', 'born': '1984-09-15', 'age': 36, 'ofAge': True , 'wikidataurl': 'https://www.wikidata.org/wiki/Q152316'}
]
jena=self.getJena(mode='update',debug=True)
jena.insertListOfDicts(listofDicts,'foaf:Person','name','@prefix foaf: <http://xmlns.com/foaf/0.1/>')
插入图片列表
def insertListOfDicts(self,listOfDicts,entityType,primaryKey,prefixes):
'''
insert the given list of dicts mapping datatypes according to
https://www.w3.org/TR/xmlschema-2/#built-in-datatypes
mapped from
https://docs.python.org/3/library/stdtypes.html
compare to
https://www.w3.org/2001/sw/rdb2rdf/directGraph/
http://www.bobdc.com/blog/json2rdf/
https://www.w3.org/TR/json-ld11-api/#data-round-tripping
https://stackoverflow.com/questions/29030231/json-to-rdf-xml-file-in-python
'''
errors=[]
insertCommand='%s\nINSERT DATA {\n' % prefixes
for index,record in enumerate(listOfDicts):
if not primaryKey in record:
errors.append["missing primary key %s in record %d",index]
else:
primaryValue=record[primaryKey]
encodedPrimaryValue=urllib.parse.quote_plus(primaryValue)
tSubject="%s/%s" %(entityType,encodedPrimaryValue)
for keyValue in record.items():
key,value=keyValue
valueType=type(value)
if self.debug:
print("%s(%s)=%s" % (key,valueType,value))
tPredicate="%s#%s" % (entityType,key)
tObject=value
if valueType == str:
insertCommand+=' %s %s "%s".\n' % (tSubject,tPredicate,tObject)
insertCommand+="\n}"
if self.debug:
print (insertCommand)
self.insert(insertCommand)
return errors
以下代码至少可以工作,并且具有正确的“往返”行为。从DICT列表插入的数据可以使用相应的quer检索。请评论更多改进或添加更好的答案
如果您总是希望获得typedLiterals,那么现在可以在Jena包装器类的构造函数中指定它
在类型化文字模式下,单元测试插入为:
类型
用于正确的“往返”行为的数字文字
当文字模式为off类型时,文字仅用于日期:
testListOfDictInsert
插入图片列表
+
是HTTP表单编码中空格的特殊字符,但它只应在application/x-www-form-urlencoded
中使用对于URI,使用
%20
或决定替换字符,例如_
作为空格,因为它看起来有点像空格在所有这些情况下,URI中没有空格字符-有
+
、%20
(三个字符)或_
。这是一种编码,而不是一种逃避机制相关问题 更多 >
编程相关推荐