2016-04-02 9 views
0

私のシステム(Python/Storm)で問題を解決しようとしていますが、何が最善のツールかはっきりしません。ノード制約を使用してグラフを生成するためにpythonを使用する

目標:ノードの入力と出力の制約を使用して、グラフのエッジを作成します。

私は約400以上のpython関数を持っています(apache storm shell bolts各ボルトラップ関数の1つ - この場合、Stormは本当に問題ではありません。ノードとして扱います)。

各bolt/function/Nodeには、入力と出力の名前属性リストが定義されています。 私はソースを持っています(出力はありますが、入力はありません)。 ノード(入出力リストを持つ) シンク(入力のみの出力)。

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 

enter image description here

*グラフC = Siの

んNetworkXサポート、ビルドに?どうすれば実装できますか?

答えて

1

データから2部グラフを作成することができます(私は指示されたと思います)。データを1組のノードに「投影」して、必要なグラフを作成します。例えば。有向枝S→aとa→Tがある場合、2つのノード集合は{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')] 
+0

ちょうど私が欲しかったもの! 私の例は、もっと複雑なもの(私がもともと意味していたもの)に修正しました。 はあなたのコードを試してみました。 – etlsh

関連する問題