2016-07-06 6 views
0

Ich habe folgende Datenstruktur:Wie für Knoten effizient Code, die mehrere Beziehungen haben

  • Auftrag -> Kontakt -> Installieren -> Kampagne
  • Auftrag -> Kontakt -> Download -> Kampagne

ich folgende Cypher Abfrage erstellt haben:

MATCH (ca1:Campaign) - [CI] - (i:Installs) - [IC] - (co1:Contact) - [CO1] - (o1:Order), 
(ca2:Campaign) - [CD] - (d:Downloads) - [DC] - (co2:Contact) - [CO2] - (o2:Order) 
where i.DownloadDate > '6/1/16' and i.DownloadDate < '7/31/16' 
and d.DownloadDate > '6/1/16' and d.DownloadDate < '7/31/16' 
RETURN ca1,CI,i,IC,co1,CO1,o1,ca2,CD,d,DC,co2,CO2,o2 limit 50 

CQ gibt dem folgenden wa Ring:

Diese Abfrage erstellt ein kartesisches Produkt zwischen getrennten Mustern. Wenn ein Teil einer Abfrage mehrere nicht verbundene Muster enthält, wird ein kartesisches Produkt zwischen all diesen Teilen erstellt. Dies kann zu einer großen Datenmenge führen und die Abfrageverarbeitung verlangsamen. Während gelegentlich beabsichtigt, kann es oft möglich sein, die Abfrage neu zu formulieren, die die Verwendung dieses Kreuzprodukts vermeidet, möglicherweise durch Hinzufügen einer Beziehung zwischen den verschiedenen Teilen oder durch Verwenden von OPTIONAL MATCH (Bezeichner sind: (ca2, d, co2, o2))

Gibt es eine bessere Möglichkeit, in CQL zu programmieren ?. (Sorry für die Newbie Frage). Danke.

+0

Ich bin hier ziemlich verwirrt, Ihre Abfrage lässt mich denken, dass Sie ein fehlendes Komma in Ihrem Pfad haben, dass es "-> Campaign, Order->" statt "-> Campaign" sein sollte Bestellung -> Kontakt ". Wenn das der Fall ist, sieht es so aus, als ob Sie wirklich "Bestellen" -> "Kontakt" haben und "Kontakt" hat dann sowohl eine Install- als auch eine Download-Beziehung zu Campaign. – InverseFalcon

+0

Sie haben Recht .. am Ende der ersten Kampagne sollte ein Komma stehen. Ich hatte es in zwei Zeilen. Post wurde in eine einzelne Zeile zusammengeführt. Im Wesentlichen verfügt Contact über Verbindungen zu zwei Knoten (installieren und herunterladen) und stellt dann eine Verbindung zum Campaign-Knoten her. – Ravi

+1

Okay, das hilft. Können Sie deutlich machen, was die Abfrage bewirken soll (eine verbale Beschreibung, anstatt einen Versuch auf die Abfrage zu machen), und zusätzliche Informationen bereitstellen, z. B. wenn Sie von bestimmten Knoten aus mit ID beginnen oder etwas, oder wenn Sie diese Informationen für alles, was in Ihrem db passt? Können Sie auch erklären, warum Download und Installation zwei verschiedene Knoten sind? Ich habe das Gefühl, dass Sie hier etwas optimieren können, aber noch nicht sicher. – InverseFalcon

Antwort

-2

Ich glaube nicht, dass Sie für Knoten mit mehreren Beziehungen kodieren können, da die Knoten standardmäßig monogam sind.

+0

Auf fast jeder anderen Seite würde ich Ihnen für das Wortspiel +1 geben. Nicht hier, tut mir leid. – InverseFalcon

0

Machen Sie einen ersten Schritt, aber meine Vermutung ist etwas mehr wie alle Kampagnen, Installationen/Downloads dieser Kampagnen, Kontakte für diese Installationen/Downloads und damit verbundene Aufträge, wo die Installation oder Bestellung Datum fällt zwischen den angegebenen Daten. Ist das korrekt?

Ihre Abfrage, wie es ist, ist ein kartesianisches Produkt von allem (jede einzelne Zeile Ihres Downloads übereinstimmen, in jeder möglichen Kombination gegen jede mögliche Reihe Ihrer Aufträge übereinstimmen), wenn meine Vermutung ist, was Sie wirklich wollen, ist eine Union der Übereinstimmungen mit Downloads und Bestellungen, oder wenn sie gleich behandelt werden können, eine Abfrage, die mit beiden übereinstimmt.

Meine nächste Frage wäre, brauchen Sie wirklich jedes einzelne Element des Spiels? So wie es jetzt aussieht, geben Sie jeden Knoten der Übereinstimmung und jede Beziehung zwischen jedem Knoten zurück. Benötigen Sie wirklich alle diese Informationen in dieser Abfrage, oder sind die Knoten genug? Benötigen Sie auch vollständige Knoten oder benötigen Sie nur Eigenschaften in jedem Knoten?

Darüber hinaus wäre die Angabe von Label und Richtung in Ihren Beziehungen eine große Verbesserung und sollte Ihre Abfrage beschleunigen.

Angenommen, Sie benötigen nur die Knoten, die Sie polymorph installieren und herunterladen können, die Beziehungsbezeichnungen zwischen Installationen/Downloads die gleichen sind und einen Stich beim Hinzufügen von Bezeichnungen und Anweisungen zu Ihren Beziehungen machen (bitte korrigieren Sie mich, auf denen so kann ich das beheben), das besser für Sie arbeiten kann:

MATCH (campaign:Campaign)<-[:Has]-(installOrDownload)<-[:Has]-(contact:Contact)<-[:Has]-(order:Order) 
where installOrDownload.DownloadDate > '6/1/16' and installOrDownload.DownloadDate < '7/31/16' 
RETURN campaign, installOrDownload, contact, order limit 50 

Vorausgesetzt, dass die Beziehung Etiketten verknüpfen anbringt/Downloads mit Kampagnen und die Verknüpfung von Kontakten mit Installationen/downloads gleich sind (und wenn da gibt es auch keine Möglichkeiten), installOrDownload wird sowohl auf Install- als auch auf Download-Knoten passen.

+0

Danke für eine tolle Idee. Wird auch die Komplexität reduzieren. Ich werde es versuchen. – Ravi

Verwandte Themen