В чем разница между несколькими предложениями MATCH и запятой в запросе Cypher?
В языке запросов Cypher для Neo4j, какова разница между одним предложением MATCH сразу после другого следующим образом:
MATCH (d:Document{document_ID:2})
MATCH (d)--(s:Sentence)
RETURN d,s
В отличие от разделенных запятыми паттернов в одном и том же предложении MATCH? Например:.
MATCH (d:Document{document_ID:2}),(d)--(s:Sentence)
RETURN d,s
В этом простом примере результат тот же. Но есть ли какие-либо "gotchas"?
Ответы
Ответ 1
Есть разница: совпадения, разделенные запятой, фактически считаются частью одного и того же шаблона. Так, например, гарантируется, что каждая связь появляется только один раз в результирующем пути.
Отдельные MATCHes - это отдельные операции, пути которых не образуют единичные шаблоны и которые не имеют этих гарантий.
Ответ 2
Между этими нет различий при условии, что предложения не связаны друг с другом.
Если вы сделали это:
MATCH (a:Thing), (b:Thing) RETURN a, b;
То же самое, что:
MATCH (a:Thing) MATCH (b:Thing) RETURN a, b;
Потому что (и только потому, что) a
и b
независимы. Если a
и b
связаны соотношением, то смысл запроса может измениться.
Ответ 3
Если часть запроса содержит несколько несвязанных шаблонов, это приведет к созданию декартова продукта между всеми этими частями. Это может привести к большому количеству данных и замедлить обработку запросов. Иногда изредка может возникнуть возможность переформулировать запрос, который позволяет избежать использования этого перекрестного продукта, возможно, путем добавления взаимосвязи между различными частями или с помощью ДОПОЛНИТЕЛЬНОГО МАТЧИ (идентификатор: (a)).
Короче говоря, это НЕ ОТМЕНА В этом обоих запросах, но очень осторожно использовал его.