区分同名节点的正确图形数据结构是什么?
-
27-10-2019 - |
题
我正在学习图(它们似乎超级有用),并且想知道是否可以就构建图的可能方式获得一些建议。
简而言之,可以说我每天都获得采购订单数据,有些日子与前一天相同,而另一些日子则有所不同。例如,昨天我有一个铅笔和橡皮的订单,我创建了两个节点来表示它们,然后今天我得到了一个橡皮和一个标记的订单,依此类推。每天过后,我的程序还希望查看谁订购了什么东西,如果鲍勃昨天订购了铅笔,今天订购了橡皮,则它会产生有向边。我的逻辑是,我可以看到谁每天都买了东西,并且可以跟踪Bob的购买行为(并可以用它来推断自己或其他用户的模式)。
我的问题是,我使用networkx(python)并为昨天创建了一个节点'pencil',然后为day2创建了另一个节点'pencil',我无法区分它们。
我认为(一直以来)将其命名为day2-pencil,然后扫描整个图形并去除“ day2-”以跟踪铅笔订单。这对我来说似乎是错误的(更不用说处理器上的昂贵了)。我认为关键是如果我可以将每天以某种方式标记为自己的子图,那么当我想研究特定的一天或几天时,不必扫描整个图。
随着我的测试数据越来越大,它变得越来越混乱,所以我想知道最佳实践是什么?任何生成建议都将是很棒的(因为networkx似乎功能齐全,所以他们可能有一种方法可以做到)。
谢谢!
更新:仍然没有运气,但这可能会有所帮助: 通用标签
我输入以下命令G.node
的结果是:
通用标签
很明显,它用1/1/12的铅笔将1/2/12的铅笔覆盖,不确定我是否可以改用铅笔。
解决方案
这实际上取决于您的目标。您要分析的是图形设计中的决定性因素。但是,从您的结构来看,一般的结构将是Customers
和Products
的节点,它们通过Days
连接在一起(我不知道这是否会对您有所帮助,但这实际上是二部图)。
所以您的结构应如下所示: 通用标签
比方说,鲍勃在1/1/12买了一支铅笔: 通用标签
好吧,现在鲍勃去买1/2/12的另一支铅笔: 通用标签
等等...
这实际上可以通过networkx
实现。由于节点之间有多个边缘,因此必须根据边缘的方向性在MultiGraph
Mor或MultiDiGraph
之间进行选择。
通用标签
到目前为止,还不错。您实际上可以查询“爱丽丝在12年1月1日买了铅笔吗?”之类的东西。
通用标签
如果您希望特定日期的所有订单,情况可能会变糟。不好的是,我不是指代码方式,而是计算方式。就代码而言,这非常简单: 通用标签
但是,这将扫描网络中的所有边缘并过滤所需的边缘。我认为networkx
没有更好的方法。
其他提示
图形不是实现此目的的最佳方法。诸如MySQL之类的关系数据库是用于存储此数据并执行诸如谁何时购买的查询之类的正确工具。
尝试一下:
为每个节点提供唯一的整数ID。然后,创建一个字典,节点,例如:
nodes ['pencil']= [1,4,...] <-,其中所有这些都对应于具有pencil属性的节点。 用您感兴趣的其他属性替换“铅笔”。
只需确保在添加带有“ pencil”的节点时更新了字典:
node ['pencil']。append(new_node_id)。删除节点也是如此。