2017-08-24 8 views
1

Diese beiden hypothetischen Cypher-Abfragen das gleiche Ergebnis: equalsWarum sollte ich die exist() -Funktion für Musterexistenz verwenden?

MATCH(s:Start) 
WHERE exists((s)-[:CONNECTED_TO]->(:End)) 
RETURN s 

und

MATCH(s:Start) 
WHERE (s)-[:CONNECTED_TO]->(:End) 
RETURN s 

Der einzige Unterschied besteht darin, dass die zweite Abfrage kein Aufruf an die exists() Funktion hat, aber semantisch diese beiden Abfragen sind . Recht?

Also, warum und wann sollte ich die exists() Funktion verwenden, die ein Muster als Parameter übergibt?

EDIT:

ich einige Unterschiede in der Ausgabe von PROFILE Beachtet:

PROFILE MATCH(s:Start) 
WHERE exists((s)-[:CONNECTED_TO]->(:End)) 
RETURN s 
+------------------+----------------+------+---------+-----------+-----------------------------------------------+ 
| Operator   | Estimated Rows | Rows | DB Hits | Variables | Other           | 
+------------------+----------------+------+---------+-----------+-----------------------------------------------+ 
| +ProduceResults |    2 | 1 |  0 | s   | s            | 
| |    +----------------+------+---------+-----------+-----------------------------------------------+ 
| +Filter   |    2 | 1 |  5 | s   | NestedExpression(Filter-Expand(All)-Argument) | 
| |    +----------------+------+---------+-----------+-----------------------------------------------+ 
| +NodeByLabelScan |    3 | 3 |  4 | s   | :Start          | 
+------------------+----------------+------+---------+-----------+-----------------------------------------------+ 

Total database accesses: 9 

PROFILE MATCH(s:Start) 
WHERE (s)-[:CONNECTED_TO]->(:End) 
RETURN s 

+------------------+----------------+------+---------+-------------------------+-------------------------+ 
| Operator   | Estimated Rows | Rows | DB Hits | Variables    | Other     | 
+------------------+----------------+------+---------+-------------------------+-------------------------+ 
| +ProduceResults |    2 | 1 |  0 | s      | s      | 
| |    +----------------+------+---------+-------------------------+-------------------------+ 
| +SemiApply  |    2 | 1 |  0 | s      |       | 
| |\    +----------------+------+---------+-------------------------+-------------------------+ 
| | +Filter  |    1 | 0 |  1 | anon[29], anon[47], s | anon[47]:End   | 
| | |    +----------------+------+---------+-------------------------+-------------------------+ 
| | +Expand(All) |    1 | 1 |  4 | anon[29], anon[47] -- s | (s)-[:CONNECTED_TO]->() | 
| | |    +----------------+------+---------+-------------------------+-------------------------+ 
| | +Argument  |    3 | 3 |  0 | s      |       | 
| |    +----------------+------+---------+-------------------------+-------------------------+ 
| +NodeByLabelScan |    3 | 3 |  4 | s      | :Start     | 
+------------------+----------------+------+---------+-------------------------+-------------------------+ 

Total database accesses: 9 

Antwort

3

Wenn in der WHERE-Klausel verwendet wird, sollte sie semantisch gleich sein, aber es gibt Fälle, in denen vorhanden ist() wird außerhalb der WHERE-Klausel benötigt.

Ein Beispiel ist, wenn Sie möchten, dass ein Boolean darstellt, ob das Muster existiert.

MATCH (s:Start) 
RETURN exists((s)-[:CONNECTED_TO]->(:End)) as connectedToEnd 
+0

Ich bemerkte einige Unterschiede in der Ausgabe von 'PROFILE' dieser Abfragen (siehe meine Bearbeitung). Die Abfrage mit 'exists()' hat einen kompakteren Ausführungsplan. –

Verwandte Themen