Как я могу создать узел и использовать этот узел в запросе одновременно в Neo4j?

#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 оператор никогда не выполняется.