【问题标题】:Use python to generate graph using node constraints使用python使用节点约束生成图
【发布时间】:2016-04-02 10:25:58
【问题描述】:

我正在尝试解决我的系统(Python/Storm)遇到的问题,但不确定什么是最好的工具。

目标:使用节点输入和输出的约束创建图的边。

我有大约 400 多个 python 函数(apachestorm shell 螺栓每个螺栓都包含一个函数 - 在这种情况下,Storm 并不重要,我会将它们视为节点)。

每个螺栓/功能/节点都有一个定义的输入和输出名称属性列表。 我有一个来源(有输出,但没有输入)。 节点(有输入和输出列表) Sink(只输入不输出)。

为了更清楚,让我们说我有:

S = Source , Input = [] , Output = ["a","b","c","d"] ("a","b","c","d" are attributes the sources produces).
A = Node , Input = ["a","b"], output = ["e"]
B = Node , Input = ["a","e"], output = ["f"]
Si = Sink, Input = ["a","b","c","d","e","f"] , Output = [] 

我希望 NetworkX(或其他图形库)使用节点上的这些约束单独创建边。

每个节点输出只是输出列表,不是输出+输入。

我想要的输出是边列表:

S,A
S,B
A,B
B,Si
A,Si
S,Si

*图中C=Si

NetworkX 是否支持这样的构建?如果可以,我该如何实现?

【问题讨论】:

    标签: python graph graphviz networkx


    【解决方案1】:

    您可以根据您的数据构建一个二分图(我认为是定向图?),然后将其“投影”到一组节点上以制作您想要的图。例如。如果您有有向边 S->a 和 a->T,则两个节点集是 {S,T} 和 {a}。投影到节点集 {S,T} 得到 S->T,因为在原始二分图中存在一条从 S->T 的路径。

    import networkx as nx
    
    data = [("S", [], ["a","b","c","d"]),
            ("A", ["a","b"], ["e"]),
            ("B", ["a","c"], ["f"]),
            ("Si", ["a","b","c","d","e","f"], [])]
    
    G = nx.DiGraph()
    #G = nx.Graph() # maybe you want an undirected graph?
    nodes = []
    for n,inedges,outedges in data:
        nodes.append(n)
        for s in inedges:
            G.add_edge(s,n)
        for t in outedges:
            G.add_edge(n,t)
    
    P = nx.projected_graph(G,nodes)
    
    print list(P.nodes())
    print list(P.edges())
    # OUTPUT
    # ['A', 'S', 'B', 'Si']
    # [('A', 'Si'), ('S', 'A'), ('S', 'Si'), ('S', 'B'), ('B', 'Si')]
    

    【讨论】:

    • 正是我想要的!我还将我的示例固定为一个更复杂的示例(我最初的意思)。试过你的代码,效果很好。
    猜你喜欢
    • 2022-12-12
    • 1970-01-01
    • 2021-08-30
    • 2013-06-06
    • 2016-08-25
    • 2021-09-10
    • 2016-05-07
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多