OK, Google … ich meine, neo4j … | Komentor

Zeit, meine MusicAlbum-Grafikdatenbank auf Herz und Nieren zu prüfen.

Wer hat mit Al Di Meola auf mehr als einem Album gespielt?

MATCH  (DiM:Musician {name: "Al Di Meola"})-[]->(A:Album)<-[]-(M1:Musician)
  WHERE DiM.name<>M1.name
  WITH collect(DISTINCT A.name) as CommonAlbums, M1.name as CommonPlayers
    WHERE size(CommonAlbums) > 1
RETURN CommonPlayers, CommonAlbums;

Ich habe Di Meola von der Abfrage ausgeschlossen (WHERE DiM.name<>M1.name) und musste collect(DISTINCT A.name) as CommonAlbums weil Land of the Midnight Sun sechs Mal auftauchte – einmal für jeden Track, auf dem Di Meola ein anderes Instrument spielt.

Vielleicht habe ich das nicht gebraucht DISTINCT Schlüsselwort für die anderen Alben, aber eine einzige Abfragevorlage macht die Dinge viel einfacher.

Die habe ich auch weggelassen [:PLAYED_ON] Beziehungslabel, da dies bisher die einzige Beziehung in der Datenbank ist. Wann (wenn??) entscheide ich mich endlich dazu [:PUBLISHED] oder [:PRODUCED] Beziehungen, ich muss zurückgehen und einbeziehen [:PLAYED_ON] in der Abfrage.

In jedem Fall…collect, wie der Name schon sagt, sammelt die resultierenden Albumnamen und erstellt eine Liste, die aus den Albumnamen besteht, und benennt die Liste – was sonst? — Gemeinsame Alben. DISTINCT entfernt die Duplikate, und size() zählt die Anzahl der Albumnamen in CommonAlbums. Wann size(CommonAlbums) größer als 1 ist, bedeutet dies, dass der Musiker und Di Meola mehr als ein Album gemeinsam genutzt haben.

