如何使用networkx(和d3js)计算和存储图形及其所有修改?

时间:2018-03-15 14:30:31

标签: python json networkx

我试图以这种形式的简单无向关系图的形式表示由各种相关项组成的数据集:

Simple graph (D3JS force-directed graph)

数据集最初显示为日志文件,每个日志行都有一个修改后的项目的副本。这包括项目的属性以及与之相关的其他项目。

这是一个基本的例子:

logs = {
    "item_1": {
        "color": "blue",
        "relatives": []
    },
    "item_2": {
        "color": "green",
        "relatives": []
    },
    "item_1": {
        "color": "blue",
        "relatives": ["object_1"]
    },
    "item_1": {
        "color": "red",
        "relatives": []
    }
}

(如果它有用,那么日志最初是以复杂XML的形式,我将其转换为带有xmltodict的字典

此处,第三个日志表示在项目1和2之间创建链接,第四个日志表示删除此相同链接(除了更改项目1的属性外)。

以图表形式表示,因此需要添加蓝色" 1"节点,然后添加绿色" 2"节点,然后连接两个,然后删除项目1和2之间的边缘并更改节点的颜色" 1"。

目前,我可以使用与此类似的代码创建图表:

for log in logs.items():

    # Adding the object (if non existant) or updating it
    G.add_node(log[0], color=log[1].get("color", "black"))

    # Edges creation
    if "relatives" in log[1]:
        for rel in relatives:
            G.add_edge(log[0], rel)

我的问题如下:

如何正确管理关系删除的情况?

我的代码允许您使用新节点和链接填充图表,并在更改时更新属性,但我不知道如何检测链接的删除。

我想看看使用jsondiff库计算差异是否可以帮助我。我使用显式的jsondiff语法得到以下形式的日志:

{UPDATE: {"color":"red","relative": {DELETE:[0]}}}}}

但是,这需要在内存中保留所有对象的当前状态,以便知道图中的哪个链接对应于要删除的第0个元素。所以我想把一个包含与networkx相关的项目列表的对象作为节点传递(而不是单独使用标签)。有没有更好的方法呢?

如何在给定日志行之后构建图表?

这是我的主要问题。我需要能够随时查看图形的状态(即在任何选定的日志行之后)。存储图表的方法是什么,允许我正确地执行此操作?天真地,每时每刻都有一个图表,但它很快变得荒谬(我的示例数据集有几千个日志,我必须能够处理更大的日志)。也许通过将链接的生命周期放在其属性中,并将其用作显示或不显示边缘的条件?

理想的解决方案是使用d3.js显示动画,直观地表示数据集的演变。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

不是很鼓舞人心,是吗?

我继续思考我的问题,并得出以下解决方案,它解决了两个问题(管理链接的消失和存储图表随时间的演变):在每个链接中写出生和死亡的日期

在处理完日志文件后,我得到一个四元组列表(i, r, b, d),每个四元组代表一个项i和第二个相关项r之间的链接,它出现在图表中在b日期,在d日期消失。

我发现这种表示图形演变的方式称为链接流Clémence Magnien's lecture (French)Tiphaine Viard's Thesis谈论它。

至于d3.js的动画可视化,我在this SO thread找到了一个相当接近的答案,特别是d3.js代码具有所需结果的一个例子,我只需要适应考虑链接的出生和死亡属性。