Лучшая практика для сопоставления узлов - PullRequest
2 голосов
/ 27 апреля 2020

Я провожу некоторые тесты на повторную печать и мне интересно, как лучше совмещать узлы, если у меня есть такая иерархия:
category => post => comment => reply
У меня есть Индекс на каждой метке _id поле, и я соответствую в соответствии с _id
Первый подход: путем сопоставления полностью до целевого узла:

GRAPH.QUERY test "MATCH (:category {_id:1})-[:post]->(:post {_id:1})-[comment_rel_1:comment]->(c1:comment {_id:1}) SET c1.comment = 'changed'"

Второй подход: сопоставление узла напрямую

GRAPH.QUERY test "MATCH (c1:comment {_id:1}) SET c1.comment = 'changed'"

В случае огромной базы данных с большим количеством узлов и ребер, какой подход считается эффективным по времени?
Спасибо

1 Ответ

2 голосов
/ 28 апреля 2020

Вот планы выполнения для каждого из запросов

127.0.0.1:6379> graph.explain test "MATCH (:category {_id:1})-[:post]->(:post {_id:1})-[comment_rel_1:comment]->(c1:comment {_id:1}) SET c1.comment = 'changed'"
1) "Update"
2) "    Filter"
3) "        Conditional Traverse | (anon_2:post)->(c1:comment)"
4) "            Filter"
5) "                Conditional Traverse | (anon_0:category)->(anon_2:post)"
6) "                    Index Scan | (anon_0:category)"

127.0.0.1:6379> graph.explain test "MATCH (c1:comment {_id:1}) SET c1.comment = 'changed'"
1) "Update"
2) "    Index Scan | (c1:comment)"

В случае, если вы просто хотите обновить узел комментария, независимо от его состояния на графике, второй запрос более эффективен. В случае, если вы хотите обновить только узел комментария, который подключен в шаблоне, который вы описали, первый запрос - это путь к go, между двумя.

...