Das hat bei mir funktioniert. Es ermöglicht Ihnen, alle Freebase-Speicherauszüge in einer Standard-MySQL-Installation auf weniger als 100 GB zu laden. Der Schlüssel besteht darin, das Datenlayout in einem Speicherauszug zu verstehen und es dann zu transformieren (Optimierung für Speicherplatz und Geschwindigkeit).
Freebase-Konzepte sollten Sie verstehen, bevor Sie versuchen, dies zu verwenden (alles aus der Dokumentation):
- Thema - alles vom Typ '/ common / topic', achten Sie auf die verschiedenen Arten von IDs, die Sie in Freebase finden können - 'id', 'mid', 'guid', 'webid', etc.
- Domäne
- Typ - 'ist eine' Beziehung
- Eigenschaften - 'hat eine' Beziehung
- Schema
- Namespace
- Schlüssel - vom Benutzer lesbar im Namespace
Einige andere wichtige Freebase-Besonderheiten :
- Der Abfrage-Editor ist Ihr Freund
- verstehe die Begriffe 'Quelle', 'Eigenschaft', 'Ziel' und 'Wert', die hier beschrieben wurden
- alles hat eine mittlere, gerade Dinge wie '/', '/ m', '/ en', '/ lang', '/ m / 0bnqs_5' usw .; Testen Sie mit dem Abfrageeditor:
[{'id':'/','mid':null}]
- Sie wissen nicht, was eine Entität (d. h. Zeile) im Daten-Dump ist, Sie müssen zu ihren Typen kommen, um das zu tun (zum Beispiel, woher weiß ich, dass
'/m/0cwtm'
ein Mensch ist);
- Jede Entität hat mindestens einen Typ (normalerweise aber viel mehr)
- Jede Entität hat mindestens eine ID / einen Schlüssel (normalerweise aber viel mehr)
- Die Ontologie (dh Metadaten) ist in denselben Speicherauszug und dasselbe Format wie die Daten eingebettet (nicht der Fall mit anderen) Distributionen wie DBPedia, etc.)
- Die "Ziel" -Spalte im Dump ist die verwirrende, sie kann einen mittleren oder einen Schlüssel enthalten (siehe dazu, wie die Transformationen darunter umgehen)
- die Domains, Typen, Eigenschaften sind Namespaceebenen gleichzeitig (wer auch immer das gemacht hat, ist ein Genie IMHO);
- verstehe, was ein Thema ist und was kein Thema ist (absolut entscheidend), zum Beispiel ist diese Entität
'/m/03lmb2f'
vom Typ '/film/performance'
KEIN Thema (ich wähle diese als was Leere Knoten in RDF sind zwar nicht philosophisch korrekt, aber '/m/04y78wb'
vom Typ '/film/director'
(unter anderen) ist;
Transformiert
(siehe den Python-Code unten)
TRANSFORM 1 (aus Shell, geteilte Links von Namespaces, die namentlichen_für und nicht / lang / en-Text ignorieren):
%Vor%
TRANSFORM 2 (aus der Python-Konsole, spare freebase_ns.tsv auf freebase_ns_types.tsv, freebase_ns_props.tsv plus 15 andere, die wir für jetzt ignorieren)
%Vor%
TRANSFORM 3 (konvertiert aus der Python-Konsole Property und Destination in mids)
%Vor%
TRANSFORM 4 (Laden Sie in der MySQL-Konsole freebase_links_mids.tsv, freebase_ns_props_mids.tsv und freebase_ns_types.tsv in DB):
%Vor%
Code
Speichern Sie dies als e.py:
%Vor%
Speichere dies als parse.py:
%Vor%
Anmerkungen:
- Abhängig von der Maschine kann die Indexerstellung zwischen einigen und mehr als 12 Stunden dauern (bedenken Sie jedoch die Datenmenge, mit der Sie es zu tun haben).
- Um die Daten in beiden Richtungen durchqueren zu können, benötigen Sie einen Index für Links.Destination, den ich für zeitaufwändig und nie fertig befunden habe.
- Viele andere Optimierungen sind hier möglich. Zum Beispiel ist die 'types'-Tabelle klein genug, um in einem Python-Diktat geladen zu werden (siehe
e.get_namespaced_data( 'freebase_ns_types.tsv' )
)
Und der Standard Disclaimer hier. Es ist ein paar Monate her, seit ich das gemacht habe. Ich glaube, es ist meistens korrekt, aber ich entschuldige mich, wenn meine Notizen etwas verpasst haben. Leider ist das Projekt, für das ich es brauchte, durch die Risse gefallen, aber ich hoffe, dass dies jemand anderem hilft. Wenn etwas nicht klar ist, hier einen Kommentar abgeben.