Python / networkx: note属性的创建不规则地失败



我看到了一个让我疯狂而又无法理解的效果:我正在从6列SQL Server 2012数据库表(nodeID, string(Class), float(xCoordinate), float(ycoordinate), stringZone, char(Reference))中获取数据,我想使用networkx Python包创建这些实体的网络图。对我来说重要的是,我确实有几个具有预定义坐标的网络节点,我想保持固定的横向,其余的将使用Gephi进行布局。

下面是我的代码:
import pyodbc
import networkx as nx
dbConnection = pyodbc.connect('DB-Connection String')
dbCursor = dbConnection.cursor()
theGraph = nx.Graph()
theGraph.position={}
theGraph.deviceClass={}
queryStatement = "SELECT ComponentID, DeviceClass, CoordX, CoordY, AcceleratorZone, Reference FROM dbo.vComponentsWithZones WHERE Reference IN ('M','T')"
for dbRow in dbCursor.execute(queryStatement):
    nodeID = dbRow[0]
    theGraph.add_node(nodeID)
    deviceClass = dbRow[1]
    coordX = (dbRow[2] - 367421.373) / 100
    coordY = (dbRow[3] - 230238.784) / 100
    accelZone = dbRow[4]
    if coordX != None and coordY != None:
        print nodeID, coordX, coordY   <-------------------------
        theGraph.node[nodeID]["viz"] = {'position': {'x': coordX, 'y': coordY, 'z': 0}}
    if accelZone != None:
        theGraph.node[nodeID]["AccelZone"] = accelZone
    if dbRow[1] != None:
        theGraph.node[nodeID]["DeviceClass"] = deviceClass 
    if deviceClass == "Controls":
        theGraph.node[nodeID]["viz"] = {'color': {'r': "255", 'g': "0", 'b': "0", 'a': "1"}}
    elif deviceClass == "Magnet":
        theGraph.node[nodeID]["viz"] = {'color': {'r': "255", 'g': "200", 'b': "0", 'a': "1"}}
    elif deviceClass == "Vacuum":
        theGraph.node[nodeID]["viz"] = {'color': {'r': "0", 'g': "0", 'b': "255", 'a': "1"}}
queryStatement = "SELECT * FROM dbo.ComponentConnections"
for dbRow in dbCursor.execute(queryStatement):
    theGraph.add_edge(dbRow[0],dbRow[1], connectionTyp=dbRow[2])
dbConnection.close()
nx.write_gexf(theGraph,"cryringTopology.gexf")

一切似乎工作正常,看看print语句的输出,事情似乎也工作得很好;我得到nodeID, coordX, coordY的值只要是数据库中的条目程序就会计算语句

if coordX != None and coordY != None:

为true,并正确执行其中的代码。

打印输出截图

但是,对gef文件的输出只生成正确分配坐标的6个条目,其中应该是40 - 50。似乎"position"节点属性的创建在某些情况下失败了,我完全迷路了。

有什么想法?

您在这行中存储的内容

theGraph.node[nodeID]["viz"] = {'position': {'x': coordX, 'y': coordY, 'z': 0}}

被以下几行

覆盖
theGraph.node[nodeID]["viz"] = {'color': {'r': "255", 'g': "0", 'b': "0", 'a': "1"}}

最新更新