- Ziel des Google Graph Mining Teams ist es, eine hochskalierbare Bibliothek für Graph-Algorithmen und -Analysen aufzubauen und in Google-Produkten einzusetzen; der derzeitige Umfang umfasst eine Sammlung von Clustering-Algorithmen
- Die entwickelten Tools zielen auf den Aufbau von Ähnlichkeitsgraphen, Clustering, Node Classification, Node Embeddings, Training von Graph Neural Networks, Graph-Visualisierung, verschiedene Sampling-Verfahren und Ähnlichkeits-Ranking
- Der Clustering-Bereich besteht aus Shared-Memory-Parallelalgorithmen, die bis auf Graphen mit mehreren zehn Milliarden Kanten skalieren, sowie mehreren sequenziellen Algorithmen
- Die parallelen Algorithmen sind Implementierungen auf Basis von Forschungsarbeiten zu HAC, Correlation Clustering, Affinity Clustering und Parline
- Das Graph Neural Network Framework wird im separaten Projekt TF-GNN bereitgestellt
- Für einen schnellen Start installiert man Bazel und führt anschließend
bazel run //examples:quickstartaus - Dies ist kein offiziell von Google unterstütztes Produkt; Fragen und Feedback sollen über Issues in diesem Repository eingereicht werden
1 Kommentare
Hacker-News-Kommentare
Graph Mining war vor etwa zehn Jahren wirklich im Trend. Das erinnert an GraphX (https://spark.apache.org/graphx/) und GraphLab (https://en.wikipedia.org/wiki/GraphLab) sowie an Graphdatenbanken.
Vermutlich fiel das zeitlich mit dem Social-Network-Phänomen zusammen; in jüngerer Zeit bekam geometrisches Lernen, also Machine Learning auf Graphen und anderen Strukturen, Aufmerksamkeit, wurde dann aber von LLMs aus dem Rampenlicht verdrängt. Trotzdem halte ich geometrisches Lernen weiterhin für sehr vielversprechend und würde mir wünschen, dass es populärer wird.
In solchen Graphen gibt es üblicherweise extrem viele unterschiedliche Kantentypen, etwa „ist verheiratet mit“ oder „hat eine Jahresdurchschnittstemperatur“. Dagegen haben Graphalgorithmen wie PageRank oder Graph-Zentralität oft nur einen oder wenige Kantentypen. Es gibt zwar allgemeine Algorithmen, die auch auf Graphen mit mehreren Kantentypen anwendbar sind; zum Beispiel findet das SPARQL-Muster
?s1 ?p ?o . ?s2 ?p ?o .die?s1und?s2, die ein bestimmtes?ound eine Beziehung?pgemeinsam haben, und bildet damit die Grundlage für ein Ähnlichkeitsmaß zwischen ihnen. Graphen haben im Allgemeinen keine festgelegte Form, können also jede beliebige Struktur annehmen, und aus Sicht der Speicherlatenz kann das eine Katastrophe sein. Früher habe ich einmal mit genau diesem SPARQL-Muster ein Programm gebaut, das 100 Jahre gebraucht hätte; nachdem ich die Datenstruktur neu gepackt und eine Approximation gefunden hatte, ließ es sich in unter 20 Minuten berechnen. Deshalb stehen Praktiker universellen Graph-Processing-Bibliotheken eher skeptisch gegenüber. Häufig gibt es Probleme, bei denen man in weniger Zeit, als man mit dem Build-System ringt, spezialisierten Code schreiben kann, der 1000-mal schneller ist.Wenn man trotzdem dem Trend folgen will: Auf arXiv gibt es derzeit jede Menge Paper zu Graph Neural Networks, die anderswo nicht ganz so stark gehypt werden. YOShInOn hat mir eine lange Liste von GNN-Papern zum Lesen zusammengestellt, aber ich habe nur ein paar überflogen. Es gibt viele Texte, die behaupten, sie seien auf die Textanalyseprobleme anwendbar, an denen ich arbeite, aber sie wirken nicht unbedingt besser als die Systeme, die YOShInOn und ich verwenden, deshalb habe ich es damit nicht eilig.
Wer mit Graphen und Machine Learning experimentieren möchte: Beim Durchsehen der aktuellen ArangoDB-Dokumentation habe ich gesehen, dass sie Integrationen mit mehreren Graphbibliotheken und Machine-Learning-Frameworks enthält: https://docs.arangodb.com/3.11/data-science/adapters/
Es gab auch einige Jupyter-Notebooks zu Machine Learning auf Graphen: https://github.com/arangodb/interactive_tutorials#machine-learning
Zu den Integrationszielen gehören NetworkX -- https://networkx.org/, DeepGraphLibrary -- https://www.dgl.ai/, cuGraph (Rapids.ai Graph) -- https://docs.rapids.ai/api/cugraph/stable/, und PyG (PyTorch Geometric) -- https://pytorch-geometric.readthedocs.io/en/latest/.
Gibt es jemanden, der mit Bazel vertraut ist und Hinweise zur Build-Anleitung geben kann?
bazel buildmacht zwar irgendetwas, aber am Ende entstehen nurbazel-buildundbazel-build, und ich sehe kein auffälliges Build-Artefakt.//...ungefähr wie das Targetallbei make.Man kann es z. B. als
bazel build //...,bazel test //...,bazel query //...verwenden. Der letzte Befehl listet meiner Erinnerung nach alle Targets auf.bazel build //in_memory/connected_components:asynchronous_union_findasynchronous_union_find bauen.Allerdings ist das außerhalb des Kontexts einer
cc_binary-Regel möglicherweise nicht besonders nützlich. Auf diese Weise kann man, ohne das gesamte Repository zu bauen, nur die Pakete bauen und verwenden, die man in einem anderen Projekt benötigt. Wenn man etwa nur den Headerasynchronous_union_find.hverwenden möchte, fügt man die graph-mining-Bibliothek irgendwo in derWORKSPACE-Datei des Projekts pergit_repository-Regel hinzu (siehe BeispielWORKSPACE.bazel) und ergänzt in dercc_library-Regel in derBUILD-Datei des Projekts@graph-mining//in_memory/connected_components:asynchronous_union_find. Dann kann der Header anderswo eingebunden werden, und beim Build des Projekts werden nur dieses Paket und seine Abhängigkeiten gebaut, nicht die gesamte graph-mining-Bibliothek.bazelumzubenennen und in einen Pfad wie/usr/local/bin/bazelzu legen.Als ich dann aber
queryausführte, kam eine JDK-Warnung, und beibuildschlug es mitWARNING: Ignoring JAVA_HOME, because it must point to a JDK, not a JRE.fehl, weil Java fehlte. Ich habe ein paar Minuten gesucht, welches JDK/JRE ich verwenden soll, obwohl ich gar kein Java benutze, und konnte dann nicht mehr. Das heutige „irgendwann“ wurde also wieder auf einen anderen Tag verschoben. Es ist fast peinlich, wie sehr ich an cargo oder npm/yarn gewöhnt bin.Update: Dank https://sdkman.io/ läuft es. Am Ende war es doch nicht so schlimm.
Anfängerfrage: Könnte man diese Bibliothek als Kandidaten sehen, um sie mit Wrappern oder Erweiterungsbibliotheken zu integrieren und graphbasierte Clustering-Algorithmen an einem Ort zu bündeln? Vorausgesetzt, das ist nicht bereits der Fall.
Oder gibt es schon ein Framework, das dieselbe Funktionalität besser anbietet? So etwas wie NetworkX?
Vielleicht bin ich der Zeit weit hinterher, aber hat das etwas mit Pregel zu tun?
Beispiele wären wirklich hilfreich.
Kann jemand erklären, wofür diese Bibliothek nützlich ist?
Auf GitHub steht C, C++, Starland. Was ist Starland?
Bazel ist das hier verwendete Build-System.
Bei Graphalgorithmen wäre ein gewisses Maß an Standardisierung dringend nötig. Man denke an BLAS und LAPACK.
Ich hatte erwartet, dass es im wörtlichen Sinn ein Tool zum Mining statistischer Graphen für Anomalieerkennung ist.
Am Anfang ist es interessant und wirkt einfacher, als es aussieht.