Оптимизируйте Cypher Query с циклом для построения дерева времени

Я хочу создать дерево времени для функции календаря — она ​​работает, но я понимаю, что она очень медленная (1 вставка за 20 секунд). Может быть, у кого-нибудь есть подсказка, как изменить код, чтобы добиться большей производительности?

for ($calYear=2012;$calYear<2016; $calYear++)
{
$paramsYear =array(
"pYear" => $calYear,
"UUID" => uniqid()
);


$queryString = '
MERGE (y:calTime:calYear {name: {pYear}})
SET
y.uuid= {UUID},
y.created="'.time().'",
y.active="Y"return y;
';

$query = new Everyman\Neo4j\Cypher\Query($client, $queryString,$params);
$result = $query->getResultSet();

for ($calMonth=1;$calMonth<13; $calMonth++)
{
$paramsMonth =array(
"pYear" => $calYear,
"pMonth" => $calMonth,
"UUID" => uniqid()
);
$queryString = '
MATCH (y:calTime:calYear {name: {pYear}})
MERGE (m:calTime:calMonth {name: {pMonth}) -[:IS_MONTH_OF]->(y)
SET
m.uuid= {UUID},
m.created="'.time().'",
m.active="Y"return m;
';

$query = new Everyman\Neo4j\Cypher\Query($client, $queryString,$paramsMonth);
$result = $query->getResultSet();

$numberOfDays = date("t",mktime(0, 0, 0, $calMonth, 1, $calYear));

for ($calDay=1;$calDay<=$numberOfDays; $calDay++)
{
$paramsDay =array(
"pYear" => $calYear,
"pMonth" => $calMonth,
"pDay" => $calDay,
"UUID" => uniqid()
);

$queryString = '
MATCH (y:calTime:calYear {name: {pYear}) -- (m:calTime:calMonth {name: {pMonth})
MERGE (d:calTime:calDay {name: {pDay}) -[:IS_DAY_OF]->(m)
SET
d.uuid= {UUID},
d.created="'.time().'",
d.active="Y"return d;
';

$query = new Everyman\Neo4j\Cypher\Query($client, $queryString,$paramsDay);
$result = $query->getResultSet();

for ($calHour=1;$calHour<=24; $calHour++)
{
$paramsHour =array(
"pYear" => $calYear,
"pMonth" => $calMonth,
"pDay" => $calDay,
"pHour" => $calHour,
"UUID" => uniqid()
);

$queryString = '
MATCH (y:calTime:calYear {name: {pYear}) -- (m:calTime:calMonth {name: {pMonth}) -- (d:calTime:calDay {name: {pDay})
MERGE (h:calTime:calHour {name: {pHour}) -[:IS_HOUR_OF]->(d)
SET
h.uuid= {UUID},
h.created="'.time().'",
h.active="Y"return h;
';

$query = new Everyman\Neo4j\Cypher\Query($client, $queryString,$paramsHour);
$result = $query->getResultSet();

} // End Hour

} // End Day
} // End Month
} // End Year

3

Решение

Это неудивительно, ваш код будет выполнять x различных запросов http для каждого оператора Cypher, который не использует все преимущества конечной точки транзакции http. Таким образом, для каждого запроса у вас есть счетчик http задержки во время запроса.

  1. Создайте массив всех запросов, которые вы хотите выполнить, и выполните их все одновременно, я не знаю, как neo4jphp сделает это, но в NeoClient PHP Вы можете легко сделать это с помощью объекта PreparedTransaction

  2. Есть плагины neo4j, которые будут обрабатывать создание / обновление временного дерева для вас под капотом, https://github.com/graphaware/neo4j-timetree и есть NeoclientPHP продление времени предоставляя вам необходимые методы для работы с плагином neo4j timetree API

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]