Ich musste auch zurück M1.name as CommonPlayers weil der Geltungsbereich von M1 (das neo4j-Handbuch bezeichnet dies als „Kontext“) vor dem endete [WHERE size(CommonAlbums) > 1 — i.e., M1 was no longer accessible and I couldn’t RETURN M1.name after the WITH.
codementor query di meola.png

Here’s an easy question:

On what albums did Lenny White play?

MATCH (:Musician {name: "Lenny White"})-[]->(A:Album) RETURN A.name;

Screenshot – 26_07_2017 , 9_47_34 PM.png
AKTUALISIEREN:
Sie können sich darauf verlassen, dass Di Meola die Datenbank komplizierter macht. Dank seiner sechs verschiedenen Instrumente auf Land of the Midnight Sun gibt eine Abfrage der Alben, auf denen er gespielt hat, sechs Vorkommen dieses Albums zurück. Trotzdem kein großer Haken, ein einfacher DISTINCT kümmert sich darum:

Auf welchen Alben hat Al Di Meola gespielt?

MATCH (:Musician {name: "Al Di Meola"})-[]->(A:Album)
RETURN DISTINCT A.name as `Albums Di Meola played on`;

Welche Musiker spielten sowohl bei In a Silent Way als auch bei Bitches Brew?

MATCH (:Album {name: "In a Silent Way"})<-[]-(M:Musician)-[]->(:Album {name: "Bitches Brew"})
RETURN DISTINCT M.name;

Screenshot – 26_07_2017 , 11_33_11 AM.png
Ich hätte die Ausgabe sogar etwas freundlicher gestalten können:

MATCH (:Album {name: "In a Silent Way"})<-[]-(M:Musician)-[]->(:Album {name: "Bitches Brew"})
RETURN DISTINCT M.name as `Played on both In a Silent Way and Bitches Brew`;

Silent and Bitches.png
Lassen Sie uns ein wenig ehrgeizig werden:

Welche Musiker haben bei Bitches Brew überhaupt Klavier gespielt?

MATCH (M:Musician)-[r:PLAYED_ON]->(:Album {name: "Bitches Brew"})
  WITH M as Musician, 
       FILTER(ins in r.instruments WHERE ins CONTAINS "Piano") as insFilt
  WHERE insFilt <> []
RETURN Musician.name, insFilt;

Screenshot – 26_07_2017 , 10_46_05 PM.png
Dies stellte eine Herausforderung dar, da drei Musiker E-Piano spielten – Joe Zawinul links, Larry Young in der Mitte und Chick Corea rechts. Ihre jeweiligen Instrumente sind „Electric Piano (links)“, „Electric Piano (Mitte)“ und „Electric Piano (rechts)“. Eine einfache MATCH ... [:PLAYED_ON {instruments: ["Piano"]}] hätte nicht funktioniert — die FILTER und die CONTAINS hat den Trick gemacht, obwohl ich eine Groß-/Kleinschreibung hätte machen können CONTAINS.

Ich musste mich auch qualifizieren FILTER mit WHERE insFilt <> [] weil die Abfrage leere Listen zurückgab.

Welche Musiker spielten auf Track vier von Stardust?

MATCH (M:Musician)-[r:PLAYED_ON]->(:Album {name: "Stardust"}) 
  RETURN  
  CASE
    WHEN r.tracks IS NULL THEN M.name
    WHEN 4 in r.tracks THEN M.name
  END;

Spur 4.Stardust.png
Seltsamerweise wurde die Abfrage nicht im Browser ausgeführt und gab die wörtliche Zeichenfolge „CASE WHEN r.tracks IS NULL THEN M.name WHEN 4 in r.tracks THEN M.name END“ zurück, also musste ich dies in Verschlüsselung tun. Hülse. hatte ich ursprünglich ELSE NULL Vor dem END ende der CASE, habe es entfernt, weil mir das Aussehen der NULL in den Ergebnissen nicht gefallen hat, aber sie kamen trotzdem. Nun ja…

AKTUALISIEREN: Jetzt gibt es die Musiker zurück, einschließlich der NULLen. Stelle dir das vor.

Beim zweiten Nachdenken brauchte ich es nicht CASE:

MATCH (M:Musician)-[r:PLAYED_ON]->(:Album {name: "Stardust"})
  WITH M as mn,
    FILTER (mn in M.name 
           WHERE ((r.tracks IS NULL) OR (4 in r.tracks))) as finalName
  WHERE finalName <> []
RETURN finalName;

Und es funktionierte im Browser zum Booten:
Spur 4.Stardust.v2.png
Und ich bin die losgeworden NULL Antworten.

Ich habe das vielleicht in den früheren Beiträgen dieser Serie erwähnt oder auch nicht: Wenn r.tracks NULL ist, bedeutet das, dass der Musiker die r.instruments auf allen Spuren gespielt hat. r.tracks IS NULL daher impliziert x in r.trackswo x in [1, 2,…,size(r.tracks) + 1].

Allerdings ein anderes Problem:

MATCH (M:Musician)-[r:PLAYED_ON]->(:Album {name: "Bitches Brew"})
  WITH M as mn,
    FILTER (mn in M.name WHERE ((r.tracks IS NULL) OR (4 in r.tracks))) as finalName
  WHERE finalName <> []
RETURN finalName;

Hündinnen Brew.Track4.png
Juma Santos spielt auf Track 4 auf zwei Instrumenten, also erscheint er zweimal. Wieder keine große Sache, a DISTINCT kümmert sich darum:

MATCH (M:Musician)-[r:PLAYED_ON]->(:Album {name: "Bitches Brew"})
  WITH M as mn,
    FILTER (mn in M.name WHERE ((r.tracks IS NULL) OR (4 in r.tracks))) as finalName
  WHERE finalName <> []
RETURN DISTINCT finalName;

Als ich mir die Ergebnisse ansah, tauchte ein quälendes Problem auf – Miles Davis spielt auf allen Bitches Brew-Tracks außer dem 4. Wenn also ein Musiker nur auf dem vierten Track spielte und kein anderer, spielte er technisch gesehen nicht mit Davis.

Andererseits ist es mein Modell, und ich kann das Spielen mit einem Musiker sehr gut als das Erscheinen auf einem seiner Alben definieren, unabhängig davon, ob sie tatsächlich mindestens einen Track geteilt haben. Also dort.

Trotzdem habe ich überprüft, ob ein Musiker nur auf Track 4 gespielt hat, MATCH (M:Musician)-[:PLAYED_ON {tracks:[4]}]->(:Album {name: "Bitches Brew"}) RETURN M.name; und zu meiner Erleichterung bekam null Zeilen.

Schließlich erinnern Sie sich bei Fragen zu einem Titel wahrscheinlich nicht an die Titelnummer eines bestimmten Titels. Ich hätte es vorgezogen, eine Art indexOf () -Funktion zu verwenden, die Cypher zum jetzigen Zeitpunkt leider nicht hat.

Allerdings würde ich mir das gerne als Backend oder Abfragen an die Datenbank-Engine vorstellen, die von einem Programm zB in Java übergeben werden, das sich um die Implementierung einer indexOf()-Funktion kümmern würde.

Und nimm das als Teaser für die nächsten Posts.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *