Python / networkx:笔记属性的创建不正常地失败
Python / networkx: creation of note attributes fails erratically
我看到一个让我发疯但我不明白的效果:
我正在从 6 列 SQL Server 2012 数据库 table 中获取数据(nodeID、字符串(Class)、浮点数(xCoordinate)、浮点数(ycoordinate)、stringZone、char(参考))我想使用 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")
一切似乎都运行良好,查看打印语句的输出,似乎也运行良好;我确实获取了 nodeID、coordX、coordY 的值,只要是数据库中的一个条目,程序就会评估语句
if coordX != None and coordY != None:
正确并正确执行其中的代码。
但是,GEXF 文件的输出只为正确分配坐标的条目中的 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"}}
我看到一个让我发疯但我不明白的效果: 我正在从 6 列 SQL Server 2012 数据库 table 中获取数据(nodeID、字符串(Class)、浮点数(xCoordinate)、浮点数(ycoordinate)、stringZone、char(参考))我想使用 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")
一切似乎都运行良好,查看打印语句的输出,似乎也运行良好;我确实获取了 nodeID、coordX、coordY 的值,只要是数据库中的一个条目,程序就会评估语句
if coordX != None and coordY != None:
正确并正确执行其中的代码。
但是,GEXF 文件的输出只为正确分配坐标的条目中的 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"}}