Matrix 难以将矩阵作为rdflib中的节点读取

Matrix 难以将矩阵作为rdflib中的节点读取,matrix,rdflib,Matrix,Rdflib,我创建了一个RDF文件,其中图像作为矩阵存储在节点中。 但是,当我试图阅读它们时,我无法获得矩阵形式: 比如说 from rflib import Literal mm = np.random.normal(0,1,(3,3)) L = Literal(mm) 很容易得到矩阵 带L值 In [494]: L Out[494]: rdflib.term.Literal(u'[[-1.39304728 0.39093531 0.88042378]\n [ 0.22605682 0.560

我创建了一个RDF文件,其中图像作为矩阵存储在节点中。 但是,当我试图阅读它们时,我无法获得矩阵形式: 比如说

from rflib import Literal 
mm = np.random.normal(0,1,(3,3))
L = Literal(mm)
很容易得到矩阵 带L值

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_节点中的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格式的,对任何转换都有很强的抵抗力。
谢谢,因为您没有提供SPARQL查询,这个答案的部分是猜测工作

如果创建
rdflib.Literal(obj)
rdflib将尝试将给定对象转换为合适的RDF(XSD)表示。映射了某些python标准类型。如果给定的对象没有这些类型中的任何一种(如
np.array
),该方法将返回到只返回
obj
。因此,您在这里观察到的
L.value
是未触及的
obj
,您将其传递到
Literal(obj)
,如中所示,这可能令人困惑。由于
Literal
的实际返回的
inst
也是
unicode
对象,您可以使用
unicode(L)
获取
Literal
的“内容”。这一点很重要,因为它也是存储在stores/SPARQL端点中的内容

现在,如果从SPARQL端点检索文本,并且
obj
不是标准类型,那么该端点只知道
obj
的字符串表示形式,因此它返回
l=literal(str_rep_of_obj)
。因此,从SPARQL端点的角度来看,这只是一个字符串。RDFLib也只会看到一个字符串,这就是为什么现在在
res[0][0].value中突然出现一个unicode字符串的原因

为了解决这个问题,您需要做的是将
res[0][0]
的字符串内容反序列化到您的
np.array
,例如,使用json如下:

l = Literal(json.dumps(mm.tolist()))
后来

imagenode = np.array(json.loads(unicode(res_literal)))

还有一句话。。。与数据库类似,在数据库本身中保存二进制blob(如图像)通常不是一个好主意。通常最好将二进制数据放在某个地方,然后在数据库中保存一个链接。RDF使用URI不是很酷吗;)

您能提供一个SPARQL查询的简单示例吗?目前看来,
res[0][0]
只包含0个值。不过,rdflib或sparql引擎似乎不太可能发明文字。