#neo4j #cypher
#neo4j #cypher
Вопрос:
У меня есть два запроса в Neo4j следующим образом,
MERGE (temp:Temp)
SET temp = {tid: 'blabla', title_ids: [], pid: 'blabla'}
Сначала я создаю узел с запросом, как указано выше. Затем я перехожу к кодированию следующего запроса,
CALL apoc.periodic.commit(
"
MATCH(temp:Temp)
WITH temp
MATCH (t1:Title)-[r:TO]->(t2:Title)
WHERE t1.tid = temp.tid
AND NOT exists((t2)<-[:LIKE|:DISLIKE|:LOVE]-(:User {pid: temp.pid}))
AND NOT t2.tid IN temp.title_ids
AND t2.tid <> temp.tid
WITH COLLECT(r) AS relationships, SUM(r.weight) AS total
UNWIND relationships AS relation
WITH COLLECT([relation.weight / total, ENDNODE(relation).tid]) AS rels
LIMIT 1
MATCH(temp:Temp)
WITH temp, rels
CALL apoc.do.when(
SIZE(rels) > 0 AND SIZE(temp.title_ids) < 10,
'
WITH
REDUCE(
s={x: rand()}, r IN rels | CASE
WHEN s.x IS NULL THEN s
WHEN s.x < r[0] THEN {x: NULL, target: r[1]}
ELSE {x: s.x - r[0]} END
).target AS target
SET $temp.tid = target, $temp.title_ids = $temp.title_ids target
RETURN 1 AS result
',
'RETURN 0 AS result',
{temp: temp, rels: rels}
) YIELD value
RETURN value.result
"
) YIELD batchErrors
MATCH (temp:Temp)
WITH temp.title_ids AS titles
MATCH(title:Title)
WHERE title.tid IN titles
RETURN title
Пока проблем нет. Но когда я выполняю эти запросы вместе, я получаю такую ошибку,
Между SET и CALL требуется WITH (строка 4, столбец 1 (смещение: 76)) «ВЫЗОВ apoc.periodical.commit(» ^
Мой первый вопрос: как я могу объединить эти запросы и выполнить их вместе? И второй вопрос необязательный. Я новичок в Neo4j, поэтому я уверен, что есть несколько более простых способов оптимизировать эти запросы. Как я могу изменить эти запросы к лучшему?
Заранее спасибо.
Ответ №1:
Как указано в ошибке, вам необходимо указать предложение WITH между a SET
и a CALL
.
Итак, просто сделайте это:
MERGE (temp:Temp)
SET temp = {tid: 'blabla', title_ids: [], pid: 'blabla'}
WITH temp
CALL apoc.periodic.commit(
...
и в нижней части вашего запроса вы можете удалить MATCH (temp:Temp)
предложение.
Что касается настройки запроса, вы должны прочитать документацию. В Stackoverflow также есть много связанных вопросов.
Комментарии:
1. Этот запрос сейчас не выдает ошибку. Но, к сожалению, также не возвращает правильный результат. Это всегда возвращает пустой список. У вас есть какие-либо идеи по этому поводу?
2. Можете ли вы попробовать снова запустить свои 2 исходных запроса? Получаете ли вы результаты от второго запроса?
3. Да, если я выполняю эти запросы отдельно, он возвращает список из 10 элементов.
4. Интересно. Интересно, есть ли
temp
устаревшие данные по какой-то причине послеCALL
. Попробуйте начать сMERGE (t:Temp) SET t = {tid: 'blabla', title_ids: [], pid: 'blabla'} WITH 1 CALL ...
, и оставитьMATCH (temp:Temp)
предложение внизу.5. Я пробовал
WITH 1 AS x
и это просто создало временный узел.apoc
оператор никогда не выполняется.