ich ein einfaches Beispiel-Datensatz aus drei Wörtern erstellt: w1
ohne Durchsuchungen, w2
mit 3 sucht und w3
mit 6.
CREATE (w1:Word {w: '1'})
WITH count(*) AS dummy
CREATE (w2:Word {w: '2'}) WITH w2
UNWIND range(1, 3) AS i
CREATE (w2)<-[:Searched]-(:Session)
WITH count(*) AS dummy
CREATE (w3:Word {w: '3'}) WITH w3
UNWIND range(1, 6) AS i
CREATE (w3)<-[:Searched]-(:Session)
ich es so nähern würde: Erstens, lassen Sie uns eine Liste erstellen, mit der Obergrenzen für jede Schaufel:
RETURN [i IN range(0, 4) | i*5] AS upperLimits
╒══════════════╕
│"upperLimits" │
╞══════════════╡
│[0,5,10,15,20]│
└──────────────┘
Zweitens verwenden, um dies mit einem list comprehension, die die Elemente aus der Liste auswählt, die eine hinreichend große obere Grenze hat. Die erste davon ist unser Bucket, also wählen wir das mit dem Listenindexer [0]
aus. Der Rest ist die Berechnung nur die untere Grenze und Bestell Reihen:
WITH [i IN range(0, 4) | i*5] AS upperLimits
MATCH (n:Word)
WITH upperLimits, ID(n) AS n, size((n)<-[:Searched]-()) AS numOfRelationships
WITH
[upperLimit IN upperLimits WHERE numOfRelationships <= upperLimit][0] AS upperLimit,
count(n) AS count
RETURN
upperLimit - 4 AS lowerLimit,
upperLimit,
count
ORDER BY lowerLimit
Die Abfrage gibt die folgenden Ergebnisse:
╒════════════╤════════════╤═══════╕
│"lowerLimit"│"upperLimit"│"count"│
╞════════════╪════════════╪═══════╡
│-4 │0 │1 │
├────────────┼────────────┼───────┤
│1 │5 │1 │
├────────────┼────────────┼───────┤
│6 │10 │1 │
└────────────┴────────────┴───────┘
Mögliche Verbesserungen:
(1) Wenn der Wert von numOfRelationships
größer als die größte obere Grenze, die obige Abfrage wird das erste Element einer leeren Liste zurückgeben, die null
ist. Um dies zu vermeiden, wird entweder 1) eine ausreichend große obere Grenze, z.
MATCH (n:Word)
WITH max(size((n)<-[:Searched]-())) AS maxNumberOfRelationShips
WITH [i IN range(-1, maxNumberOfRelationShips/5+1) | {lower: i*5-4, upper: i*5}] AS limits
RETURN *
Sie können den Top-Eimer mit "16 oder mehr" Semantik mit coalesce
verwenden.
(2) -4
als Untergrenze ist nicht sehr schön, wir können CASE
verwenden, um es loszuwerden.
Putting all dies zusammen, erhalten wir diese:
MATCH (n:Word)
WITH max(size((n)<-[:Searched]-())) AS maxNumberOfRelationShips
WITH [i IN range(0, maxNumberOfRelationShips/5+1) | i*5] AS upperLimits
MATCH (n:Word)
WITH upperLimits, ID(n) AS n, size((n)<-[:Searched]-()) AS numOfRelationships
WITH
[upperLimit IN upperLimits WHERE numOfRelationships <= upperLimit][0] AS upperLimit,
count(n) AS count
RETURN
CASE WHEN upperLimit - 4 < 0 THEN 0 ELSE upperLimit - 4 END AS lowerLimit,
upperLimit,
count
ORDER BY lowerLimit
was zur Folge hat:
╒════════════╤════════════╤═══════╕
│"lowerLimit"│"upperLimit"│"count"│
╞════════════╪════════════╪═══════╡
│0 │0 │1 │
├────────────┼────────────┼───────┤
│1 │5 │1 │
├────────────┼────────────┼───────┤
│6 │10 │1 │
└────────────┴────────────┴───────┘
Okay, das habe viel zu lange. Ich werde es ein bisschen komprimieren. –