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

时间:2015-06-13 23:30:01

标签: matrix rdflib

我创建了一个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,非常耐任何转换。 感谢

1 个答案:

答案 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对象,您可以获得"内容" Literalunicode(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是不是很酷;)