Как использовать набор результатов двух запросов в качестве параметра для третьего запроса в Cypher? - PullRequest
0 голосов
/ 29 мая 2018

Здравствуйте, Neo4J / Cypher Gurus.

Мне нужно получить результирующий набор из двух запросов и использовать их в качестве параметра для третьего.Мне удалось использовать набор результатов одного (или другого) запроса в качестве параметра для третьего, но оба запроса одновременно не работают.

Я пытаюсь:

// External Parameter
:params {extParam:'1.1.1'}
// First Query
MATCH p=(startnode:DerivTree)-[:IsDerivedFrom*0..]->(endnode:DerivTree)
  WHERE startnode.dbvid=$extParam
  UNWIND nodes(p) as query1_list
  WITH distinct query1_list.dbvid as query1_result
// Second Query
MATCH (d:Resource {deleted:true})
  WHERE d.dbvid=$extParam
  WITH COLLECT(d) AS query2_list
  UNWIND query2_list as query2_result
// Third Query
MATCH (n:Resource)
  WHERE n.prop1 = query1_result
    AND n.prop2 <> query2_result
    AND EXISTS(n.prop3)
  RETURN n

Если я попробую Query 1 и Query 3 (без фильтра, который использует набор результатов Query 2), это сработает.Если я попробую Query 2 и Query 3 (без фильтра, который использует набор результатов Query 1), он также будет работать.

Но мне нужны наборы результатов Query 1 и 2 для фильтра Query 3.

Любая подсказка?

Заранее спасибо.

1 Ответ

0 голосов
/ 29 мая 2018

Вы создаете декартовы произведения между вашими переменными.Если вы ПРОФИЛИРУЕТЕ свой запрос, то увидите, как количество строк, проходящих между операциями, увеличивается по мере его выполнения.

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

Чтобы это исправить, вы, вероятно, захотите убедиться, что вы собираете свои результаты по пути (например, собирая результаты вашего первогозапрос, так что количество элементов падает до 1, чтобы избежать мультипликативного выполнения следующих операций), затем сделайте то же самое для запроса 2, и если вам нужны результаты в виде строк, разверните их для запроса 3 (хотя в вашем случае используйте in для членства в спискедолжно быть достаточно).

Попробуйте:

// First Query
MATCH p=(startnode:DerivTree)-[:IsDerivedFrom*0..]->(endnode:DerivTree)
WHERE startnode.dbvid=$extParam
UNWIND nodes(p) as query1 // this is not a list, so rename the variable
WITH collect(distinct query1.dbvid) as query1_results // cardinality at 1 row
// Second Query
MATCH (d:Resource {deleted:true})
WHERE d.dbvid=$extParam
WITH query1_results, COLLECT(d) AS query2_results // cardinality at 1 row
// Third Query
MATCH (n:Resource)
WHERE n.prop1 in query1_results
  AND not n.prop2 in query2_results
  AND EXISTS(n.prop3)
RETURN n
...