从 Grakn 导出关联矩阵的方法?

Method to export Incidence Matrix from Grakn?

我们经常使用GraphBLAS for graph processing so we need to use the 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 关联矩阵中的每一列。

我应该提出一些重要的警告:

  • 你最终得到的结果将排除所有关于超级关系的类型信息、关系中的角色扮演者以及由超级关系扮演的实际角色角色扮演者,以及拥有的属性类型。

==> hear/discuss 如何编码类型信息以便在 GraphBLAS 中使用会很有趣

  • 在 Graql 中,关系参与关系是完全可能的。在最坏的情况下,这意味着所有超边 E 也将出现在集合 V 中。实际上只有少数关系会在其他关系中发挥作用,因此只有 E 的子集可能在 V.

所以关联矩阵相当于力图可视化中使用的nodes/edges数组。在这种情况下,它非常简单。

我的方法与上面的略有不同,因为我需要做的就是拉取数据库中的所有内容(实体、关系、属性),

match $ting isa thing;

现在,当我收回我的交易时,对于每个 $ting,如果我正在构建一个力图即,我想使用本地和远程方法提取所有可用的属性,但是对于您的关联矩阵,我真的只关心拉取 3 位数据:

  1. 事物的 iid
  2. 事物可能拥有的属性。
  3. 事物拥有的角色,如果它是一个关系

本质上是测试每个返回的对象以找出类型(例如实体、属性、关系),然后使用一些本地和远程方法来获取所需的数据。在 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}')        

然后这给了我们一个节点数组,我们可以很容易地处理它来构建一个边缘数组(即连接一个对象和它拥有的属性的链接,或者连接一个关系到它的角色参与者的链接)。因此,导出关联矩阵非常简单