1

次のようなデータベーステーブルがあります。データは、次のようなツリー形式です。

            CREATE  TABLE IF NOT EXISTS DOMAIN_HIERARCHY (
                COMPONENT_ID        INT             NOT NULL ,
                LEVEL               INT             NOT NULL ,
                COMPONENT_NAME      VARCHAR(127)    NOT NULL ,
                PARENT              INT             NOT NULL ,
                PRIMARY KEY ( COMPONENT_ID ) 
                );

次のデータは表にあります

                (1,1,'A',0)
                (2,2,'AA',1)
                (3,2,'AB',1)
                (4,3,'AAA',2)
                (5,3,'AAB',2)
                (6,3,'ABA',3)
                (7,3,'ABB',3)

データを取得してPython辞書に保存する必要があります

以下のコードを書きました

                conx = sqlite3.connect( 'nameofdatabase.db' )
                curs = conx.cursor()
                curs.execute( 'SELECT COMPONENT_ID, LEVEL, COMPONENT_NAME, PARENT FROM DOMAIN_HIERARCHY' )
                rows = curs.fetchall()

                cmap = {}
                for row in rows:
                    cmap[row[0]] = row[2]
                hrcy={}
                for level in range( 1, maxl + 1 ):
                    for row in rows:
                        if row[1] == level:
                            if hrcy == {}:
                                hrcy[row[2]] = []
                                continue
                            parent = cmap[row[3]]
                            hrcy[parent].append( { row[2]: [] } )

私が直面している問題は、第 2 レベル以上のノードの場合で、親ではなくルートに追加されています。コードのどこを変更すればよいですか?

4

1 に答える 1

2

問題は、ノードを挿入した後、第 2 レベルのノードを直接見ることができないことです。これを試して:

conx = sqlite3.connect( 'nameofdatabase.db' )
curs = conx.cursor()
curs.execute( 'SELECT COMPONENT_ID, LEVEL, COMPONENT_NAME, PARENT ' +
              'FROM DOMAIN_HIERARCHY' )
rows = curs.fetchall()
cmap = {}
hrcy = None
for row in rows:
    entry = (row[2], {})
    cmap[row[0]] = entry
    if row[1] == 1:
        hrcy = {entry[0]: entry[1]}

# raise if hrcy is None

for row in rows:
    item = cmap[row[0]]
    parent = cmap.get(row[3], None)
    if parent is not None:
        parent[1][row[2]] = item[1]

print hrcy

各コンポーネントのサブコンポーネントのマップを に保持するcmapことで、常に各親のマップにアクセスして次のコンポーネントを追加できます。以下のテストデータで試してみました。

rows = [(1,1,'A',0),
        (2,2,'AA',1),
        (3,2,'AB',1),
        (4,3,'AAA',2),
        (5,3,'AAB',2),
        (6,3,'ABA',3),
        (7,3,'ABB',3)]       

出力は次のとおりです。

{'A': {'AA': {'AAA': {}, 'AAB': {}}, 'AB': {'ABA': {}, 'ABB': {}}}}
于 2013-03-15T05:52:48.143 に答える