Was ist die richtige Grafikdatenstruktur, um zwischen Knoten mit demselben Namen zu unterscheiden?

StackOverflow https://stackoverflow.com/questions/8828349

Frage

Ich lerne etwas über Diagramme (sie scheinen sehr nützlich zu sein) und habe mich gefragt, ob ich Ratschläge zur möglichen Strukturierung meiner Diagramme erhalten könnte.

Nehmen wir einfach an, ich erhalte täglich Bestelldaten und an manchen Tagen sind sie dieselben wie am Vortag und an anderen ist sie unterschiedlich. Zum Beispiel hatte ich gestern eine Bestellung von Stiften und Radiergummis, ich erstelle die beiden Knoten, um sie darzustellen, und heute bekomme ich eine Bestellung für einen Radiergummi und einen Marker und so weiter. Nach jedem Tag sieht mein Programm auch nach, wer was bestellt hat, und wenn Bob gestern einen Bleistift und heute einen Radiergummi bestellt hat, entsteht eine gerichtete Kante. Meine Logik dafür ist, dass ich sehen kann, wer was an jedem Tag gekauft hat, und das Kaufverhalten von Bob verfolgen kann (und es möglicherweise verwenden kann, um Muster mit sich selbst oder anderen Benutzern abzuleiten).

Mein Problem ist, dass ich networkx (Python) verwende und einen Knoten 'bleistift' für gestern und dann einen anderen knoten 'bleistift' für tag2 erstelle und sie nicht unterscheiden kann.

Ich dachte (und habe) es Tag2-Bleistift zu nennen und dann das gesamte Diagramm zu scannen und das 'Tag2-' zu entfernen, um Bleistiftbestellungen zu verfolgen. Dies scheint mir falsch zu sein (ganz zu schweigen von den Kosten für den Prozessor). Ich denke, der Schlüssel wäre, wenn ich jeden Tag irgendwie als eigenen Untergraphen markieren kann. Wenn ich also einen bestimmten Tag oder einige Tage studieren möchte, muss ich nicht das gesamte Diagramm scannen.

Wenn meine Testdaten größer werden, werden sie immer verwirrender, sodass ich mich frage, was die beste Vorgehensweise ist. Alle generierten Vorschläge wären großartig (da networkx ziemlich voll ausgestattet zu sein scheint, haben sie wahrscheinlich eine Möglichkeit, dies zu tun).

Vielen Dank im Voraus!

Update: Immer noch kein Glück, aber das ist vielleicht hilfreich:

import networkx as nx
G=nx.Graph()
G.add_node('pencil', day='1/1/12', colour='blue')
G.add_node('eraser', day='1/1/12', colour='rubberish colour. I know thats not a real colour')
G.add_node('pencil', day='1/2/12', colour='blue')

Das Ergebnis, wenn ich den folgenden Befehl G.node eingebe, ist:

{'pencil': {'colour': 'blue', 'day': '1/2/12'}, 'eraser': {'colour': 'rubberish colour. I know thats not a real colour', 'day': '1/1/12'}}

Es ist offensichtlich, dass der Bleistift vom 01.01.12 mit dem Bleistift 1/2/12 überschrieben wird. Ich bin mir nicht sicher, ob ich einen Distint erstellen kann.

War es hilfreich?

Lösung

Dies hängt hauptsächlich von Ihrem eigentlichen Ziel ab. Was Sie analysieren möchten, ist der entscheidende Faktor in Ihrem Diagrammdesign. Wenn Sie sich Ihre Struktur ansehen, wäre eine allgemeine Struktur Knoten für Customers und Products, die durch Days verbunden sind (ich weiß nicht, ob dies Ihnen besser helfen würde, aber dies ist tatsächlich ein zweigeteilter Graph ).

Ihre Struktur wäre also ungefähr so:

node(Person) --- edge(Day) ---> node(Product)

Nehmen wir an, Bob kauft am 1.1.12 einen Bleistift:

node(Bob) --- 1/1/12 ---> node(Pencil)

Ok, jetzt geht Bob und kauft am 1/2/12 einen weiteren Bleistift:

          -- 1/1/12 --
         /            \
node(Bob)              > node(Pencil)
         \            /
          -- 1/2/12 --

so weiter ...

Dies ist tatsächlich mit networkx möglich. Da Sie mehrere Kanten zwischen Knoten haben, müssen Sie zwischen MultiGraphMor MultiDiGraph wählen, abhängig von der Ausrichtung Ihrer Kanten.

In : g = networkx.MultiDiGraph()

In : g.add_node("Bob")
In : g.add_node("Alice")

In : g.add_node("Pencil")

In : g.add_edge("Bob","Pencil",key="1/1/12")
In : g.add_edge("Bob","Pencil",key="1/2/12")

In : g.add_edge("Alice","Pencil",key="1/3/12")
In : g.add_edge("Alice","Pencil",key="1/2/12")

In : g.edges(keys=True)
Out:
[('Bob', 'Pencil', '1/2/12'),
 ('Bob', 'Pencil', '1/1/12'),
 ('Alice', 'Pencil', '1/3/12'),
 ('Alice', 'Pencil', '1/2/12')]

bisher nicht schlecht. Sie können tatsächlich Dinge wie "Hat Alice am 1.1.12 einen Bleistift gekauft?" Abfragen.

In : g.has_edge("Alice","Pencil","1/1/12")
Out: False

In : g.has_edge("Alice","Pencil","1/2/12")
Out: True

Es kann schlimm werden, wenn Sie alle Bestellungen an bestimmten Tagen wünschen. Mit schlecht meine ich nicht Code-weise, sondern rechnerisch. Code-weise ist es ziemlich einfach:

In : [(from_node, to_node) for from_node, to_node, key in g.edges(keys=True) if key=="1/2/12"]
Out: [('Bob', 'Pencil'), ('Alice', 'Pencil')]

Dadurch werden jedoch alle Kanten im Netzwerk gescannt und die gewünschten gefiltert. Ich denke nicht, dass networkx einen besseren Weg hat.

Andere Tipps

Diagramme sind hierfür nicht der beste Ansatz.Eine relationale Datenbank wie MySQL ist das richtige Werkzeug, um diese Daten zu speichern und Abfragen durchzuführen, z. B. wer was wann gekauft hat.

Versuchen Sie Folgendes:

Geben Sie jedem Knoten eine eindeutige Ganzzahl-ID.Erstellen Sie dann ein Wörterbuch mit Knoten, sodass:

Knoten ['Bleistift']= [1,4, ...] <- wobei alle diese einem Knoten mit dem Bleistiftattribut entsprechen. Ersetzen Sie "Bleistift" durch andere Attribute, an denen Sie interessiert sind.

Stellen Sie einfach sicher, dass Sie das Wörterbuch aktualisieren, wenn Sie einen Knoten mit 'Bleistift' hinzufügen:

Knoten ['Bleistift']. Anhängen (new_node_id).Ebenso beim Löschen von Knoten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top