Cypher Queries Endless Loop - PullRequest
       6

Cypher Queries Endless Loop

0 голосов
/ 28 февраля 2019

У меня проблемы с neo4j / cypher.Например, этот запрос:

MATCH
    (n71613:Concept)-[r0:similarTo]->(n5230:Concept),
    (n5230:Concept)-[r1:similarTo]->(n90576:Concept),
    (n5230:Concept)-[r2:similarTo]->(n121858:Concept),
    (n5230:Concept)-[r3:similarTo]->(n126486:Concept),
    (n126486)-[r:similarTo]->(child:Concept)
WHERE
    (child <> n90576
    AND child <> n121858
    AND child <> n126486
    AND child <> n71613
    AND child <> n5230)
AND
    (n90576 <> n121858
    AND n90576 <> n126486
    AND n90576 <> n71613
    AND n90576 <> n5230
    AND n121858 <> n126486
    AND n121858 <> n71613
    AND n121858 <> n5230
    AND n126486 <> n71613
    AND n126486 <> n5230
    AND n71613 <> n5230)
RETURN *
LIMIT 1

идет по предполагаемому бесконечному циклу, в то время как его выполнение не выглядит так:

MATCH
    (n71613:Concept)-[r0:similarTo]->(n5230:Concept),
    (n5230:Concept)-[r1:similarTo]->(n90576:Concept),
    (n5230:Concept)-[r2:similarTo]->(n121858:Concept),
    (n5230:Concept)-[r3:similarTo]->(n126486:Concept),
    (n126486)-[r:similarTo]->(child)
WHERE
    ('Concept' IN labels(child))
AND
    (child <> n90576
    AND child <> n121858
    AND child <> n126486
    AND child <> n71613
    AND child <> n5230)
AND
    (n90576 <> n121858
    AND n90576 <> n126486
    AND n90576 <> n71613
    AND n90576 <> n5230
    AND n121858 <> n126486
    AND n121858 <> n71613
    AND n121858 <> n5230
    AND n126486 <> n71613
    AND n126486 <> n5230
    AND n71613 <> n5230)
RETURN *
LIMIT 1

Я действительно не знаю, что здесь происходитЯ нашел этот обходной путь благодаря счастливой случайности.

Итак, через некоторое время у меня снова возникла проблема с бесконечными циклами.Почти тот же запрос, но другой шаблон:

MATCH
    (n0:Company)-[r0:produced]->(n1:Document),
    (n0:Company)-[r1:produced]->(n2:Document),
    (n0:Company)-[r2:produced]->(n3:Document),
    (n0:Company)-[r3:produced]->(n4:Document),
    (n0:Company)-[r4:produced]->(n5:Document),
    (n0)-[r:produced]->(child)
WHERE
    ((child <> n0) AND (child <> n1) AND (child <> n2) AND (child <> n3) AND (child <> n4) AND (child <> n5))
AND
    ((n0 <> n1) AND (n0 <> n2) AND (n0 <> n3) AND (n0 <> n4) AND (n0 <> n5) AND (n1 <> n2) AND (n1 <> n3) AND (n1 <> n4) AND (n1 <> n5) AND (n2 <> n3) AND (n2 <> n4) AND (n2 <> n5) AND (n3 <> n4) AND (n3 <> n5) AND (n4 <> n5))
AND
    ('Document' IN labels(child))
RETURN n0 AS n0_0, r0, n1 AS n1_0, n0 AS n0_1, r1, n2 AS n2_1, n0 AS n0_2, r2, n3 AS n3_2, n0 AS n0_3, r3, n4 AS n4_3, n0 AS n0_4, r4, n5 AS n5_4, n0 AS parent, r, child
LIMIT 1

вызывает другой предполагаемый бесконечный цикл, который я "преодолел", выполнив это:

MATCH
    (n0:Company)-[r0:produced]->(n1:Document),
    (n0:Company)-[r1:produced]->(n2:Document),
    (n0:Company)-[r2:produced]->(n3:Document),
    (n0:Company)-[r3:produced]->(n4:Document),
    (n0:Company)-[r4:produced]->(n5:Document)
WHERE 
    ((n0 <> n1) AND (n0 <> n2) AND (n0 <> n3) AND (n0 <> n4) AND (n0 <> n5) AND (n1 <> n2) AND (n1 <> n3) AND (n1 <> n4) AND (n1 <> n5) AND (n2 <> n3) AND (n2 <> n4) AND (n2 <> n5) AND (n3 <> n4) AND (n3 <> n5) AND (n4 <> n5))
OPTIONAL MATCH
    (n0)-[r:produced]->(child:Document)
WITH *
WHERE
    (r IS NOT NULL)
AND
    ((child <> n0) AND (child <> n1) AND (child <> n2) AND (child <> n3) AND (child <> n4) AND (child <> n5))
RETURN n0 AS n0_0, r0, n1 AS n1_0, n0 AS n0_1, r1, n2 AS n2_1, n0 AS n0_2, r2, n3 AS n3_2, n0 AS n0_3, r3, n4 AS n4_3, n0 AS n0_4, r4, n5 AS n5_4, n0 AS parent, r, child
LIMIT 1

, но этот запрос вызываетбесконечный цикл для первого шаблона (первый отправленный мной запрос) (и нет, даже трюк "tags ()" заставил его работать).

Мне просто нужен способ быстрого сопоставления с шаблоном, без необходимостичтобы изменить запрос по понятным причинам.

Я не совсем понимаю, что здесь происходит, я надеюсь, что вы можете немного подсказать и помочь мне.

Спасибо

1 Ответ

0 голосов
/ 28 февраля 2019

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

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

РЕДАКТИРОВАТЬ: Попробуйте это:

MATCH (n:Company)-[r:produced]->(m:Document) 
WITH n, COLLECT(DISTINCT m) as ms
WHERE size(ms) = 6 
MATCH (n:Company)-[r:produced]->(m:Document) 
RETURN n, r, m 
LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...