Wie die anderen Antworten angeben, müssen Sie die WHERE
Klausel so nahe wie möglich an die entsprechenden MATCH
setzen, um die Anzahl der Zeilen, die von den MATCH
erzeugt zu minimieren.
Darüber hinaus können Sie die kartesischen Produkte von allen Back-to-back OPTIONAL MATCH
Klauseln verursacht beseitigen COLLECT
unter Verwendung der N Zeilen von jedem MATCH
-1 Reihe zu konvertieren. (Die letzten WITH
wäre kurz vor den RETURN
, und so „verschmolzen“ in die RETURN
werden könnte.)
Auch Ihre ORDER BY similarity DESC
Klausel macht keinen Sinn (und wird wahrscheinlich einen Fehler verursachen), da similarity
a Sammlung. Sie wollten wahrscheinlich SIZE(similarity)
anstelle von similarity
dort verwenden.
Dies sollte schneller sein:
MATCH (document:Document)-[:HAS_CATEGORY|:HAS_KEYWORD|:HAS_AUTHOR*..2]-(relateddocument:Document)
WHERE ID(document) = 85182
OPTIONAL MATCH (document)-[:HAS_CATEGORY]->(c:Category)<-[:HAS_CATEGORY]-(relateddocument)
WITH document, relateddocument, COLLECT(c) AS cs
OPTIONAL MATCH (document)-[:HAS_KEYWORD]->(k:Keyword)<-[:HAS_KEYWORD]-(relateddocument)
WITH document, relateddocument, cs, COLLECT(k) AS ks
OPTIONAL MATCH (document)-[:HAS_AUTHOR]->(a:Author)<-[:HAS_AUTHOR]-(relateddocument)
RETURN relateddocument, cs+ks+collect(a) as similarity
ORDER BY SIZE(similarity) DESC
LIMIT 5;
Beachten Sie, dass die ersten MATCH
[:HAS_CATEGORY|:HAS_KEYWORD|:HAS_AUTHOR*..2]
auch verwendet, um die Beziehungstypen zu filtern, im Fall, dass Ihre Dokumente viele Beziehungen zu anderen Arten. Das könnte die Anzahl der Zeilen, die von der ersten MATCH
generiert werden, weiter reduzieren, was den Arbeitsaufwand der gesamten Abfrage reduzieren würde.