Как мне вызвать networkx.add_node (..) с необязательными свойствами? - PullRequest
0 голосов
/ 10 июля 2019

Я перебираю словарь объектов, созданных из JSON, и создаю из них вершины, используя networkx.Проблема, с которой я сталкиваюсь, заключается в том, что у некоторых объектов JSON отсутствуют свойства, и если я сделаю это:

self.graph.add_node(valueToCheck, 
                id=self.vertexDict[valueToCheck], 
                namespace=component["namespace"], 
                tenant=component["tenant"], 
                type=component.get("type")+"Component",
                artifactFileName=component.get("artifactFileName"),
                className=component.get("className"),
                userConfig=component.get("userConfig"),
                sourceType=component.get("sourceType"),
                sinkType=component.get("sinkType"))

, то я не смогу экспортировать свой график, используя nx.write_graphml(..), поскольку некоторые свойства вершинимеют значение None (которое является ожидаемым выходным значением component.get(..), когда свойство отсутствует).

Как использовать networkx для построения вершин, когда некоторые из моих свойств могут отсутствовать в объектах JSON?

Вот как выглядит мой JSON:

[{'type': 'function',
  'namespace': 'campaigns',
  'name': 'campaign-record-transformer',
  'tenant': 'osp',
  'artifactFileName': 'osp-functions-1.1-SNAPSHOT-jar-with-dependencies.jar',
  'className': 'com.overstock.dataeng.pulsar.functions.CampaignRecordTransformer',
  'inputs': ['persistent://osp/campaigns/campaign-manager'],
  'logTopic': 'persistent://osp/logging/pulsar-log-topic',
  'output': 'persistent://osp/campaigns/campaign-records'},
 {'type': 'function',
  'namespace': 'campaignsTest',
  'name': 'campaign-metadata-transformer',
  'tenant': 'osp',
  'artifactFileName': 'osp-functions-1.1-SNAPSHOT-jar-with-dependencies.jar',
  'className': 'com.overstock.dataeng.pulsar.functions.CampaignMetadataTransformer',
  'logTopic': 'persistent://osp/logging/pulsar-log-topic',
  'output': 'persistent://osp/campaigns/campaign-metadata-output'}]

Обратите внимание, что свойство inputs отсутствует во втором объекте.В реальных данных есть как минимум 8 необязательных свойств, которые могут отсутствовать в разных комбинациях, и есть сотни таких объектов.

1 Ответ

1 голос
/ 10 июля 2019

У меня нет репутации для комментария, поэтому, несмотря на то, что это не полный ответ, я публикую его как таковой

Вы пытались просто исключить свойства, отсутствующие в вашем шаге add_node?

То есть вместо предоставления пары ключ-значение, где значение равно None, вообще не предоставляйте пару ключ / значение, если ключ отсутствует.

Вероятно, вы можете достичь этого довольно просто, загрузив json с помощью python, а затем просто распаковав ваш компонент:

components = json.load(...)
for component in components:
    self.graph.add_node(value, **component)

См. https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists

...