问题描述
我们经常使用GraphBLAS进行图形处理,所以我们需要使用incidence matrix。我一直无法找到将其从 Grakn 导出到 csv 或任何文件的方法。这可能吗?
解决方法
目前在 Grakn 中没有将数据转储到 CSV 的内置方法。但是,我们强烈鼓励我们的社区为这些类型的任务贡献开源工具!请随时在我们的 discord 上聊天以使用它。
至于如何完成,从概念上讲,这很容易:
查询以流出所有超关系:
match $r isa relation;
然后对于每个关系,我们可以管道另一个查询(如果您希望保持较低的内存使用量,可以在新事务中):
match $r iid <iid of $r from previous query>; $r ($x); get $x;
这将使您在这个特定的超关系 $r
中发挥作用。
如果您还希望提取附加到超关系的属性,可以使用以下内容
match $r iid <iid of $r from first query>; $r has $a; get $a;
实际上,我们可以使用这些步骤来构建 A
关联矩阵中的每一列。
我应该提出一些重要的警告:
- 你最终会得到什么,将排除关于超关系、关系中的角色扮演者、角色扮演者正在扮演的实际角色以及属性的所有类型信息拥有的类型。
==> 听到/讨论如何编码用于 GraphBLAS 的类型信息会很有趣
- 在 Graql 中,完全有可能让关系参与关系。在最坏的情况下,这意味着所有超边
E
也将出现在集合V
中。实际上,只有少数关系会在其他关系中发挥作用,因此只有E
的子集可能在V
中。
所以关联矩阵等效于力图可视化中使用的节点/边数组。在这种情况下,它非常简单。
我的方法与上述方法略有不同,因为我需要做的就是提取数据库中的所有内容(实体、关系、属性),
match $ting isa thing;
现在,当我取回交易时,对于每个 $ting,如果我正在构建力图即,我想使用本地和远程方法提取所有可用属性,但是对于您的关联矩阵,我真的只关心提取 3 位数据:
- 事物的 iid
- 事物可能拥有的属性。
- 事物拥有的角色(如果它是一种关系)
本质上是测试每个返回的对象以找出类型(例如实体、属性、关系),然后使用一些本地和远程方法来获取所需的数据。在 Python 中,拉取关系数据的代码如下
# pull relation data
elif thing.is_relation():
rel = {}
rel['type'] = 'relation'
rel['symbol'] = key
rel['G_id'] = thing.get_iid()
rel['G_name'] = thing.get_type().get_label().name()
att_obj = thing.as_remote(r_tx).get_has()
att = []
for a in att_obj:
att.append(a.get_iid())
rel['has'] = att
links = thing.as_remote(r_tx).get_players_by_role_type()
logger.debug(f' links are -> {links}')
edges = {}
for edge_key,edge_thing in links.items():
logger.debug(f' edge key is -> {edge_key}')
logger.debug(f' edge_thing is -> {list(edge_thing)}')
edges[edge_key.get_label().name()] = [e.get_iid() for e in list(edge_thing)]
rel['edges'] = edges
res.append(rel)
layer.append(rel)
logger.debug(f'rel -> {rel}')
这为我们提供了一个节点数组,我们可以轻松处理它以构建边数组(即连接对象及其拥有的属性的链接,或连接与其角色扮演者的关系的链接)。因此,导出关联矩阵非常简单