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

Я пытаюсь выполнить некоторые запросы, подобные следующему:

MATCH path = (f1:Frag)-[r1:I]->(f2:Frag)-[r2:I]->(f3:Frag)-[r3:I]->
 (f4:Frag)-[r4:I]->(f5:Frag)-[r5:I]->(f6:Frag)
 WHERE (r1.at2 <> r2.at1 AND r2.at2 <> r3.at1 AND r3.at2 <> r4.at1
  AND r4.at2 <> r5.at1) AND (not((f1)-[:E]-(f3)) AND not((f1)-[:E]-(f4))
  AND not((f1)-[:E]-(f5)) AND not((f1)-[:E]-(f6)) AND not((f2)-[:E]-(f4))
  AND not((f2)-[:E]-(f5)) AND not((f2)-[:E]-(f6)) AND not((f3)-[:E]-(f5))
  AND not((f3)-[:E]-(f6)) AND not((f4)-[:E]-(f6)))
RETURN path LIMIT 10 

Но когда я хочу ограничить свой запрос некоторыми отношениями, такими как:

MATCH path = (f1:Frag)-[r1:I]->(f2:Frag)-[r2:I]->(f3:Frag)-[r3:I]->
 (f4:Frag)-[r4:I]->(f5:Frag)-[r5:I]->(f6:Frag)
 WHERE (r1.at2 <> r2.at1 AND r2.at2 <> r3.at1 AND r3.at2 <> r4.at1
  AND r4.at2 <> r5.at1) AND (not((f1)-[:E]-(f3)) AND not((f1)-[:E]-(f4))
  AND not((f1)-[:E]-(f5)) AND not((f1)-[:E]-(f6)) AND not((f2)-[:E]-(f4))
  AND not((f2)-[:E]-(f5)) AND not((f2)-[:E]-(f6)) AND not((f3)-[:E]-(f5))
  AND not((f3)-[:E]-(f6)) AND not((f4)-[:E]-(f6)))
  AND ALL(r in relationships(path) WHERE r.niv <20)
RETURN path LIMIT 10

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

Можно ли ограничить запрос подграфом?

1 Ответ

0 голосов
/ 07 декабря 2018

Следующая значительно упрощенная форма вашего запроса должна быть логически эквивалентна вашей (если отношение I от узла Frag всегда заканчивается на узле Frag) и возвращает упорядоченные отношения и узлы вашегожелаемые пути.(На самом деле вы можете просто вернуть rs, так как отношение содержит ссылки на его начальный и конечный узлы).Профиль этого запроса также намного проще, чем ваш, поэтому этот запрос может быть быстрее.

MATCH p = (:Frag)-[:I*5]->(:Frag)
WITH RELATIONSHIPS(p) AS rs, NODES(p) AS ns
WHERE
  ALL(i IN RANGE(0, SIZE(rs)-2) WHERE rs[i].at2 <> rs[i+1].at1) AND
  ALL(j IN ns[0..-2] WHERE ALL(k IN ns[2..] WHERE NOT (j)-[:E]-(k))) AND
  ALL(r in rs WHERE r.niv < 20)
RETURN *
LIMIT 10
...