-
TECHNISCHES GEBIET
-
Diese Anmeldung beansprucht die Priorität der
US-Patentanmeldung Nr. 15/388,288 mit dem Titel NODES IN DIRECTED ACYCLIC GRAPH, eingereicht am 22. Dezember 2016, deren Inhalt hiermit durch Bezugnahme hierin aufgenommen wird.
-
TECHNISCHES GEBIET
-
Dieses Dokument betrifft allgemein Knoten in einem gerichteten azyklischen Graphen.
-
HINTERGRUND
-
Graphen werden bei Computersystemen verwendet, um eine Sammlung von Objekten oder anderen Entitäten zu organisieren, z. B. auf einer Festplatte oder in einer anderen Form von Speicher. Eine solche Organisation geschieht manchmal als eine Hierarchie von Knoten, wobei Objekte wie z. B. Dateien so angeordnet werden, dass sie definierte Vorfahren und Nachfahren haben. Bei solchen Systemen werden manchmal Aggregationen durchgeführt, zum Beispiel vom Stamm zu den Blättern oder von den Blättern zum Stamm. Beispiele für Aggregationen über einer Dateisystem-Hierarchie umfassen das Aggregieren von Zählungen von Dateien und Zählungen von Ordnern in der Hierarchie. Solche Systeme können es einem Benutzer ermöglichen, zum Beispiel die Zahl von Bildern abzufragen, die unter einem Knoten in der Hierarchie gespeichert sind, oder die Zahl von Bytes, die von einer bestimmten Unterhierarchie auf der Platte verwendet werden.
-
Bei manchen vorhandenen Systemen verwaltet jeder Knoten eine Vorfahrenliste, die für diesen Knoten den Namen aller anderen Knoten angibt, die in der Hierarchie über dem Knoten liegen. Bei solchen Systemen kann dann eine Abfrage nach Informationen, die sich an oder unter einem bestimmten Knoten befinden, ausgeführt werden, indem nach irgendeinem Knoten gesucht wird, der den bestimmten Knoten in seiner Vorfahrenliste hat. Dies kann als eine Vorberechnungsmethode angesehen werden, indem die Beziehungen über Vorfahrenlisten aufrechterhalten werden, die auf dem neuesten Stand gehalten werden müssen, wenn sich die Hierarchie ändert. Diese Methode kann ineffizient oder sogar undurchführbar werden, wenn die Hierarchie tief wird, einen hohen Ausfächerungsgrad aufweist, oder einfach, wenn sich die Hierarchiestruktur häufig ändert. Zum Beispiel kann ein System, das vollständig auf Vorberechnung basiert, an Latenzen leiden, wenn die Hierarchie aktualisiert wird (z. B. wenn sich die Inhalte ändern). Andererseits funktioniert eine Methode, die nur Abfragezeit-Aggregation verwendet, nicht für große und komplexe Hierarchien.
-
KURZDARSTELLUNG
-
In einem ersten Aspekt umfasst ein Verfahren zur Aggregation mittels eines Barrieren-Knotens in einem gerichteten azyklischen Graphen: in einem gerichteten azyklischen Graphen, in dem jeder Knoten entweder als ein Barrieren-Knoten oder als ein Nicht-Barrieren-Knoten definiert ist, für einen ersten Barrieren-Knoten jeden Nachfahren-Knoten zu identifizieren, der ein nächster Barrieren-Knoten zu dem ersten Barrieren-Knoten ist; und an dem ersten Barrieren-Knoten Informationen von jedem Nicht-Barrieren-Knoten, der ein Nachfahre des ersten Barrieren-Knotens und nicht durch irgendeinen identifizierten nächsten Barrieren-Knoten davon getrennt ist, zu aggregieren.
-
Implementierungen können irgendwelche oder alle der folgenden Merkmale enthalten. Das Verfahren umfasst weiterhin, eine erste Liste für den ersten Barrieren-Knoten zu erzeugen, wobei die erste Liste alle Nachfahren-Knoten des ersten Barrieren-Knotens identifiziert, die Barrieren-Knoten sind. Das Verfahren umfasst weiterhin, die erste Liste kumulativ zu machen, so dass dann, wenn die erste Liste des ersten Barrieren-Knotens einen bestimmten Barrieren-Knoten identifiziert, eine entsprechende erste Liste für einen Barrieren-Knoten oberhalb des ersten Barrieren-Knotens, die den ersten Barrieren-Knoten enthält, auch den bestimmten Barrieren-Knoten enthält. Das Verfahren umfasst weiterhin, zu erkennen, dass eine neue Beziehung in den gerichteten azyklischen Graphen eingeführt wird, unter Verwendung der ersten Liste zu ermitteln, ob die neue Beziehung zyklisch ist, und wenn ermittelt wird, dass die neue Beziehung zyklisch ist, die neue Beziehung in dem gerichteten azyklischen Graphen zu verhindern. Das Verfahren umfasst weiterhin, die erste Liste an dem ersten Barrieren-Knoten zu speichern. Das Verfahren umfasst weiterhin, eine zweite Liste für den ersten Barrieren-Knoten zu erzeugen, wobei die zweite Liste alle Vorfahren-Knoten des ersten Barrieren-Knotens identifiziert, die Barrieren-Knoten sind. Die zweite Liste gibt an, welche Knoten den ersten Barrieren-Knoten in ihrer entsprechenden ersten Liste identifiziert haben.
-
In einem zweiten Aspekt umfasst ein Verfahren zur Propagation mittels eines Nicht-Barrieren-Knotens in einem gerichteten azyklischen Graphen: in einem gerichteten azyklischen Graphen, in dem jeder Knoten entweder als ein Barrieren-Knoten oder als ein Nicht-Barrieren-Knoten definiert ist, für einen ersten Nicht-Barrieren-Knoten jeden Vorfahren-Knoten zu identifizieren, der ein früherer Barrieren-Knoten zu dem ersten Nicht-Barrieren-Knoten ist; und Informationen des ersten Nicht-Barrieren-Knotens zu jedem identifizierten früheren Barrieren-Knoten und zu jedem Nicht-Barrieren-Knoten zwischen dem ersten Nicht-Barrieren-Knoten und dem identifizierten früheren Barrieren-Knoten zu propagieren.
-
Implementierungen können irgendwelche oder alle der folgenden Merkmale enthalten. Das Verfahren umfasst weiterhin, eine gekappte Vorfahrenliste für den ersten Nicht-Barrieren-Knoten zu erzeugen, wobei die gekappte Vorfahrenliste Vorfahren-Knoten identifiziert, zu dem der erste Nicht-Barrieren-Knoten die Informationen propagiert. Die gekappte Vorfahrenliste wird auf Basis eines aktuellen maximalen Vorfahrenwertes definiert, wobei das Verfahren weiterhin umfasst, den aktuellen maximalen Vorfahrenwert basierend darauf festzusetzen, wie viele Eltern-Knoten der erste Nicht-Barrieren-Knoten in dem gerichteten azyklischen Graphen hat. Das Verfahren umfasst weiterhin, eine Nächste-Barrieren-Knoten-Liste für den ersten Nicht-Barrieren-Knoten zu erzeugen, wobei die Nächste-Barrieren-Knoten-Liste jeden Nachfahren-Knoten identifiziert, der ein nächster Barrieren-Knoten zu dem ersten Nicht-Barrieren-Knoten ist. Das Verfahren umfasst weiterhin, eine Frühere-Barrieren-Knoten-Liste für den ersten Nicht-Barrieren-Knoten zu erzeugen, wobei die Frühere-Barrieren-Knoten-Liste jeden Vorfahren-Knoten identifiziert, der der frühere Barrieren-Knoten zu dem ersten Nicht-Barrieren-Knoten ist, und die Frühere-Barrieren-Knoten-Liste bei der Identifizierung zu verwenden.
-
In einem dritten Aspekt umfasst ein Verfahren: eine Abfrage nach einem gerichteten azyklischen Graphen zu empfangen, bei dem jeder Knoten entweder als ein Barrieren-Knoten oder als ein Nicht-Barrieren-Knoten definiert ist, wobei sich die empfangene Abfrage auf einen ersten Knoten und seine Nachfahren bezieht; auf Basis der empfangenen Abfrage zu ermitteln: (i) eine erste Aggregation, die an dem ersten Knoten gespeichert ist, und (ii) eine zweite Aggregation, die an irgendeinem Nachfahren-Knoten des ersten Knotens, der ein Barrieren-Knoten ist, gespeichert ist; und eine Antwort auf die empfangene Abfrage unter Verwendung der ersten und zweiten Aggregationen zu erzeugen.
-
Implementierungen können irgendwelche oder alle der folgenden Merkmale enthalten. Das Verfahren umfasst weiterhin, dass der erste Knoten ein erster Barrieren-Knoten ist, wobei das Verfahren weiterhin umfasst, beim Ermitteln der zweiten Aggregation eine Liste zu verwenden, wobei die Liste für den ersten Barrieren-Knoten jeden Nachfahren-Knoten identifiziert, der ein Barrieren-Knoten ist. Das Ermitteln der zweiten Aggregation umfasst, mindestens einen Nachfahren-Knoten auf der Liste zu identifizieren und die zweite Aggregation auf Basis der Identifizierung zu gewinnen. Der erste Knoten ist ein erster Nicht-Barrieren-Knoten, wobei das Verfahren weiterhin umfasst, beim Ermitteln der zweiten Aggregation eine Liste zu verwenden, wobei die Liste für den ersten Nicht-Barrieren-Knoten jeden Nachfahren-Knoten identifiziert, der ein nächster Barrieren-Knoten zu dem ersten Barrieren-Knoten ist. Das Ermitteln der zweiten Aggregation umfasst, mindestens einen Nachfahren-Knoten auf der Liste zu identifizieren und die zweite Aggregation auf Basis der Identifizierung zu gewinnen. Die Identifizierung und die Gewinnung werden unter Verwendung eines einzigen Multiabfrage- Remote Procedure Call (RPC; engl. „Aufruf einer fernen Prozedur“) durchgeführt. Der gerichtete azyklische Graph hat mehrere Pfade, um einen Nachfahren-Knoten von dem ersten Knoten zu erreichen, wobei das Verfahren weiterhin umfasst, beim Erzeugen der Antwort eine Multizählungs-Aggregation zu berücksichtigen. Das Berücksichtigen der Multizählungs-Aggregation umfasst, eine Zahl von Pfaden zwischen dem ersten Knoten und dem Nachfahren-Knoten zu ermitteln. Das Verfahren umfasst weiterhin, Informationen des Nachfahren-Knotens entsprechend der ermittelten Zahl von Pfaden mehrere Male in die erste oder zweite Aggregation einzuschließen.
-
In einem vierten Aspekt umfasst ein Verfahren: in einem gerichteten azyklischen Graphen, in dem jeder Knoten entweder als ein Barrieren-Knoten oder als ein Nicht-Barrieren-Knoten definiert ist, einen ersten Knoten als einen Nicht-Barrieren-Knoten zu definieren; ein Barrieren-Knoten-Kriterium für den ersten Knoten zu bewerten; und nach Ermitteln, dass das Barrieren-Knoten-Kriterium für den ersten Knoten erfüllt ist, den ersten Knoten als einen Barrieren-Knoten in dem gerichteten azyklischen Graphen zu definieren.
-
Implementierungen können irgendwelche oder alle der folgenden Merkmale enthalten. Der erste Knoten hat eine Vorfahrenlisten-Größe, die der Zahl der Vorfahren des ersten Knotens in dem gerichteten azyklischen Graphen entspricht, wobei das Barrieren-Knoten-Kriterium umfasst, dass die Vorfahrenlisten-Größe mindestens gleich einem aktuellen maximalen Vorfahrenwert für den ersten Knoten ist, wobei der aktuelle maximale Vorfahrenwert davon abhängt, wie viele Eltern-Knoten der erste Knoten in dem gerichteten azyklischen Graphen hat. Der erste Knoten hat einen aktuellen maximalen Vorfahrenwert, der davon abhängt, wie viele Eltern-Knoten der erste Knoten in dem gerichteten azyklischen Graphen hat, wobei das Barrieren-Knoten-Kriterium umfasst, dass der aktuelle maximale Vorfahrenwert mindestens gleich einem globalen maximalen Vorfahrenwert für den gerichteten azyklischen Graphen ist. Es werden mehrere Barrieren-Knoten-Kriterien bewertet, wobei der erste Knoten als ein Barrieren-Knoten in dem gerichteten azyklischen Graphen definiert wird, wenn ermittelt wird, dass irgendeines der mehreren Barrieren-Knoten-Kriterien erfüllt ist. Ein zweiter Knoten in dem gerichteten azyklischen Graphen wird als ein Barrieren-Knoten definiert, wobei das Verfahren weiterhin umfasst, ein Nicht-Barrieren-Knoten-Kriterium für den zweiten Knoten zu bewerten und, wenn ermittelt wird, dass das Nicht-Barrieren-Knoten-Kriterium für den zweiten Knoten erfüllt ist, den zweiten Knoten als einen Nicht-Barrieren-Knoten in dem gerichteten azyklischen Graphen zu definieren. Das Nicht-Barrieren-Knoten-Kriterium weist mindestens einen Parameter gemeinsam mit dem Barrieren-Knoten-Kriterium auf, wobei ein Schwellenwert für den Parameter in dem Nicht-Barrieren-Knoten-Kriterium stringenter ist als in dem Barrieren-Knoten-Kriterium. Das Verfahren umfasst weiterhin, beim Ermitteln, ob der erste Knoten als ein Barrieren-Knoten zu definieren ist, mindestens ein anderes Signal über den gerichteten azyklischen Graphen zu berücksichtigen. Das andere Signal weist einen Diensttyp auf, mit dem ein Kunde den gerichteten azyklischen Graphen verwendet. Das andere Signal weist ein Charakteristikum auf, wie der gerichtete azyklische Graph verwendet wird.
-
Der in dieser Beschreibung beschriebene Gegenstand bezieht sich auch auf die Verwendung, Anwendung und Implementierung der offenbarten Techniken für gerichtete azyklische Graphen und deren Knoten in computerimplementierten Datenbanken, Dateisystemen und hierarchisch organisiertem Speicher. In einem Beispiel kann ein System ein Dateisystem sein, wobei ein gerichteter azyklischer Graph in Überstimmung mit der vorliegenden Offenbarung verwendet wird, um eine Hierarchie von Blöcken und Bytes zu verwalten, die zum Speichern einer Datei oder eines Verzeichnisses in nichtflüchtigem Speicher verwendet werden. In einem anderen Beispiel kann ein System ein hierarchisches Speichersystem für Dateien sein, wobei ein gerichteter azyklischer Graph in Überstimmung mit der vorliegenden Offenbarung verwendet wird, um eine Hierarchie von Distributionen, Verzeichnissen und Dateien zu verwalten, wobei ein Knoten des Graphen zum Beispiel ein Verzeichnis oder eine Datei repräsentieren kann.
-
Figurenliste
-
- 1 zeigt ein Beispiel für Aggregation in einem gerichteten azyklischen Graphen.
- 2 zeigt ein Beispiel für Listen in einem gerichteten azyklischen Graphen.
- 3 zeigt schematisch ein Beispiel für die Verwendung einer Zusammenführungs-Liste.
- 4 zeigt schematisch ein Beispiel für die Berechnung von Aggregationen unter einem Barrieren-Knoten.
- 5 zeigt ein Beispiel für einen Nachschlagefluss.
- 6 zeigt schematisch ein Beispiel für die Berechnung von Aggregationen unter einem Nicht-Barrieren-Knoten.
- 7A-D zeigen Beispiele für Multizählungs-Aggregationen.
- 8 zeigt ein Beispiel für Bewertung eines Barrieren-Knoten-Kriteriums.
- 9 zeigt ein weiteres Beispiel für Bewertung eines Barrieren-Knoten-Kriteriums.
- 10 zeigt ein weiteres Beispiel für Bewertung eines Barrieren-Knoten-Kriteriums.
- 11 zeigt ein Beispiel für Aggregation von Indizes in einem gerichteten azyklischen Graphen.
- 12 zeigt ein Beispiel für Zyklusverhinderung in einem gerichteten azyklischen Graphen.
- 13 zeigt ein Beispiel für eine Computervorrichtung und eine mobile Computervorrichtung, die verwendet werden können, um die hier beschriebenen Techniken zu implementieren.
-
DETAILLIERTE BESCHREIBUNG
-
Dieses Dokument beschreibt Beispiele für das Aufrechterhalten von Informationen in einem gerichteten azyklischen Graphen von Knoten und für das Abfragen eines solchen Graphen nach bestimmten Informationen. In manchen Implementierungen ist die Propagation von Knoteninformationen so organisiert, dass bestimmte Knoten Informationen aggregieren, die von ihren Nachfahren-Knoten zu ihnen propagiert werden, doch propagieren sie diese Informationen nicht weiter nach oben in dem Graphen. Vielmehr sind die aggregierten Informationen für Abfrage zugänglich, ohne in dem Graphen weiter propagiert werden zu müssen. Hingegen propagieren andere Knoten ihre Informationen aufwärts, einschließlich Informationen, die sie von Nachfahren-Knoten aggregiert haben. Somit ist es möglicherweise nicht erforderlich, auf diesen individuellen Knoten zuzugreifen, wenn seine Informationen woanders aggregiert worden sind. Manche Implementierungen können eine vorteilhafte Flexibilität beim Abfragen bieten, indem sie eine Kombination von Vorberechnung und Abfragezeit-Berechnung verwenden. Dies kann es dem Verwalter des Systems ermöglichen, die gewünschte Balance zwischen der Effizienz der Beantwortung von Aggregationsabfragen und dem Betrag an Latenz, die eingeführt wird, wenn der Graph aktualisiert wird, zu implementieren.
-
1 zeigt ein Beispiel für Aggregation in einem gerichteten azyklischen Graphen (DAG) 100. Hier enthält der DAG zwei Typen von Knoten, die schematisch als Kreise dargestellt sind. Die Kreise sind zur Identifizierung mit den Buchstaben A bis J bezeichnet. Ein Knotentyp 102 ist durch eine dickere Linie angezeigt und wird hier als Barrieren-Knoten (BN; engl. „Barrier Node“) bezeichnet. In diesem Beispiel sind die Knoten A, E und F BNs. Ein anderer Knotentyp 104 ist durch eine weniger dicke Linie angezeigt und wird hier als Nicht-Barrieren-Knoten (NBN) bezeichnet. Die Knoten B, C, D, G, H, I und J sind hier NBNs. Beziehungen sind durch Kanten 106 zwischen Paaren von Knoten angezeigt. Zum Beispiel zeigt die Kante 106 an, dass der Knoten A ein Elternteil des Knotens B ist.
-
Ein BN kann die vorberechneten Aggregationen eines Teilbaums darunter bis zu einer gewissen Tiefe von dem BN speichern, propagiert sie aber nicht weiter nach oben in dem Graphen. Wenn die BN nicht die Aggregation des ganzen Teilbaums unterhalb des BN speichern kann, kann sie eine Liste von einem oder mehreren darunter liegenden BNs speichern. Dementsprechend müssen die Aggregationen der unteren BN(s) gelesen werden, um die Statistik des ganzen Teilbaums unter dem ersten BN zu berechnen. Die BNs sehen daher vor, dass eine Aggregationsabfrage, die auf irgendeinem Knoten durchgeführt werden soll, durch Lesen der an diesem Knoten gespeicherten Aggregation sowie der Aggregation(en), die an irgendeinem BN(s) gespeichert ist, der ein Nachfahren-Knoten des abgefragten Knotens ist, bedient werden kann. In manchen Implementierungen besagt der Ausdruck BN, dass der BN als eine Barriere gegen Aufwärtspropagation von Informationen dieses Knotens wirkt, sowohl seiner eigenen Informationen als auch als Informationen, die er von Knoten darunter aggregiert hat. Zum Beispiel kann der BN jegliche Aufwärtspropagation von Informationsaktualisierungen sowie Aggregationen ausschließen.
-
Ein NBN kann Informationen aus einem Teilbaum darunter aggregieren und die Aggregations-Informationen auch aufwärts zu den nächsten BN(s) propagieren. Der NBN kann eine Liste von Vorfahren speichern - also Knoten darüber, von denen er eine direkte oder indirekte Abhängigkeit hat - bis zu dem Punkt der nächsten BN(s) darüber in der Hierarchie. Der NBN kann daher seine Informationen bis zu den nächsten BN(s) propagieren.
-
Beginnend am unteren Ende des DAG 100 zeigt der Knoten J hier an, eine Aggregations-Dateizählung von eins zu haben. Zum Beispiel repräsentiert der Knoten J eine einzelne Datei in dem DAG 100. Ähnlich repräsentiert der Knoten H eine weitere einzelne Datei, und ebenso der Knoten G. Der Knoten G ist hier das Elternteil der Knoten H und J, und G aggregiert daher die Informationen der Knoten H und J. Das heißt, die Aggregations-Dateizählung für den Knoten G ist die Summe der individuellen Dateizählungen für den Knoten G (eine Datei), den Knoten H (eine Datei) und den Knoten J (eine Datei), oder 1 + 1 + 1 = 3. Da der Knoten G ein NBN ist, propagiert er seine Informationen aufwärts zu den nächstliegenden BN(s). Hier ist nur der Knoten F (z. B. eine einzelne Datei) ein dem Knoten am nächsten liegender BN. Dementsprechend ist die Aggregations-Dateizählung für den Knoten F seine individuelle Zählung (eins) plus die von dem Knoten G empfangene Aggregationszählung (drei).
-
Da der Knoten F ein BN ist, propagiert er seine Informationen nicht aufwärts zu dem Knoten D (seinem Elternteil) oder zu irgendeinem anderen Knoten. Der Knoten D aggregiert daher keine Informationen von dem Knoten F. Der Knoten I ist andererseits ein NBN und propagiert daher seine Informationen zu dem Knoten D sowie zu dem Knoten A oberhalb von D, da der Knoten A ein BN ist. Dementsprechend empfängt der Knoten D hier eine Dateizählung von eins von dem Knoten I und akkumuliert diese zu einer Aggregations-Dateizählung von zwei für den Knoten D. Die Aggregations-Dateizählung für den Knoten A ihrerseits ist hier fünf, da er die Aggregation von zwei von dem Knoten D und individuelle Zählungen von eins von jedem der Knoten B und C empfängt. Der Knoten E hingegen ist ein BN und propagiert daher seine Informationen nicht bis zu dem Knoten B (seinem Elternteil).
-
Kurz gesagt veranschaulicht der DAG 100 die folgenden Beziehungen. Die Knoten B, C, D und I sind NBNs, und jeder von ihnen wird seine Informationen (z. B. eine Dateizählung) zu dem Knoten A propagieren. Die Knoten E und F andererseits sind BNs und werden als solche keine Informationen aufwärts propagieren. Die Knoten G, H und J werden schließlich Informationen zu dem Knoten F propagieren, jedoch nicht weiter als bis dahin.
-
Dementsprechend können ein oder mehrere Aggregationsverfahren in einem gerichteten azyklischen Graphen durchgeführt werden, bei dem jeder Knoten entweder als ein BN oder ein NBN definiert ist, zum Beispiel der DAG 100. Ein solches Verfahren kann umfassen, für einen ersten BN jeden Nachfahren-Knoten zu identifizieren, der ein nächster BN zu dem ersten BN ist. Als ein Beispiel können für den Knoten A die BNs E und F identifiziert werden. Die Knoten E und F sind jeweils ein nächster BN zu dem Knoten A, da sie nicht durch irgendeinen anderen BN von dem Knoten A getrennt sind. Das Verfahren kann umfassen, an dem ersten BN Informationen von jedem NBN zu aggregieren, der ein Nachfahre des ersten BN ist und nicht durch irgendeinen identifizierten nächsten BN davon getrennt ist. Zum Beispiel können an dem Knoten A Informationen der Knoten B, C, D und I aggregiert werden, von denen jeder ein NBN ist.
-
Ein solches Verfahren kann umfassen, für einen ersten NBN jeden Vorfahren-Knoten zu identifizieren, der ein früherer BN zu dem ersten NBN ist. Als ein Beispiel kann für den Knoten H der Vorfahren-Knoten F als ein früherer BN identifiziert werden. Hingegen ist der Knoten A kein früherer BN zu dem Knoten H, da sich zwischen ihnen ein anderer BN befindet, nämlich der Knoten F. Das Verfahren kann umfassen, Informationen des ersten NBN zu jedem identifizierten früheren BN und zu jedem NBN zwischen dem ersten NBN und dem identifizierten früheren BN zu propagieren. Zum Beispiel können die Informationen des Knotens H zu dem Knoten F (d. h., hier der frühere BN) und zu dem Knoten G propagiert werden, der hier ein NBN zwischen den Knoten H und F ist.
-
Es werden nun Beispiele für das Berechnen einer Dateizählung in dem DAG 100 gegeben. Angenommen, eine Abfrage sucht die Zählung von Dateien unter dem Knoten A. Auf Basis des DAG 100 wird das System Informationen über die eigene Aggregations-Dateizählung des Knotens A und die Aggregations-Dateizählung aller BNs unter dem Knoten A gewinnen. Der Letztere enthält hier die Aggregations-Dateizählungen unter den Knoten E und F, welche BNs sind. Das heißt, die Dateizählung unter dem Knoten A wird ermittelt, indem die Aggregations-Dateizählung von A (hier fünf), die Aggregations-Dateizählung von E (hier eins) und die Aggregations-Dateizählung von F (hier vier) zu insgesamt zehn Dateien addiert werden.
-
Stattdessen sei angenommen, dass die Abfrage die Dateizählung unter Knoten D gesucht hat, der ein NBN ist. Ähnlich wie in dem obigen Beispiel wird dies ermittelt, indem die bei D gespeicherte Aggregation (hier zwei) und die an dem Knoten F, welcher der einzige Nachfahre BN des Knotens D ist, gespeicherte Aggregation (hier vier) gewonnen werden. Die Aggregations-Dateizählung unter D ist daher 2 + 4 = 6. Man beachte, dass die Abfrage den Knoten I in diesem Beispiel nicht explizit untersuchen muss, da dies ein NBN ist, der ein Kind-Knoten des gerade abgefragten Knotens ist, und somit ist seine Zählung an seinem Elternteil, Knoten D, aggregiert worden.
-
Als ein letztes Beispiel sei angenommen, dass die Abfrage die Dateizählung unter dem Knoten G gesucht hat, der ebenfalls ein NBN ist. Hier hat der Knoten G keinen BN darunter. Somit wird das System die Aggregations-Dateizählung von G (hier drei) lesen, und dies ist die Antwort auf die Abfrage in diesem Beispiel.
-
Die Aggregation von Informationen und das Abfragen von Aggregations-Informationen können unter Verwendung von einer oder mehreren Listen durchgeführt werden. 2 zeigt ein Beispiel für Listen in einem gerichteten azyklischen Graphen 200. Obwohl sich die Struktur dieses Beispiel-DAG von jener in der vorhergehenden Figur unterscheidet, ist die verwendete Nomenklatur der Einfachheit halber ähnlich. Somit sind BNs durch dickere Linien angezeigt, NBNs durch dünnere Linien, und die Knoten sind mit A-D bzw. F-U bezeichnet. Somit sind die NBNs hier Knoten A, F, G, H, J, K, M, N, P, Q und U, und die BNs sind Knoten B, C, D, I, L, O, R, S und T. Die dargestellten Knoten können Teil eines größeren Graphen sein. Somit können mehr BNs und/oder NBNs vorhanden sein als in dieser Darstellung sichtbar sind. In manchen Implementierungen ist der Stamm-Knoten eines Graphen immer ein BN. Die Listen können an irgendeinem geeigneten Ort gespeichert werden, wie z. B. an dem jeweiligen Knoten, zu dem sie gehören, oder an einem anderen Ort.
-
In manchen Implementierungen haben BNs andere Listen als NBNs. Hier hat jeder BN (wie z. B. der Knoten B) eine Lese-Zusammenführungs-Liste (RFI; engl. „Read Fan In“) 210 und eine inverse Lese-Zusammenführungs-Liste (I-RFI) 220. Zur Klarheit sind die RFIs und I-RFIs explizit nur für einige der Knoten gezeigt. Es werden Beispiele für diese Listen beschrieben, doch wird darauf hingewiesen, dass die BNs hier keine vollständigen Listen ihrer Vorfahren enthalten.
-
Beginnend mit der RFI ist dies eine Liste aller Nachfahren-Knoten des BN, die selbst BNs sind. Zum Beispiel enthält die RFI von Knoten B hier die Namen der Knoten I, O, R und S, welche die Nachfahren von Knoten B sind, die BNs sind. Wenn eine Abfrage empfangen wird, die Informationen über einen Teilbaum unter einem bestimmten Knoten sucht, in diesem Beispiel-Knoten B, wird das System die Aggregations-Informationen von den in der RFI identifizierten Knoten zusammenführen. Dies ist ein Teil der Informationen, die benötigt werden, um die Gesamt-Aggregation unter dem Knoten B zu berechnen.
-
Somit kann eine Liste wie z. B. die RFI für eine BN erzeugt werden, die alle ihre Nachfahren-Knoten identifiziert, die BNs sind. Die RFI kann kumulativ sein. In manchen Implementierungen werden, wenn die RFI von z. B. Knoten B den Knoten I nennt, alle BNs oberhalb von B (in der Figur nicht gezeigt) auch den Knoten I in ihren jeweiligen RFIs enthalten. Dies kann zum Beispiel den Vorteil bieten, dass das System im Abfragezeitpunkt nicht zu viel Zeit damit verbringt, die Knoten zu ermitteln, aus denen die Aggregationen zusammengeführt werden müssen.
-
In mathematischer Form kann die RFI in Form einer Funktion Read_Fan_ln wie folgt ausgedrückt werden:
Sei ∃ ein Barrieren-Knoten X in Tiefe M von einem Stamm. Dann ist
worin k eine Zahl von Eltern ist.
-
Somit kann die RFI eines Knotens X die Vereinigung der RFIs von Knoten in Tiefen unterhalb von X sein. In der Formel sind solche Knoten unterhalb von X als Y spezifiziert, wobei die Y eine größere Tiefe als M haben. In Form einer Induktion kann dies ausgedrückt werden als:
-
Darüber hinaus können die RFIs in Richtung auf das untere Ende des DAG 200 weniger Einträge haben. Zum Beispiel ist die RFI des Knotens B gleich {I, O, R, S}, während die RFI des Knotens I nur {R, S} ist und die RFI des Knotens R schließlich leer ist.
-
Die I-RFI 220 ihrerseits wird beim Aktualisieren des Graphen verwendet und enthält alle Vorfahren-Knoten, die BNs sind. Wie bereits erwähnt, kann die RFI kumulativ sein, so dass jede Aktualisierung (z. B. zu einer Liste) zu den jeweiligen RFIs der Vorfahren propagiert werden muss. Daher kann die I-RFI eine inverse Abbildung zum Ermitteln, welche Knoten aktualisiert werden müssen, sein. Zum Beispiel kann die I-RFI den Schreibzeitaufwand reduzieren, ohne die Korrektheit und Effizienz von Aggregationen im Abfragezeitpunkt zu beeinträchtigen.
-
Hier ist die I-RFI 220 des Knotens R gleich {I, B, C}. Dies zeigt an, welche der Knoten in dem DAG 200 den Knoten R in ihren jeweiligen RFIs haben. Diese Liste kann als eine inverse Abbildung angesehen werden. In gewisser Weise enthält die I-RFI die Namen von BNs von dem aktuellen Knoten bis hin zu dem Stamm. Die I-RFI kann leer sein, wenn der entsprechende BN nicht Teil eines speziell gestalteten Stammordners für diesen bestimmten Benutzer ist. In manchen Implementierungen ist dies die einzige Situation, in der die I-RFI-Liste leer sein würde.
-
Die I-RFI kann kumulativ sein. Mathematisch kann die I-RFI in Form einer Funktion I_RFI ausgedrückt werden, so dass:
worin k(Y) für einen Barrieren-Knoten Y die Tiefe des Teilbaums angibt, unter dem er die Aggregation speichert. Mit anderen Worten gibt es nach der Tiefe k(Y) einen anderen Barrieren-Knoten X, der die darunterliegende Aggregation bis zu einer Tiefe k(X) betreut. In manchen Implementierungen hängt k(Y) von einer Kappung der Vorfahrenliste (max_ancestor) des/der Nicht-Barrieren-Knoten(s) ab. Je größer die Kappung ist, desto mehr tiefere Knoten werden im Stande sein, Aggregationen bis zu dem Knoten Y zu propagieren, da mehr Knoten Y in ihrer Vorfahrenliste enthalten.
-
In Form einer Induktion kann dies ausgedrückt werden als:
-
Somit kann die Größe der I-RFI zum unteren Ende des DAG 200 hin zunehmen. Zum Beispiel ist die I-RFI des Knotens B leer, die I-RFI des Knotens I ist {B, C}, und die I-RFI des Knotens R ist {I, B, C}.
-
Somit kann die I-RFI eine Liste sein, die alle Vorfahren-Knoten eines BN identifiziert, die selbst BNs sind. Zum Beispiel kann die I-RFI für einen gegebenen BN angeben, welche BNs darüber diesen BN in ihrer jeweiligen RFI haben.
-
3 zeigt schematisch ein Beispiel für die Verwendung einer Lese-Zusammenführungs-Liste. DAG 300 ist ein Beispiel für einen Graphen mit einer Knotenstruktur. Der Einfachheit halber ist hier nur ein einzelner Knoten A gezeigt, schematisch als ein Kreis dargestellt. Hier ist der Knoten A ein BN, und BNs unterhalb des Knotens A sind schematisch durch horizontale Linien 310 quer über den DAG dargestellt. Die Trennung zwischen benachbarten Linien 310 ist hier beispielhaft als „K-Abstand“ angegeben, was veranschaulicht, dass BNs in regelmäßigen Intervallen in einer Hierarchie definiert sein können. Jeder der durch die Linien 310 dargestellten BNs kann seine entsprechende RFI aufweisen. Wenn die RFI eine kumulative Liste ist, können die Informationen aller Knoten als an dem Knoten A gespeichert angesehen werden.
-
Eine oder mehrere Listen können in einem NBN verwendet werden. Unter nochmaliger Bezugnahme auf 2 und den DAG 200 kann jeder NBN (z. B. der Knoten F) eine Vorfahrenliste 230, eine Nächste-BN-Liste 240 und eine Frühere-BN-Liste 250 aufweisen. Die Vorfahrenliste kann eine gekappte Vorfahrenliste sein, die einige oder alle Vorfahren eines gegebenen Knotens enthält. In manchen Implementierungen spezifiziert die Vorfahrenliste die Vorfahren, zu denen ein Knoten seine Informationen propagieren soll. Dies können zum Beispiel alle Knoten bis zu dem und einschließlich des nächsten BN entlang jedes Vorfahren-Pfades sein.
-
Zum Beispiel ist die Vorfahrenliste 230 des Knotens F hier {B, C}, was anzeigt, dass der Knoten F seine Informationen zu diesen Knoten propagiert. Für den Knoten M hingegen ist die Vorfahrenliste {I}, was anzeigt, dass der Knoten M, der ein NBN ist, Informationen zu dem Knoten I propagiert. Der Knoten M propagiert jedoch keine Informationen zu den Knoten über dem Knoten I, weil der Knoten I ein BN ist. Dementsprechend kann eine gekappte Vorfahrenliste für einen NBN erzeugt werden, wobei die gekappte Vorfahrenliste Vorfahren-Knoten identifiziert, zu denen der NBN Informationen propagiert.
-
Die Kappung kann in Form einer Zahl angegeben werden. In manchen Implementierungen ist die Kappung flexibel. Zum Beispiel kann sich die Kappung ändern, wenn ein neuer Eltern-Knoten für den bestimmten Knoten hinzugefügt wird. Unter der Voraussetzung, dass einem gegebenen Knoten in dem DAG Eltern hinzugefügt werden, kann diese Obergrenze um einen Betrag erhöht werden, der hier als Δ bezeichnet wird. Wenn der Knoten zum Beispiel nur einen Eltern-Knoten hat, wird seine Größe Δ sein. Andererseits, wenn der Knoten n Eltern-Knoten hat, wird seine Größe n *= A sein. Dies kann die maximale Größe sein, die der Knoten unterbringen kann. Der Wert n * Δ kann in jedem Zeitpunkt als eine Variable current_max_ancestor (aktueller maximaler Vorfahrenwert) bekannt sein. Dies kann zum Beispiel besagen, dass einige Knoten von jedem Vorfahren-Pfad genommen werden sollen und das System einem einzelnen langen Pfad keine Priorität geben soll, vorausgesetzt, das Zusammenführen von Vorfahren-Pfaden ist relativ selten.
-
Es kann eine Variable global_max_ancestor (globaler maximaler Vorfahrenwert) definiert werden. In manchen Implementierungen stellt dies die Grenze dar, die eine Obergrenze nicht übersteigen kann. Zum Beispiel kann diese Variable im System festgelegt werden. Als Ergebnis ist
worin n die Zahl der Eltern (oder Vorfahren-Pfade, die in diesen Knoten kommen) ist.
-
Zusätzlich zu den oben erörterten Variablen current_max_ancestor und global_max_ancestor existiert für jeden NBN auch die tatsächliche Vorfahrenlisten-Größe ancestor list size. Die Beziehung dazwischen für einen NBN kann wie folgt ausgedrückt werden:
-
Das heißt, die Vorfahrenliste 230 ist ein Beispiel für eine auf Basis eines aktuellen maximalen Vorfahrenwertes definierte gekappte Vorfahrenliste, und dieser Wert kann basierend darauf festgesetzt werden, wie viele Eltern-Knoten der NBN in dem DAG hat. Beispiele für Obergrenzen werden weiter unten unter Bezugnahme auf 8-10 beschrieben.
-
Die Nächste-BN-Liste 240 enthält Knoten, die die nächsten Nachfahren des Knotens sind, die auch BNs sind, für alle Hierarchien unterhalb des Knotens. Zum Beispiel ist die Nächste-BN-Liste 240 des Knotens F gleich {I, O}. Hingegen sind die Knoten R und S, die auch BNs sind, nicht auf der Liste 240, da der Knoten I ein BN ist, der näher an dem Knoten F auf den Pfaden liegt als sie selbst. Andererseits ist für den Knoten M die Nächste-BN-Liste einfach {R}. In manchen Implementierungen wird die Nächste-BN-Liste im Abfragezeitpunkt verwendet. Somit ist die Liste 240 ein Beispiel für das Erzeugen einer Nächste-BN-Liste für einen NBN, wobei die Liste jeden Nachfahren-Knoten identifiziert, der ein nächster BN für den NBN ist.
-
Die Frühere-BN-Liste 250 kann Knoten enthalten, die die nächsten BN-Vorfahren eines NBNs entlang aller Vorfahren-Pfade sind. Zum Beispiel enthält für den Knoten M die Frühere-BN-Liste nur {I}, da dies der nächste BN aufwärts von dem Knoten M ist. Die Knoten B und C sind hingegen nicht die nächsten BNs von M, da der Knoten I auf deren Pfaden näher an M ist. Als weiteres Beispiel enthält die Frühere-BN-Liste für den Knoten P den Knoten D. In manchen Implementierungen wird die Frühere-BN-Liste 250 während Aktualisierungen verwendet. Somit ist die Liste 250 ein Beispiel für das Erzeugen einer Frühere-BN-Liste für einen NBN, wobei die Liste jeden Vorfahren-Knoten identifiziert, der der frühere BN für den NBN ist, und dafür, dass eine solche Liste beim Identifizieren der Vorfahren-Knoten verwendet werden kann, zu denen der NBN seine Informationen propagieren soll.
-
In manchen Implementierungen können die RFI 210 und die I-RFI 220, die in den BNs vorhanden sind, und die Nächste-BN-Liste 240 und die Frühere-BN-Liste 250, die in NBNs vorhanden sind, als ähnliche Konzepte angesehen werden, mit dem Unterschied, dass die ersteren Listen kumulativ sind und die letzteren nur den nächsten entsprechenden Knoten enthalten. Mathematisch kann dies ausgedrückt werden als
X.NächsteNächsteBNListe ⊂ Y.RFI worin Y einer der BN-Vorfahren von X ist
Ähnlich
X.NächsteFrühereBNListe ⊂ Y.I_RFI worin Y einer der BN-Nachfahren von X ist
-
Zum Beispiel hat in dem DAG 200 der Knoten P eine Vorfahrenliste von {D, G, H, K}, und er hat nicht den Knoten A in dieser Liste. Der Grund dafür ist, dass der Knoten P seine Informationen aufwärts propagieren wird, bis er einen BN trifft. Hier findet der Knoten P den Knoten D, der ein BN ist, und P propagiert daher die Informationen nicht weiter. Daher befindet sich der Knoten A nicht in der Vorfahrenliste des Knotens P.
-
Es wurde oben erwähnt, dass die Methode der Verwendung von BNs und NBNs in Situationen verwendet werden kann, in denen der Graph nach Informationen abzufragen ist. Zum Beispiel und ohne Einschränkung kann sich die Abfrage auf eine Zählung von Knoten oder Dateien oder Ordnern beziehen, oder sie kann eine Suche nach einem bestimmten Objekt wie z. B. einem Bild sein. Die hierin beschriebene Methode der Verwendung von BNs und NBNs kann bei technischen Verfahren und Systemen wie z. B. Datenbanken, Dateisystemen, hierarchischen Speichersystemen und dergleichen verwendet werden, um Abfrage-, Such- und Aktualisierungs-Funktionalität innerhalb dieser Verfahren und Systeme effizient zu implementieren. Im Allgemeinen kann eine Abfrage für einen DAG empfangen werden, wobei sich die empfangene Abfrage auf einen bestimmten Knoten und seine Nachfahren bezieht. Auf Basis der empfangenen Abfrage kann ein System eine Aggregation ermitteln, die an dem bestimmten Knoten selbst gespeichert ist, sowie eine Aggregation, die an irgendeinem Nachfahren-Knoten des bestimmten Knotens gespeichert ist, der ein BN ist. Eine Antwort auf die empfangene Abfrage kann unter Verwendung dieser Aggregationen erzeugt werden.
-
Eine Abfrage, die sich auf einen BN und seine Nachfahren bezieht, kann in zwei Schritten durchgeführt werden. Schritt 1 kann formuliert werden als:
<N.aggregated_value, N.read_fan_in_list>, was besagt, dass Aggregationen abgerufen werden, die an dem Knoten N und in dessen Lese-Aggregation-Liste read_aggregation_list gespeichert sind. Für eine relativ tiefe Hierarchie kann es erforderlich sein, Schritt 2 durchzuführen: Für jeden Knoten in der Lese-Zusammenführungs-Liste read_fan_in_list, rufe den/die an diesem Knoten gespeicherten Aggregationswert(e) ab und aggregiere dann diese Werte mit dem/den im Schritt 1 abgerufenen Wert(en).
-
4 zeigt schematisch ein Beispiel für die Berechnung von Aggregationen unter einem Barrieren-Knoten. Ähnlich wie bei früheren Darstellungen stellt diese Figur BNs dar, die dickere Linien verwenden, und NBNs, die dünnere Linien verwenden. In einem DAG 400 ist ein BN 410 schematisch dargestellt. Die Abfrage sucht Informationen über Knoten in einem Teilbaum 420, wobei Linien 430 die jeweiligen BN-Nachfahren des BN 410 repräsentieren. In dem oben genannten Schritt 1 werden Aggregationen und die an dem Knoten 410 gespeicherte RFI gelesen. Die RFI gibt die BN-Nachfahren des Knotens 410 an. In dem oben genannten Schritt 2 werden Aggregationen gelesen, die an den Nachfahren-BNs (dargestellt durch die Linien 430) gespeichert sind. Das heißt, dies veranschaulicht die Knoten, für die bei dieser Beispiel-Abfrage Aggregationen berechnet werden sollen. Das Obige ist ein Beispiel für Verwendung einer Liste beim Ermitteln einer Aggregation, wobei die Liste für den BN jeden Nachfahren-Knoten identifiziert, der ein BN ist. Das Obige veranschaulicht auch, dass das Ermitteln einer Aggregation umfassen kann, mindestens einen Nachfahren-Knoten auf der Liste zu identifizieren und die Aggregation auf Basis der Identifizierung zu gewinnen.
-
5 zeigt ein Beispiel für einen Nachschlagefluss. Hier enthält ein DAG 500 BNs, die in dickeren Linien gezeigt sind, und NBNs, die in dünneren Linien gezeigt sind. Beim Durchführen einer Abfrage bezüglich eines NBN 510 liest das System zuerst die an diesem Knoten gespeicherte Aggregation. Dies Aggregation ist von den NBNs unter diesem Knoten bis zu der ersten Ebene von BNs. Der Knoten 510 wird außerdem seine nächsten BN-Nachfahren 520 in seiner RFI identifiziert haben. Aggregationen werden daher davon gelesen. Dementsprechend können Ebenen 530, 540 und 550 in dem DAG 500 definiert werden. Die Ebene 530 ist dort, wo die Aggregation von Informationen durch Lesen der an dem Knoten 510 gespeicherten Aggregation abgedeckt wird. Die Ebene 540 ist dort, wo die Aggregation von Informationen durch Lesen der an den BNs 520 gespeicherten Aggregationen abgedeckt wird. Die Ebene 550 ist darüber hinaus dort, wo die Aggregation von Informationen durch Lesen von Aggregation(en) an einem oder mehreren niedrigeren BNs 560 abgedeckt wird.
-
6 zeigt schematisch ein Beispiel für die Berechnung von Aggregationen unter einem Nicht-Barrieren-Knoten. In einem DAG-600 ist ein Knoten 610 ein NBN, und die Abfrage sucht Informationen über Knoten in einem Teilbaum 612. In einem ersten Schritt können Aggregationen und nächste BNs von dem Knoten 610 gelesen werden. In einem zweiten Schritt werden Aggregationen und RFI-Listen von den nächsten BNs gelesen, wie durch die RFI identifiziert. Die nächsten BNs sind hier schematisch als eine Linie 614 angezeigt. In einem dritten Schritt können Aggregationen von allen Knoten gelesen werden, die in der RFI vorhanden sind, die in dem zweiten Schritt abgerufen wurde. Dieser Prozess kann enden, wenn er beendet ist, oder der Prozess kann mit einer oder mehreren zusätzlichen Iterationen weitergehen, wenn mehr Ebenen des DAG abzufragen sind.
-
Dementsprechend kann eine Liste wie z. B. eine Nächste-BN-Liste beim Ermitteln einer Aggregation für einen NBN verwendet werden, nämlich indem die Liste jeden Nachfahren-Knoten identifiziert, der ein nächster BN zu dem NBN ist. Zum Beispiel kann ein Nachfahren-Knoten auf der Liste identifiziert werden, und die Aggregation kann auf Basis dieser Identifizierung gewonnen werden. In manchen Implementierungen kann ein Remote Procedure Call (RPC) von dem System verwendet werden. Zum Beispiel kann ein einzelner Multiabfrage-RPC sowohl zum Identifizieren der Knoten als auch zum Gewinnen der Aggregationen verwendet werden.
-
Manche DAGs können sehr komplex sein, viele Ebenen aufweisen und/oder einen hohen Ausfächerungsgrad aufweisen. Zum Beispiel kann es mehr als einen Pfad geben, der zwei Knoten miteinander verbindet. In solchen oder anderen Situationen kann Multizählung von Pfaden und/oder Knoten durchgeführt werden. In manchen Implementierungen erfordert Multizählung, die Zahl von Pfaden zwischen einem Eltern-Knoten und seinem Nachfahren-Knoten zu speichern. Zum Beispiel kann die Zählung der Zahl der Pfade zu einer oder mehreren Listen hinzugefügt werden, wie z. B. der RFI oder der Vorfahrenliste. Wenn Multizählung erforderlich ist, kann das System den bestimmten Wert des Feldes entsprechend oft zu dem Gespeicherten hinzufügen. Andernfalls kann die Zählung ignoriert und das Gespeicherte nur einmal hinzugefügt werden. Dementsprechend kann eine Multizählungs-Aggregation bei der Erzeugung einer Abfrage-Antwort berücksichtigt werden. Zum Beispiel kann die Multizählungs-Aggregation umfassen, dass die Zahl der Pfade zwischen einem Knoten und seinem Nachfahren-Knoten ermittelt wird. Wenn Multizählung in Betracht zu ziehen ist, können Informationen über den Nachfahren-Knoten mehrere Male in Aggregations-Informationen enthalten sein, entsprechend der Zahl der Pfade, die ermittelt wurden.
-
7A-D zeigen Beispiele für Multizählungs-Aggregationen. 7A zeigt einen DAG 700 mit einem Knoten A, der ein BN ist, und Knoten B, C, D und E, die NBNs sind. Hier bildet der Knoten C einen Zweig unter dem Knoten B, und die Knoten D und E bilden einen anderen Zweig. Die Aggregation kann sich auf beliebige Knoteninformationen beziehen, einschließlich, aber nicht beschränkt auf eine Aggregations-Dateizählung (hier A.F.C). Diese Figur zeigt den Zustand der Aggregations-Dateizählung, bevor dem DAG ein neuer Knoten hinzugefügt wird. Zum Beispiel empfängt der Knoten B hier eine Zählung von eins von dem Knoten C und eine Aggregationszählung von 3 von den Knoten D und E. Zusammen mit der eigenen Zählung von B von eins bildet dies eine Aggregationszählung von vier an dem Knoten B.
-
Nun sei angenommen, dass dem DAG 700 ein Knoten hinzugefügt wird. 7B zeigt den Zustand, nachdem ein Knoten F hinzugefügt wurde, wobei der neue Knoten beide Knoten C als auch E als Eltern hat. Insbesondere zeigt die Figur die Vorfahrenlisten für die jeweiligen Knoten. Der Knoten B hat eine Vorfahrenliste 710, die [(A, 1)] enthält. Der Wert A kann besagen, dass der einzige Vorfahre dieses Knotens der Knoten A ist, und der Wert 1 kann besagen, dass es nur einen Pfad zwischen den Knoten B und A gibt. Ähnlich hat Knoten C eine Vorfahrenliste von [(A,1), (B,1)], was anzeigt, dass die Knoten A und B beides Vorfahren von Knoten C sind und dass es nur einen Pfad zu jedem von ihnen gibt.
-
Der Knoten F hat jedoch eine Vorfahrenliste, die Multizählung erleichtert. Hier ist die Vorfahrenliste des Knotens F die Summe der Vorfahrenlisten der Knoten C und E, da F jeden dieser Knoten als ein Elternteil hat, plus je eine Verbindung für die jeweiligen Verbindungen des Knotens F zu den Knoten C und E. Die Vorfahrenliste des Knotens F ist daher [(A,2), (B,2), (C,1), (D,1), (E,1)]. Das heißt, der Knoten F hat zwei Pfade zu dem Knoten A, zwei Pfade zu dem Knoten B und einen Pfad zu jedem der Knoten C, D und E.
-
7C zeigt die Wirkung auf die Aggregations-Dateizählungen als Ergebnis der Hinzufügung des Knotens F. Der Knoten F selbst hat eine Dateizählung von eins. Da der Knoten F ein NBN ist, wird diese Zahl aufwärts zu dem nächsten BN und zu den dazwischenliegenden NBN(s) propagiert. Die Knoten B, C, D und E sind hier NBNs und empfangen die zusätzliche Zählung von dem Knoten F. Dementsprechend ist der Knoten C nun zum Beispiel auf zwei. Der Knoten B erhält außerdem einen zusätzlichen Dateizählungs-Beitrag sowohl von dem C-Knoten-Zweig als auch von dem D-E-Knoten-Zweig, für zwei zusätzliche Zählungen. Dementsprechend erhöht sich die Aggregations-Dateizählung an dem Knoten B von vier auf sechs. Ähnlich empfängt der Knoten A auch eine doppelte Zählung des Beitrags des Knotens F und erhöht daher seine Zählung um zwei von fünf auf sieben.
-
Nun sei stattdessen angenommen, dass Multizählung deaktiviert wurde. 7D zeigt den DAG 700 mit den jeweiligen für jeden Knoten angegebenen Aggregations-Dateizählungen. Es gibt keinen Unterschied für die Knoten C, D und F im Vergleich zu vorher. Für die Knoten B und A wird andererseits der Beitrag des neuen Knotens F nicht mehr mehrfach gezählt. Dementsprechend wird dem Knoten B eine Zählung von eins hinzugefügt, für eine neue Gesamt-Aggregations-Dateizählung von fünf. Ähnlich wird dem Knoten A eine Zählung für insgesamt sechs hinzugefügt.
-
In manchen Implementierungen kann die Zählung auch in einer RFI gespeichert werden. Da zum Beispiel BNs nichts aufwärts propagieren, kann dies Multizählung in Form von Multiplikation des aus dem BN gelesenen Aggregationswertes mit der aus der RFI gelesenen Zählung erleichtern.
-
Hier sind DAGs veranschaulicht worden, die jeden Knoten entweder als einen BN oder als einen NBN klassifiziert haben, und in dem obigen Beispiel hat sich diese Klassifizierung für keinen der Knoten während der beschriebenen Sitzung geändert. Im Allgemeinen kann ein BN in einem DAG eine wichtige Rolle bei der Steuerung des Aufwandes für das System auf der Basis von BNs und NBNs spielen. Dieser Aufwand wird sowohl in Form von Abfragezeit als auch der Menge an Vorberechnungsspeicher gemessen. Wenn zum Beispiel eine DAG eine große Zahl von BNs hat, reduziert dies den Ressourcenbedarf und verbessert die Leistung, wenn der Graph aktualisiert wird, da Änderungen nicht über die nächsten BNs hinaus propagiert werden müssen. Diese Verbesserungen können jedoch auf Kosten einer Verschlechterung der Abfragezeit-Leistung gehen, da das System möglicherweise viele BNs nachschlagen muss, um die Abfrage zu beantworten. Andererseits, wenn das System weniger BNs hat, kann ein Latenzproblem auftreten, wenn Aktualisierungen vorgenommen werden, und der Ressourcenbedarf kann größer sein. Die geringere Zahl von BNs kann jedoch die Abfragezeit-Leistung verbessern, da vor Beantwortung der Abfrage weniger BN-Nachschlagungen vorhanden sind. Es kann daher hilfreich sein, die Balance zwischen BNs und NBNs in dem Graphen flexibel steuern zu können, um zum Beispiel die oben genannten Faktoren in Abhängigkeit von der aktuellen Situation zu optimieren.
-
Daher können in einer Implementierung ein oder mehrere Knoten, die bereits als ein BN oder ein NBN klassifiziert sind, als ein anderer Knotentyp neu klassifiziert werden. In manchen Implementierungen kann die Methode sein, einen Knoten zu einem BN zu machen, wenn es zu aufwändig wird, die Aggregation in der Hierarchie aufwärts zu propagieren. Dies kann zum Beispiel der Fall sein, wenn ein Knoten viele Eltern-Knoten in dem Graphen hat. Der Übergang kann dynamisch erfolgen, wie z. B. durch Auswertung eines oder mehrerer Kriterien. Zum Beispiel können ein oder mehrere von einem Aggregationssystem (z. B. einer Ordneraggregation in einem Laufwerk) verwendete Signale verwendet werden, wenn entschieden wird, welche Knoten BNs sein sollen und wann ein Übergang von BN zu NBN oder umgekehrt durchzuführen ist.
-
In manchen Implementierungen ist das System so konfiguriert, dass ein Knoten als ein BN zu definieren ist, wenn die folgende Bedingung nicht mehr gilt
Ancestor list size < current_max_ancestor (k * max_ancestor) < global_max_ancestor
worin k die Zahl der Eltern ist. Man erkennt, dass die Bedingung zwei Ungleichungen enthält, die durch jeweilige Symbole „ist weniger als“ angezeigt sind. Wenn zum Beispiel eine der beiden Ungleichungen nicht mehr erfüllt ist, kann die Bedingung nicht mehr als geltend erachtet werden.
-
8 zeigt ein Beispiel für die Bewertung eines Barrieren-Knoten-Kriteriums. Hier enthält ein DAG 800 BNs und NBNs entlang der Linien von früheren Beispielen hierin. Insbesondere sind Knoten A und B bezeichnet, die beide NBNs sind.
-
In diesem Beispiel wird angenommen, dass die folgenden Werte definiert worden sind
-
Hier hat der Knoten A fünf Eltern-Knoten 810. Da A fünf Eltern-Knoten hat, ist der Wert current_max_ancestor für A gleich 5 * max_ancestor = 5 * 10 = 50. Das heißt, der Knoten A wird Vorfahren enthalten, zu denen er seinen Wert propagieren wird (z. B. zu den ersten BNs, die er entlang all seiner Vorfahren-Pfade trifft). Angenommen, es gibt 45 solche Vorfahren. Wenn der Knoten B als ein Kind des Knotens A hinzugefügt wird, können einige neue Werte berechnet werden. B übernimmt die Vorfahrenliste von Knoten A, so dass die Vorfahrenliste von B die 45 Vorfahren des Knotens A plus A selbst enthält; also 45 + 1 = 46.
-
Doch da der Knoten B nur einen Eltern-Knoten hat, ist der Wert current_max_ancestor gleich 1
max_ancestor = 1 ∗ 10 = 10. Das heißt, B hat aktuell 46 Vorfahren, was den Maximalwert von zehn übersteigt. Das Kriterium, ein Barrieren-Knoten zu sein, kann daher erfüllt werden, und das System kann B als einen BN neu definieren.
-
In manchen Implementierungen kann ein Kriterium für Neudefinition von BN zu NBN oder für Neudefinition von NBN zu BN oder für beides angewendet werden. Zum Beispiel kann dies beinhalten, ein Verfahren in einem Graphen wie z. B. dem DAG 800 durchzuführen. Das Verfahren kann umfassen, einen Knoten als einen NBN zu definieren und ein BN-Kriterium für den Knoten zu bewerten. Wenn ermittelt wird, dass das BN-Kriterium erfüllt ist, kann das Verfahren umfassen, den Knoten als einen BN in dem DAG zu definieren.
-
9 zeigt ein weiteres Beispiel für die Bewertung eines Barrieren-Knoten-Kriteriums. Hier enthält ein DAG 900 einen Knoten X, und dem Knoten X werden dann jeweilige Eltern-Knoten A, B, C und Y hinzugefügt. Das Hinzufügen eines Eltern-Knotens kann durch Einführen neuer Knoten in den DAG 800 erfolgen, so dass sie eine Eltern-Kind-Beziehung zu dem Knoten X haben. Als weiteres Beispiel kann eine neue Eltern-Kind-Kante zwischen dem Knoten X und einem vorhandenen Knoten in dem Graphen erzeugt werden.
-
In diesem Beispiel ist der Wert Max_ancestor auf 50 gesetzt worden. Außerdem haben die neuen Eltern-Knoten Vorfahrenlisten, die den Vorfahren von X die folgenden Zahlen hinzufügen: Die Liste von A ist 50, die Liste von B ist 25, die Liste von C ist 60, und die Liste von D ist 110. Wenn der Knoten A dem Knoten X als ein Eltern-Knoten hinzugefügt wird, gewinnt X ein Elternteil. Der Wert current_max_ancestor des Knotens X wird daher gleich 1 * 50 = 50. Darüber hinaus ist die kumulative Auswirkung von A und seiner Vorfahrenliste auf die Vorfahrenliste von B eine Zählung von 50. Dies wird durch den Wert current_max_ancestor zugelassen, und X kopiert daher die Vorfahren von Knoten A in seine Liste.
-
Wenn der Knoten B als ein Elternteil des Knotens X hinzugefügt wird, wird der Wert current_max_ancestor von X gleich 50 + 50 = 100. Die Gesamtauswirkung von B auf die Zahl der Vorfahren für X ist jedoch nur 25, wie oben erwähnt. Der Knoten X wird daher diese 25 zu seiner Vorfahrenliste hinzufügen. Das heißt, der Wert current_max_ancestor ist 100, aber X hat aktuell eine Vorfahrenliste von nur 75.
-
Wenn der Knoten C als ein Elternteil des Knotens X hinzugefügt wird, wird der Wert current_max_ancestor von X gleich 150 (aufgrund von drei Elternteilen). Der Knoten C fügt außerdem der Liste von Vorfahren von X eine Zählung von 60 hinzu. Die Vorfahrenliste von Knoten X wird daher 75 + 60 = 135.
-
Der Knoten Y andererseits hat eine relativ große Vorfahrenliste. Wenn der Knoten Y als ein Elternteil des Knotens X hinzugefügt wird, erhöht sich der Wert current_max_ancestor von X um 50 und wird 200. Außerdem würde das Hinzufügen der 110 Vorfahren, die von dem Knoten Y beigetragen werden, zu den vorhandenen 135 Vorfahren des Knotens X dazu führen, dass der Knoten X 245 Vorfahren hat. Dies würde den Wert current_max_ancestor von 200 übersteigen. Daher kann das System den Knoten X als einen BN neu definieren, wenn der Knoten Y als ein Elternteil hinzugefügt wird.
-
In manchen Implementierungen kann ein BN erzeugt werden, um zu vermeiden, dass zu viel Aggregations-Propagation höher in der Hierarchie vorhanden ist, so dass es sinnvoll ist, die Propagation an dem Punkt zu stoppen, an dem ein neuer Knoten oder eine neue Kante erzeugt wird. Darüber hinaus kann die Hinzufügung von Eltern-Knoten in einer anderen Reihenfolge als oben beschrieben erfolgen. Wenn zum Beispiel der Knoten Y vor den Knoten A, B und C als ein Elternteil des Knotens X hinzugefügt worden wäre, wäre das BN-Kriterium bereits an diesem Punkt erfüllt gewesen. Dementsprechend könnte der Knoten X früher als in dem vorhergehenden Beispiel als ein BN neu definiert worden sein.
-
In dem obigen Beispiel wurde die BN-Bedingung nicht mehr beibehalten, da die tatsächliche Zahl der Vorfahren zu groß wurde. In anderen Situationen kann die Bedingung nicht mehr als geltend erachtet werden, da die potentielle Zahl der Vorfahren unabhängig von der tatsächlichen Zahl der Vorfahren zu groß wird. Ein solches Beispiel wird als nächstes beschrieben. 10 zeigt ein weiteres Beispiel für die Bewertung eines Barrieren-Knoten-Kriteriums. Ähnlich wie bei dem vorhergehenden Beispiel enthält ein DAG 1000 einen Knoten X, und dem Knoten X sind Eltern-Knoten A, B, C und Y hinzufügen. Außerdem ist der Wert max_ancestor gleich 50, und ein Wert allowable_max_ancestor (zulässiger maximaler Vorfahrenwert) ist auf 200 gesetzt worden. Die Vorfahrenlisten der Knoten A, B, C und Y unterscheiden sich jedoch von dem vorhergehenden Beispiel, so dass sie hier jeweilige Zählungen von 50, 50, 50 und 40 Vorfahren zu der Vorfahrenliste des Knotens X beitragen.
-
Wenn daher der Knoten A als ein Elternteil des Knotens X hinzugefügt wird, wird der Wert current_max_ancestor von X gleich 50. Wenn der Knoten B als ein Elternteil des Knotens X hinzugefügt wird, wird der Wert current_max_ancestor von X gleich 100, und wenn der Knoten C als ein Elternteil des Knotens X hinzugefügt wird, wird der Wert current_ax_ ancestor von X gleich 150. Wenn schließlich der Knoten Y als ein Elternteil des Knotens X hinzugefügt wird, wird der Wert current_max_ancestor von X gleich 200. Dieser Wert ist jedoch derselbe wie der Wert allowable_max_ancestor von 200. Die Ungleichheit, dass current_max_ancestor kleiner als allowable_max_ancestor sein soll, gilt daher nicht mehr. Es kann somit ermittelt werden, dass X als ein BN neu zu definieren ist.
-
In manchen Implementierungen können mehrere BN-Kriterien bewertet werden, wie z. B. die oben erwähnte duale Ungleichheit, und wenn irgendeines davon erfüllt ist, kann der Knoten neu definiert werden. Zum Beispiel kann das Kriterium umfassen, dass eine Vorfahrenlisten-Größe mindestens gleich einem aktuellen maximalen Vorfahrenwert für den Knoten ist. Als ein weiteres Beispiel kann das Kriterium umfassen, dass ein aktueller maximaler Vorfahrenwert mindestens gleich einem globalen maximalen Vorfahrenwert ist.
-
Die obigen Beispiele umfassten, einen BN potentiell als einen NBN neu zu definieren. In manchen Implementierungen kann ein BN als ein NBN neu definiert werden. Zum Beispiel kann aufgrund einer Hierarchie-Aktualisierung wie z. B. Beseitigung einer großen Eltern-Hierarchie der Knoten als ein NBN besser geeignet sein. Dies kann unter Verwendung mindestens einer geschätzten Zahl von Vorfahren ermittelt werden. In manchen Implementierungen hat ein BN keine Vorfahrenliste, doch kann die Größe seiner potentiellen Vorfahrenliste unter Verwendung der Größen der Vorfahrenlisten seiner Eltern berechnet werden. In manchen Implementierungen kann ein anderes Kriterium als eines für NBN-zu-BN-Neudefinition verwendet werden. In manchen Implementierungen kann die folgende Bedingung verwendet werden
-
Dies kann zum Beispiel anstreben, dass es nicht zu viele Übergänge rückwärts und vorwärts von BN zu NBN und von NBN zu BN gibt. Dementsprechend kann ein solches Kriterium einen Schwellenwert umfassen, der stringenter ist als ein entsprechender Schwellenwert für das andere Kriterium.
-
In manchen Implementierungen können ein oder mehrere Signale verwendet werden, um einen Übergang zwischen BN und NBN auszulösen. Es kann manchmal vorzuziehen sein, Aggregations-Abfragen und Suchabfragen für manche Benutzer schneller als für andere Benutzer zu bedienen. Dies kann zum Beispiel von dem Dienst-Niveau abhängen, das der Benutzer erhält, so dass bestimmte Benutzer als Gegenleistung für eine fortgeschrittenere oder schnellere Implementierung einen Beitrag zahlen. Ein anderer Benutzer wiederum könnte einen ermäßigten oder kostenlosen Dienst erhalten, als Gegenleistung für eine reduzierte Menge an Ressourcen, die beim Bedienen der Abfragen und Aufrechterhalten der Hierarchien verwendet werden. Manche Implementierungen können eine Balance zwischen Ressourcennutzung und Abfragezeit-Leistung für Aggregationen herstellen und auf Basis einer Graphen-Priorität in tiefen, großen und/oder häufig aktualisierten DAGs suchen. Wenn zum Beispiel ein Graph eine höhere Priorität hat, können die Abfragen relativ schnell bedient werden, und wenn der Graph eine niedrigere Priorität hat, kann das System einen Kompromiss zwischen Abfragezeit-Leistung und Ressourceneinsparungen herstellen.
-
Die Balance der Zahl der BNs zu der Zahl der NBNs kann die obigen Charakteristika beeinflussen. Beispiele für Signale, die verwendet werden können, um zu ermitteln, wie die Balance zwischen ihnen zu treffen ist, umfassen, ohne darauf beschränkt zu sein: die Identität des Kunden, zu dem die Datei-Ordner-Hierarchie gehört, wie z. B. das für den Kunden zugängliche Dienst-Niveau; und das Hierarchieverhalten, wie z. B. dass eine Hierarchie, die häufig aktualisiert wird, relativ mehr BNs haben sollte, während eine Hierarchie, die häufig abgefragt wird, die Zahl der BNs auf einer relativ niedrigeren Zahl halten kann.
-
Manche der obigen Beispiele haben Aggregationen von Dateizählungen unter jeweiligen Knoten in einem DAG einbezogen. Andere Informationen über Knoten können ebenfalls oder stattdessen abgefragt werden. In manchen Implementierungen kann effizientes Suchen in einem DAG ermöglicht werden. Suchen über einer Hierarchie kann als Suchen nach allen Knoten in der Hierarchie definiert werden, die eine bestimmte Bedingung erfüllen. Zum Beispiel kann eine Abfrage der Anforderung entsprechen „Zeige mir alle Bilder in diesem Ordner, auf die ich zugreifen kann“ oder „Zeige mir alle Dateien in diesem Ordner, die einem bestimmten Muster entsprechen, z. B. '*.pdf’ (d. h., ein Platzhalterausdruck für PDF-Dateien)“. Unter Verwendung von BNs und NBNs kann eine solche Suche effizient auch in DAGs durchgeführt werden, die tief sind, einen hohen Ausfächerungsgrad haben und/oder wenn sich die Hierarchiestruktur häufig ändert.
-
In Bezug auf Suchen kann ein BN vorberechnete Such-Metadaten eines Teilbaums darunter bis zu einer gewissen Tiefe speichern. Das heißt, der BN kann die Such-Metadaten des ganzen Teilbaums speichern oder nicht. Wenn der BN nicht alle Such-Metadaten des ganzen Teilbaums darunter speichern kann, kann er die Liste der darunter liegenden BNs speichern, da die Metadaten dieser BNs zu lesen sind, um die Statistik des ganzen Teilbaums unter dem Knoten zu berechnen. Als ein BN propagiert der Knoten nicht die Such-Metadaten oberhalb von sich selbst, sondern alle Such-Metadaten darunter werden nur zu dem BN vorgerollt. Hingegen kann ein NBN die Liste der Vorfahren oberhalb von sich speichern, bis er den ersten BN in seiner Hierarchie erreicht (z. B. in jedem Pfad aufwärts). Er kann somit seine Such-Metadaten bis zu den BN(s) hinauf propagieren. Das heißt, statt wie in anderen Beispielen hierin Werte zu aggregieren, können bestimmte Implementierungen Indizes aufwärts in einer Hierarchie aggregieren, bis die BN(s) gefunden werden.
-
11 zeigt ein Beispiel für das Aggregieren von Indizes in einem DAG 1100. Hier sind Knoten A bis J gezeigt. Die Knoten A, E und F sind BNs, und die Knoten B, C, D, G, H, I und J sind NBNs. Jeder Knoten kann einige Informationen enthalten. Ein Dateityp-Feld 1110 zeigt an, welchem Dateityp der Knoten zugeordnet ist. Zum Beispiel hat der Knoten B den Dateityp „Ordner“, der Knoten E hat den Dateityp „Bild“, und der Knoten H hat den Typ Dokument („Doc“). Ein Ordner-Feld 1120 zeigt an, ob der Knoten einen oder mehrere Ordner aggregiert, und wenn ja, den Namen des oder der Ordner. Zum Beispiel enthält das Ordner-Feld für den Knoten B „B“, das Ordner-Feld für den Knoten F enthält „F, G“, da er der BN für den Knoten G ist, welcher ein Ordner ist, und der Knoten E - welcher ein Bild, kein Ordner ist - hat kein Ordner-Feld. Ein Bild-Feld 1130 zeigt überdies den Namen des/der von dem Knoten aggregierten Bildes/Bilder an, falls vorhanden. Zum Beispiel enthält das Bild-Feld für den Knoten A „I“, da der Knoten I hier einem Bild entspricht. Der Knoten J hingegen, der ebenfalls ein Bild ist, ist im Bild-Feld des Knotens A nicht identifiziert, da der Knoten J unter einem anderen BN, nämlich dem Knoten F, aggregiert ist. Das heißt, das Bild-Feld des Knotens F enthält den Eintrag „J“, da der Knoten J hier das einzige Bild ist, das zu dem Knoten F aggregiert ist.
-
Man betrachte nun eine Situation, in der der Benutzer alle Bilder zusammen und alle Dokumente zusammen zeigen möchte. Als NBNs werden die Knoten B, C, D und I ihre Indizes zu dem Knoten A aggregieren, welcher ein BN ist. Die Knoten E und F sind BNs und propagieren daher ihre Indizes nicht aufwärts. Die Knoten G, H und J schließlich sind NBNs und werden somit ihre Indizes zu dem Knoten F, einem BN, propagieren und nicht darüber hinaus. Angenommen, dass die Abfrage zum Beispiel alle Bilder unter dem Knoten A sucht. Dies kann mathematisch ausgedrückt werden als Abfrage nach
-
Das heißt, die Abfrage konzentriert sich auf die Knoten A, E und F, von denen jeder ein BN ist. Die Knoten I, E und J sind hier Bilder, die zu den obigen Kriterien passen. Dementsprechend können diese Bilder das Ergebnis der Suche sein.
-
Als weiteres Beispiel sei angenommen, dass alle Bilder unter dem Knoten D gesucht werden. Dies kann mathematisch ausgedrückt werden als Abfrage nach
-
Das heißt, die Abfrage konzentriert sich auf den Knoten D, der ein NBN ist, und den BN darunter, den Knoten F. Die Knoten I und J sind hier Bilder, die zu den obigen Kriterien passen. Dementsprechend können diese Bilder das Ergebnis der Suche sein.
-
Als weiteres Beispiel sei angenommen, dass alle Bilder unter Knoten G gesucht werden. Dies kann mathematisch ausgedrückt werden als Abfrage nach
-
Das heißt, die Abfrage konzentriert sich auf den Knoten G, der ein NBN ist, der keine BN darunter hat. Der Knoten J ist hier ein Bild, das zu dem obigen Kriterium passt. Dementsprechend kann dieses Bild das Ergebnis der Suche sein.
-
In manchen Situationen kann die Bildung eines Zyklus während einer Kantenhinzufügung in einem Baum oder DAG unerwünscht sein. Beispiele können umfassen, einen Ordner als ein Kind seines eigenen Kind-Ordners in einem Dateisystem hinzuzufügen. Ein System, das erwartet, Echtzeit-Zykluserkennung durchzuführen, wenn eine Kante hinzugefügt wird, arbeitet möglicherweise nicht für große oder komplexe Hierarchien. Andererseits könnte ein System, das irgendwelche potentiellen Zyklen vorauszuberechnen sucht, an Aktualisierungs-Latenzen leiden.
-
Eine Methode, die BNs und NBNs einbezieht, kann effiziente Zyklusverhinderung bereitstellen. 12 zeigt ein Beispiel für Zyklusverhinderung in einem DAG 1200. Der DAG 1200 enthält eine Zahl von Knoten, von denen zur Vereinfachung nur einige gezeigt sind. Knoten A, B, C und D sind bezeichnet worden. Die Knoten A und B sind NBNs, und die Knoten C und D sind BNs.
-
Es sei nun angenommen, dass ein Benutzer versucht, eine Kante 1210 von Knoten B zu Knoten A zu erzeugen. Wenn Knoten A bereits ein Vorfahre von Knoten B ist, kann es in vielen (oder den meisten) Fällen möglich sein, Knoten A zu finden, der bereits in der Vorfahrenliste von Knoten B enthalten ist. Zum Beispiel, die Kappung von Vorfahrenlisten ausreichend groß halten, kann dies anstreben. In anderen Fällen ist Knoten A jedoch nicht in der Vorfahrenliste von Knoten A, doch ist Knoten A ein Vorfahre von Knoten B. In solchen Situationen kann das System eine oder mehrere BNs auf den Pfad(en) nachschlagen, die die Knoten A und B verbinden.
-
Hier ist auf der Kante 1210, die die Knoten A und B verbindet, Knoten C der nächste BN-Nachfahre von Knoten A, und Knoten D ist der nächste BN-Vorfahre von Knoten B. Wie gezeigt, kann es mehr als einen BN zwischen A und B geben. Und wenn A selbst ein BN ist, kann man für diese Zwecke C = A ansehen, und ähnlich für Knoten B.
-
Wenn A ein Vorfahren-Knoten von Knoten B ist, sollte das Folgende erfüllt sein, vorausgesetzt, dass die Knoten C und D verschieden sind:
-
Das heißt, die RFI von C sollte den Knoten D enthalten, da die RFI kumulativ ist und daher alle BN-Nachfahren speichert. Daher kann folgen, dass
Wenn A ein Vorfahre von B ist, dann ∃ mindestens zwei Barrieren-Knoten C und D:
- 1. C : C ist einer der nächsten Barrieren-Knoten von A
- 2. D : D ist einer der früheren Barrieren-Knoten von B
so dass:
- {D} ∈ C.Zusammenführungs-Liste oder C = D
-
Wenn daher A ein Vorfahre von B ist, sollte eines von Folgendem gelten:
oder
oder
-
Somit kann die Erzeugung eines Zyklus in dem DAG erkannt und daher verhindert werden, falls nötig. Ein Verfahren kann umfassen, zu erkennen, dass eine neue Beziehung in den DAG eingeführt wird, und zu ermitteln, ob die neue Beziehung zyklisch ist. Diese Ermittlung kann auf einem Computer auf sehr effiziente Weise implementiert werden, indem die obigen Randbedingungen jedes Mal überprüft werden, wenn einem Graphen (DAG) eine Kante hinzugefügt wird. Zum Beispiel kann eine RFI verwendet werden. Wenn ermittelt wird, dass die neue Beziehung zyklisch ist, kann die neue Beziehung in dem DAG verhindert werden.
-
13 zeigt ein Beispiel für eine generische Computervorrichtung 1300 und eine generische mobile Computervorrichtung 1350, welche mit den hier beschriebenen Techniken verwendet werden können. Die Computervorrichtung 1300 soll verschiedene Formen von digitalen Computern repräsentieren, wie z. B. Laptops, Desktops, Tablets, Workstations, persönliche digitale Assistenten, Fernseher, Server, Blade-Server, Mainframes und andere geeignete Computervorrichtungen. Die Computervorrichtung 1350 soll verschiedene Formen von mobilen Vorrichtungen repräsentieren, wie z. B. persönliche digitale Assistenten, Mobiltelefone, Smartphones und andere ähnliche Computervorrichtungen. Die hier gezeigten Komponenten, ihre Verbindungen und Beziehungen sowie ihre Funktionen sollen nur beispielhaft sein und sollen Implementierungen der in diesem Dokument beschriebenen und/oder beanspruchten Erfindungen nicht beschränken.
-
Die Computervorrichtung 1300 enthält einen Prozessor 1302, einen Speicher 1304, eine Speichervorrichtung 1306, eine Hochgeschwindigkeitsschnittstelle 1308, die mit dem Speicher 1304 und mit Hochgeschwindigkeits-Erweiterungsanschlüssen 1310 verbindet, und eine Niedriggeschwindigkeitsschnittstelle 1312, die mit einen Niedriggeschwindigkeitsbus 1314 und der Speichervorrichtung 1306 verbindet. Der Prozessor 1302 kann ein Prozessor auf Halbleiterbasis sein. Der Speicher 1304 kann Speicher auf Halbleiterbasis sein. Alle Komponenten 1302, 1304, 1306, 1308, 1310 und 1312 sind mittels verschiedener Busse miteinander verbunden und können auf einer gemeinsamen Hauptplatine oder auf andere geeignete Weisen montiert sein. Der Prozessor 1302 kann Anweisungen zur Ausführung in der Computervorrichtung 1300 verarbeiten, einschließlich Anweisungen, die in dem Speicher 1304 oder in der Speichervorrichtung 1306 gespeichert sind, um grafische Informationen für eine GUI auf einer externen Eingabe-/Ausgabevorrichtung anzuzeigen, wie z. B. einer Anzeige 1316, die mit der Hochgeschwindigkeitsschnittstelle 1308 gekoppelt ist. In anderen Implementierungen können mehrere Prozessoren und/oder mehrere Busse zusammen mit mehreren Speichern und Arten von Speichern verwendet werden. Außerdem können mehrere Computervorrichtungen 1300 verbunden sein, wobei jede Vorrichtung Teile der notwendigen Operationen bereitstellt (z. B. als eine Serverbank, eine Gruppe von Blade-Servern oder ein Multiprozessorsystem).
-
Der Speicher 1304 speichert Informationen in der Computervorrichtung 1300.
-
In einer Implementierung ist der Speicher 1304 eine flüchtige Speichereinheit oder flüchtige Speichereinheiten. In einer anderen Implementierung ist der Speicher 1304 eine nichtflüchtige Speichereinheit oder nichtflüchtige Speichereinheiten. Der Speicher 1304 kann auch eine andere Form eines computerlesbaren Mediums sein, wie z. B. eine magnetische oder optische Platte.
-
Die Speichervorrichtung 1306 ist in der Lage, Massenspeicher für die Computervorrichtung 1300 bereitzustellen. In einer Implementierung kann die Speichervorrichtung 1306 ein computerlesbares Medium sein oder enthalten, wie z. B. eine Diskettenvorrichtung, eine Festplattenvorrichtung, eine optische Plattenvorrichtung, oder eine Bandvorrichtung, ein Flash-Speicher oder eine andere ähnliche Festkörperspeichervorrichtung, oder eine Anordnung von Vorrichtungen, einschließlich Vorrichtungen in einem Speichernetzwerk oder anderen Konfigurationen. Ein Computerprogrammprodukt kann greifbar in einem Informationsträger verkörpert sein. Das Computerprogrammprodukt kann auch Anweisungen enthalten, die bei Ausführung ein oder mehrere Verfahren wie die oben beschriebenen durchführen. Der Informationsträger ist ein computer- oder maschinenlesbares Medium, wie z. B. der Speicher 1304, die Speichervorrichtung 1306 oder Speicher auf dem Prozessor 1302.
-
Die Hochgeschwindigkeitssteuerung 1308 verwaltet bandbreitenintensive Operationen für die Computervorrichtung 1300, während die Niedriggeschwindigkeitssteuerung 1312 weniger bandbreitenintensive Operationen verwaltet. Eine solche Zuweisung von Funktionen ist nur beispielhaft. In einer Implementierung ist die Hochgeschwindigkeitssteuerung 1308 mit dem Speicher 1304, der Anzeige 1316 (z. B. durch einen Grafikprozessor oder -beschleuniger) und mit Hochgeschwindigkeits-Erweiterungsanschlüssen 1310 gekoppelt, die verschiedene Erweiterungskarten (nicht gezeigt) annehmen können. Bei der Implementierung ist die Niedriggeschwindigkeitssteuerung 1312 mit der Speichervorrichtung 1306 und dem Niedriggeschwindigkeits-Erweiterungsanschluss 1314 gekoppelt. Der Niedriggeschwindigkeits-Erweiterungsanschluss, der verschiedene Kommunikationsanschlüsse enthalten kann (z. B. USB, Bluetooth, Ethernet, drahtloses Ethernet), kann mit einer oder mehreren Eingabe-/Ausgabevorrichtungen wie z. B. einer Tastatur, einer Zeigevorrichtung, einem Scanner oder einer Netzwerkvorrichtung wie z. B. einem Switch oder Router gekoppelt sein, z. B. über einen Netzwerkadapter.
-
Die Computervorrichtung 1300 kann in einer Anzahl von verschiedenen Formen implementiert werden, wie in der Figur gezeigt. Zum Beispiel kann sie als ein Standardserver 1320 oder mehrere Male in einer Gruppe von solchen Servern implementiert werden. Sie kann auch als Teil eines Rack-Server-Systems 1324 implementiert werden. Außerdem kann sie in einem persönlichen Computer wie z. B. einem Laptop-Computer 1322 implementiert werden. Alternativ können Komponenten aus der Computervorrichtung 1300 mit anderen Komponenten in einer mobilen Vorrichtung (nicht gezeigt) wie z. B. der Vorrichtung 1350 kombiniert werden. Jede dieser Vorrichtungen kann eine oder mehrere der Computervorrichtungen 1300, 1350 enthalten, und ein Gesamt-System kann aus mehreren Computervorrichtungen 1300, 1350 bestehen, die miteinander kommunizieren.
-
Die Computervorrichtung 1350 enthält neben anderen Komponenten einen Prozessor 1352, einen Speicher 1364, eine Eingabe-/Ausgabevorrichtung wie z. B. eine Anzeige 1354, eine Kommunikationsschnittstelle 1366 und einen Transceiver 1368. Die Vorrichtung 1350 kann auch mit einer Speichervorrichtung versehen sein, wie z. B. einem Mikrolaufwerk oder einer anderen Vorrichtung, um zusätzlichen Speicher bereitzustellen. Alle Komponenten 1350, 1352, 1364, 1354, 1366 und 1368 sind mittels verschiedener Busse miteinander verbunden, und mehrere der Komponenten können auf einer gemeinsamen Hauptplatine oder auf andere geeigneten Weisen montiert sein.
-
Der Prozessor 1352 kann Anweisungen in der Computervorrichtung 1350 ausführen, einschließlich Anweisungen, die in dem Speicher 1364 gespeichert sind. Der Prozessor kann als Chipsatz von Chips implementiert werden, die getrennte und mehrere analoge und digitale Prozessoren umfassen. Der Prozessor kann zum Beispiel für Koordination der anderen Komponenten der Vorrichtung 1350 sorgen, wie z. B. Steuerung von Benutzerschnittstellen, Anwendungen, die von der Vorrichtung 1350 laufen gelassen werden, und drahtlose Kommunikation mittels der Vorrichtung 1350.
-
Der Prozessor 1352 kann über eine Steuerschnittstelle 1358 und eine Anzeigeschnittstelle 1356, die mit einer Anzeige 1354 gekoppelt ist, mit einem Benutzer kommunizieren. Die Anzeige 1354 kann zum Beispiel eine TFT-LCD (Dünnfilmtransistor-Flüssigkristallanzeige) oder eine OLED-Anzeige (Anzeige mit organischen Leuchtdioden) oder eine andere geeignete Anzeigetechnik sein. Die Anzeigeschnittstelle 1356 kann eine geeignete Schaltung zum Ansteuern der Anzeige 1354 aufweisen, um einem Benutzer graphische und andere Informationen zu präsentieren. Die Steuerschnittstelle 1358 kann Befehle von einem Benutzer empfangen und sie zur Übermittlung an den Prozessor 1352 umwandeln. Außerdem kann eine externe Schnittstelle 1362 für Kommunikation mit dem Prozessor 1352 sorgen, um Nahbereichskommunikation der Vorrichtung 1350 mit anderen Vorrichtungen zu ermöglichen. Die externe Schnittstelle 1362 kann zum Beispiel für drahtgebundene Kommunikation in manchen Implementierungen oder für drahtlose Kommunikation in anderen Implementierungen sorgen, und es können auch mehrere Schnittstellen verwendet werden.
-
Der Speicher 1364 speichert Informationen in der Computervorrichtung 1350. Der Speicher 1364 kann als eines oder mehrere von einem oder mehreren computerlesbaren Medien, flüchtigen Speichereinheiten oder nichtflüchtigen Speichereinheiten implementiert werden. Erweiterungsspeicher 1374 kann ebenfalls vorgesehen und mit der Vorrichtung 1350 über eine Erweiterungsschnittstelle 1372 verbunden sein, die zum Beispiel eine SIMM (Single In Line Memory Module) -Kartenschnittstelle enthalten kann. Ein solcher Erweiterungsspeicher 1374 kann zusätzlichen Speicherplatz für die Vorrichtung 1350 bereitstellen oder kann ebenfalls Anwendungen oder andere Informationen für die Vorrichtung 1350 speichern. Insbesondere kann der Erweiterungsspeicher 1374 Anweisungen zum Ausführen oder Ergänzen der oben beschriebenen Prozesse enthalten und kann auch sichere Informationen enthalten. So kann zum Beispiel der Erweiterungsspeicher 1374 als ein Sicherheitsmodul für die Vorrichtung 1350 dienen und kann mit Anweisungen programmiert werden, die eine sichere Verwendung der Vorrichtung 1350 ermöglichen. Zusätzlich können sichere Anwendungen über die SIMM-Karten zusammen mit zusätzlichen Informationen bereitgestellt werden, wie z. B. Anordnen von Identifizierungsinformationen auf eine nicht-hackbare Weise auf der SIMM-Karte.
-
Der Speicher kann zum Beispiel Flash-Speicher und/oder NVRAM-Speicher umfassen, wie nachfolgend erörtert. In einer Implementierung ist ein Computerprogrammprodukt greifbar in einem Informationsträger verkörpert. Das Computerprogrammprodukt enthält Anweisungen, die bei Ausführung ein oder mehrere Verfahren wie z. B. die oben beschriebenen durchführen. Der Informationsträger ist ein computer- oder maschinenlesbares Medium wie z. B. der Speicher 1364, Erweiterungsspeicher 1374 oder Speicher auf dem Prozessor 1352, das zum Beispiel über den Transceiver 1368 oder die externe Schnittstelle 1362 empfangen werden kann.
-
Die Vorrichtung 1350 kann über die Kommunikationsschnittstelle 1366 drahtlos kommunizieren, welche eine digitale Signalverarbeitungsschaltung enthalten kann, wenn nötig. Die Kommunikationsschnittstelle 1366 kann für Kommunikation unter verschiedenen Modi oder Protokollen sorgen, wie z. B. unter anderen GSM-Sprachanrufe, SMS, EMS oder MMS-Nachrichtenübermittlung, CDMA, TDMA, PDC, WCDMA, CDMA2000 oder GPRS. Eine solche Kommunikation kann zum Beispiel durch einen Hochfrequenz-Transceiver 1368 erfolgen. Zusätzlich kann Nahbereichskommunikation stattfinden, wie z. B. Verwendung von Bluetooth, WiFi oder einem anderen derartigen Transceiver (nicht gezeigt). Außerdem kann ein GPS (Global Positioning System) -Empfängermodul 1370 zusätzliche navigations- und ortsbezogene drahtlose Daten an die Vorrichtung 1350 senden, die nach Bedarf von auf der Vorrichtung 1350 laufenden Anwendungen verwendet werden können.
-
Die Vorrichtung 1350 kann auch unter Verwendung eines Audio-Codec 1360 hörbar kommunizieren, welcher gesprochene Informationen von einem Benutzer empfangen und in nutzbare digitale Informationen umwandeln kann. Der Audio-Codec 1360 kann ähnlich hörbaren Schall für einen Benutzer erzeugen, wie z. B. durch einen Lautsprecher, z. B. in einem Handapparat der Vorrichtung 1350. Solcher Schall kann Schall von Sprachtelefonanrufen enthalten, kann aufgezeichneten Schall enthalten (z. B. Sprachnachrichten, Musikdateien usw.) und kann auch Schall enthalten, der von Anwendungen erzeugt wird, die auf der Vorrichtung 1350 arbeiten.
-
Die Computervorrichtung 1350 kann in einer Anzahl von verschiedenen Formen implementiert werden, wie in der Figur gezeigt. Zum Beispiel kann sie als ein Mobiltelefon 1380 implementiert werden. Sie kann auch als Teil eines Smartphone 1382, eines persönlichen digitalen Assistenten oder einer anderen ähnlichen mobilen Vorrichtung implementiert werden.
-
Verschiedene Implementierungen der hier beschriebenen Systeme und Techniken können in digitalen elektronischen Schaltungen, integrierten Schaltungen, speziell entworfenen ASICs (anwendungsspezifischen integrierten Schaltungen), Computerhardware, Firmware, Software und/oder Kombinationen davon realisiert werden. Diese verschiedenen Implementierungen können Implementierung in einem oder mehreren Computerprogrammen umfassen, die auf einem programmierbaren System ausführbar und/oder interpretierbar sind, einschließlich mindestens eines programmierbaren Spezial- oder Allzweck-Prozessors, der zum Empfangen von Daten und Anweisungen von und zum Übertragen von Daten und Anweisungen an ein Speichersystem, mindestens eine Eingabevorrichtung und mindestens eine Ausgabevorrichtung gekoppelt ist.
-
Diese Computerprogramme (auch bekannt als Programme, Software, Softwareanwendungen oder Code) enthalten Maschinenbefehle für einen programmierbaren Prozessor und können in einer übergeordneten verfahrensorientierten und/oder objektorientierten Programmiersprache und/oder in Assembler-/Maschinensprache implementiert werden. Wie hierin verwendet, beziehen sich die Begriffe „maschinenlesbares Medium“ und „computerlesbares Medium“ auf irgendein Computerprogrammprodukt, Gerät und/oder Vorrichtung (z. B. Magnetplatten, optische Platten, Speicher, Programmierbare Logikvorrichtungen (PLDs)), das verwendet wird, um Maschinenbefehle und/oder Daten einem programmierbaren Prozessor zuzuführen, einschließlich eines maschinenlesbaren Mediums, das Maschinenbefehle als ein maschinenlesbares Signal empfängt. Der Begriff „maschinenlesbares Signal“ bezieht sich auf irgendein Signal, das verwendet wird, um einem programmierbaren Prozessor Maschinenbefehle und/oder Daten zuzuführen.
-
Um Interaktion mit einem Benutzer zu ermöglichen, können die hier beschriebenen Systeme und Techniken auf einem Computer implementiert werden, der eine Anzeigevorrichtung (z. B. einen CRT (Kathodenstrahlröhre) oder LCD (Flüssigkristallanzeige) -Monitor) zum Anzeigen von Informationen an den Benutzer und eine Tastatur und eine Zeigevorrichtung (z. B. eine Maus oder einen Trackball) aufweist, worüber der Benutzer Eingaben in den Computer tätigen kann. Andere Arten von Vorrichtungen können ebenfalls verwendet werden, um Interaktion mit einem Benutzer zu ermöglichen; zum Beispiel kann eine dem Benutzer gegebene Rückmeldung irgendeine Form von sensorischer Rückmeldung sein (z. B. visuelle Rückmeldung, akustische Rückmeldung oder taktile Rückmeldung); und eine Eingabe vom Benutzer kann in irgendeiner Form empfangen werden, einschließlich akustischer, sprachlicher oder taktiler Eingabe.
-
Die hier beschriebenen Systeme und Techniken können in einem Computersystem implementiert werden, das eine Back-End-Komponente (z. B. als ein Datenserver) umfasst oder das eine Middleware-Komponente (z. B. einen Anwendungsserver) umfasst oder das eine Front-End-Komponente (z. B. einen Client-Computer mit einer grafischen Benutzerschnittstelle oder einem Web-Browser, über den ein Benutzer mit einer Implementierung der hier beschriebenen Systeme und Techniken interagieren kann) oder irgendeine Kombination von solchen Backend-, Middleware- oder Front-End-Komponenten umfasst. Die Komponenten des Systems können durch irgendeine Form oder irgendein Medium für digitale Datenkommunikation (z.B. ein Kommunikationsnetzwerk) miteinander verbunden sein. Beispiele für Kommunikationsnetzwerke umfassen ein lokales Netzwerk („LAN“), ein Weitbereichsnetzwerk („WAN“) und das Internet.
-
Das Computersystem kann Clients und Server umfassen. Ein Client und ein Server sind im Allgemeinen voneinander entfernt und interagieren typischerweise über ein Kommunikationsnetzwerk. Die Beziehung von Client und Server entsteht durch Computerprogramme, die auf den jeweiligen Computern laufen und eine Client-Server-Beziehung zueinander haben.
-
In einem Beispiel umfasst Barrieren-Knoten-Aggregation: in einem gerichteten azyklischen Graphen, in dem jeder Knoten entweder als ein Barrieren-Knoten oder als ein Nicht-Barrieren-Knoten definiert ist, für einen ersten Barrieren-Knoten jeden Nachfahren-Knoten zu identifizieren, der ein nächster Barrieren-Knoten zu dem ersten Barrieren-Knoten ist; und an dem ersten Barrieren-Knoten Informationen von jedem Nicht-Barrieren-Knoten, der ein Nachfahre des ersten Barrieren-Knotens ist und nicht durch irgendeinen identifizierten nächsten Barrieren-Knoten davon getrennt ist, zu aggregieren. Nicht-Barrieren-Knoten-Propagation umfasst: in einem gerichteten azyklischen Graphen, in dem jeder Knoten entweder als ein Barrieren-Knoten oder als ein Nicht-Barrieren-Knoten definiert ist, für einen ersten Nicht-Barrieren-Knoten jeden Vorfahren-Knoten zu identifizieren, der ein früherer Barrieren-Knoten zu dem ersten Nicht-Barrieren-Knoten ist; und Informationen des ersten Nicht-Barrieren-Knotens zu jedem identifizierten früheren Barrieren-Knoten und zu jedem Nicht-Barrieren-Knoten zwischen dem ersten Nicht-Barrieren-Knoten und dem identifizierten früheren Barrieren-Knoten zu propagieren.
-
Es sind eine Anzahl von Ausführungsformen beschrieben worden. Nichtsdestoweniger versteht es sich, dass verschiedene Modifizierungen vorgenommen werden können, ohne den Geist und Schutzbereich der Erfindung zu verlassen.
-
Außerdem erfordern die in den Figuren dargestellten Logikflüsse nicht die bestimmte gezeigte Folge oder Reihenfolge, um erwünschte Ergebnisse zu erzielen. Zusätzlich können andere Schritte vorgesehen werden, oder es können Schritte aus den beschriebenen Flüssen entfernt werden, und andere Komponenten können den beschriebenen Systemen hinzugefügt oder von diesen entfernt werden. Dementsprechend liegen andere Ausführungsformen innerhalb des Schutzbereichs der folgenden Ansprüche.
-
ZITATE ENTHALTEN IN DER BESCHREIBUNG
-
Diese Liste der vom Anmelder aufgeführten Dokumente wurde automatisiert erzeugt und ist ausschließlich zur besseren Information des Lesers aufgenommen. Die Liste ist nicht Bestandteil der deutschen Patent- bzw. Gebrauchsmusteranmeldung. Das DPMA übernimmt keinerlei Haftung für etwaige Fehler oder Auslassungen.
-
Zitierte Patentliteratur
-