我创建了一个RDF文件,其中图像作为矩阵存储在节点中。 但是,当我尝试阅读它们时,我无法获得矩阵形式: 例如
from rflib import Literal
mm = np.random.normal(0,1,(3,3))
L = Literal(mm)
很容易得到矩阵 与L.value
In [494]: L
Out[494]: rdflib.term.Literal(u'[[-1.39304728 0.39093531 0.88042378]\n [ 0.22605682 0.56064787 -0.75176713]\n [ 0.57021203 0.31796492 -0.53303191]]')
In [495]: L.value
Out[495]:
array([[-1.39304728, 0.39093531, 0.88042378],
[ 0.22605682, 0.56064787, -0.75176713],
[ 0.57021203, 0.31796492, -0.53303191]])
但是当我执行存储在image_nodes中的SPARQL时,我得到:
In [501]: res = [q for q in image_nodes]
In [502]: res[0][0]
Out[502]: rdflib.term.Literal(u'[[ 0. 0. 0. ..., 0. 0. 0.]\n [ 0. 0. 0. ..., 0. 0. 0.]\n [ 0. 0. 0. ..., 0. 0. 0.]\n ..., \n [ 0. 0. 0. ..., 0. 0. 0.]\n [ 0. 0. 0. ..., 0. 0. 0.]\n [ 0. 0. 0. ..., 0. 0. 0.]]')
In [503]: (res[0][0]).value
Out[503]: u'[[ 0. 0. 0. ..., 0. 0. 0.]\n [ 0. 0. 0. ..., 0. 0. 0.]\n [ 0. 0. 0. ..., 0. 0. 0.]\n ..., \n [ 0. 0. 0. ..., 0. 0. 0.]\n [ 0. 0. 0. ..., 0. 0. 0.]\n [ 0. 0. 0. ..., 0. 0. 0.]]'
为什么我这次不能获得矩阵格式?这是unicode,非常耐任何转换。 感谢
答案 0 :(得分:0)
由于你没有提供SPARQL查询,这个答案的部分是猜测......
如果您创建rdflib.Literal(obj)
RDFLib将尝试将给定对象转换为合适的RDF(XSD)表示。某些python标准类型映射为here。如果给定的对象没有任何类型(例如np.array
),则_castPythonToLiteral(obj)
方法将回退到仅返回obj
。因此,您在此处观察到的L.value
是您传递到obj
的未触及的Literal(obj)
,如constructor code中所示,这可能是令人困惑的。由于inst
的实际返回Literal
也是unicode
对象,您可以获得"内容" Literal
与unicode(L)
的关系。这很重要,因为它也将存储在您的商店/ SPARQL端点中。
现在,如果从SPARQL端点检索文字并且obj
没有标准类型,那么该端点只知道obj
的字符串表示,因此返回{{1 }}。所以从SPARQL端点的角度来看,这只是一个字符串。 RDFLib也只会看到一个字符串,这就是为什么你现在突然在l = Literal(str_rep_of_obj)
中获得一个unicode字符串。
为了解决这个问题,您需要做的是将res[0][0].value
的字符串内容反序列化到您的res[0][0]
,例如和json这样:
np.array
然后再
l = Literal(json.dumps(mm.tolist()))
另外一个注意事项......类似于数据库保存二进制blob(如数据库本身中的图像)通常不是一个好主意。将二进制数据放在某处然后在数据库中保存链接通常会更好。 RDF使用URI是不是很酷;)