Matrix 难以将矩阵作为rdflib中的节点读取
我创建了一个RDF文件,其中图像作为矩阵存储在节点中。 但是,当我试图阅读它们时,我无法获得矩阵形式: 比如说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
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引擎似乎不太可能发明文字。