Wie speichert man Daten wie Freebase?

7

Ich gebe zu, dass dies im Grunde eine doppelte Frage von Verwendung von Freebase-Daten auf lokaler Server? , aber ich brauche ausführlichere Antworten als dort bereits gegeben

Ich habe mich absolut in Freebase verliebt. Was ich jetzt möchte, ist im Wesentlichen einen sehr einfachen Freebase-Klon zum Speichern von Inhalten zu erstellen, die möglicherweise nicht zu Freebase gehören, aber mit dem Freebase-Schema beschrieben werden können. Im Wesentlichen möchte ich eine einfache und elegante Möglichkeit, Daten wie Freebase selbst zu speichern und diese Daten in einer Python (CherryPy) -Webanwendung einfach zu verwenden.

In Kapitel 2 des MQL-Referenzleitfadens heißt es:

  

Die Datenbank, die Metaweb zugrunde liegt, unterscheidet sich grundlegend von den relationalen Datenbanken, mit denen Sie vertraut sind. Relationale Datenbanken speichern Daten in Form von Tabellen, aber die Metaweb-Datenbank speichert Daten als ein Diagramm von Knoten und Beziehungen zwischen diesen Knoten .

Was bedeutet, dass ich entweder einen Triple-Store oder eine Graph-Datenbank wie Neo4j verwenden sollte? Hat irgendjemand hier irgendwelche Erfahrung mit einem solchen aus einer Python-Umgebung?

(Was ich bisher probiert habe, ist ein relationales Datenbankschema zu erstellen, das problemlos Freebase-Themen speichern kann, aber ich habe Probleme mit der Konfiguration der Zuordnungen in SQLAlchemy).

Dinge, die ich untersuche

UPDATE [28.12.2011]:

Ich habe einen Artikel im Freebase Blog gefunden, der den proprietären Tupelspeicher / die Datenbank beschreibt, die Freebase selbst benutzt (graphd): Ссылка

    
Bruce van der Kooij 26.12.2011, 23:31
quelle

6 Antworten

10

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.

    
pepper_bg 14.09.2012 16:10
quelle
6

Meine 2 Cent ...

Ich benutze ein wenig Java-Code, um den Freebase-Daten-Dump in RDF zu konvertieren: Ссылка

Ich benutze den TDB-Speicher von Apache Jena, um die RDF-Daten zu laden, und Fuseki, um die Daten über das SPARQL-Protokoll über HTTP bereitzustellen.

Siehe auch:

castagna 11.03.2012 18:38
quelle
3

SPARQL ist die Abfragesprache, um RDF abzufragen, es erlaubt SQL-ähnliche Abfragen zu schreiben. Die meisten RDF-Datenbanken implementieren SPARQL-Schnittstellen. Darüber hinaus können Sie mit Freebase Daten in RDF exportieren, sodass Sie diese Daten möglicherweise direkt in einer RDF-Datenbank verwenden und mit SPARQL abfragen können.

Ich würde mir dieses Tutorial ansehen, um ein besseres Verständnis von SPARQL zu bekommen.

Wenn Sie mit einem großen Dataset wie freebase arbeiten, würde ich 4store zusammen mit einem der Python-Clients . 4store macht SPARQL über HTTP verfügbar, Sie können HTTP-Anforderungen zum Bestätigen, Entfernen und Abfragen von Daten stellen. Es behandelt auch Resultsets in JSON, und das ist wirklich praktisch mit Python. Ich habe diese Infrastruktur in mehreren Projekten verwendet, nicht mit CherryPy, sondern mit Django, aber ich denke, dass dieser Unterschied nicht wirklich wichtig ist.

    
Manuel Salvadores 27.12.2011 00:42
quelle
2

Eine gute Nachricht für Freebase Dump-Benutzer ist, dass Freebase jetzt jetzt einen RDF-Dump anbietet: Ссылка . Da es sich um ein Turtle-Format handelt, ist es sehr praktisch, eine Grafikdatenbank zu verwenden, die für RDF entworfen wurde.

Mein Vorschlag ist auch 4store: Ссылка . es ist einfach und einfach zu bedienen. Sie könnten HTTP-Anfrage verwenden, um die SPARQL-Operation auszuführen.

Eine knifflige Sache in meinem Projekt ist, dass das "." in Freebase Dump verwendet (um verkürzte URL darzustellen) ist für 4store nicht erkennbar. Also füge ich eine Klammer "& lt; & gt;" o alle Spalten enthalten "." und kümmere mich selbst um die verkürzte URL.

    
Chenyan Xiong 19.02.2013 19:47
quelle
1

Sehen Sie sich Ссылка an. Ich glaube, es wurde von demselben Autor geschrieben und verwendet die gleichen Prinzipien wie graphd , das Backend von Freebase, bevor Google es getötet hat.

In Bezug auf die Daten werden Sie wahrscheinlich etwas wie dies ausführen müssen, um das Freebase-DB-Dump oder verwende datahub .

    
wires 24.03.2017 17:10
quelle
0

Und das ist der zusätzliche Code für meine andere Antwort. Das Fleisch ist in edb.py. Führen Sie die Python-Konsole aus und folgen Sie den Beispielen. Oder benutze den web2py Controller und starte ihn in deinem Browser.

Speichern Sie dies als edb.py:

%Vor%

Und hier ist ein Beispiel web2py-Controller (kopieren Sie einfach edb.py in das web2py-Modellverzeichnis):

%Vor%     
pepper_bg 14.09.2012 16:15
quelle