CYPHER - вернуть связанные узлы в исходном порядке - PullRequest
0 голосов
/ 07 октября 2019

Я действительно наслаждаюсь потенциальной мощью языка запросов Graph & Cypher (исходя из опыта работы с RDBMS), но я действительно изо всех сил пытаюсь разобраться в некоторых концепциях!

То, что я пытаюсь сделать, кажется, что это должно быть относительно просто ... У меня есть очень простая серия из пяти узлов с отношениями родитель -> ребенок. На мой взгляд, если бы я должен был запросить это, каждый узел должен быть возвращен в соответствующем порядке. Вот как выглядит запрос -

MATCH p = (:Folder)-[:CHILD*]->(f:Folder { id: '1d05a36b-a67f-3fe7-a13a-6f12b1a38d26' })

WITH NODES(p) AS folders

UNWIND folders as folder

WITH folder RETURN DISTINCT folder

Вот как выглядит результат моего запроса в виде графика -

enter image description here

Однако после запроса по указанному выше запросу и получения физического ответа он представляется в следующем порядке:

  • Папка 4
  • Папка 5
  • Папка 3
  • Папка 2
  • Папка 1
╒══════════════════════════════════════════════════════════════════════╕
│"folder"                                                              │
╞══════════════════════════════════════════════════════════════════════╡
│{"name":"Folder 4","created_at":"2019-10-07 12:14:07","id":"5b6b3316-e│
│e57-3ca5-8f62-bed81b09ab7b","updated_at":"2019-10-07 12:14:07","parent│
│_folder_id":"2dabecfc-2018-3876-bc01-28922ebbb09d"}                   │
├──────────────────────────────────────────────────────────────────────┤
│{"name":"Folder 5","created_at":"2019-10-07 12:14:07","id":"1d05a36b-a│
│67f-3fe7-a13a-6f12b1a38d26","updated_at":"2019-10-07 12:14:07","parent│
│_folder_id":"5b6b3316-ee57-3ca5-8f62-bed81b09ab7b"}                   │
├──────────────────────────────────────────────────────────────────────┤
│{"name":"Folder 3","created_at":"2019-10-07 12:14:07","id":"2dabecfc-2│
│018-3876-bc01-28922ebbb09d","updated_at":"2019-10-07 12:14:07","parent│
│_folder_id":"a1344b93-ab69-398d-81c5-cb901ff8f0b0"}                   │
├──────────────────────────────────────────────────────────────────────┤
│{"name":"Folder 2","created_at":"2019-10-07 12:14:07","id":"a1344b93-a│
│b69-398d-81c5-cb901ff8f0b0","updated_at":"2019-10-07 12:14:07","parent│
│_folder_id":"a22eca18-57fd-364d-b965-d850724131e8"}                   │
├──────────────────────────────────────────────────────────────────────┤
│{"name":"Folder 1","created_at":"2019-10-07 12:14:07","id":"a22eca18-5│
│7fd-364d-b965-d850724131e8","updated_at":"2019-10-07 12:14:07"}       │
└──────────────────────────────────────────────────────────────────────┘

Как можно упорядочить эти данные или мой запрос требует полного переписывания?

Спасибо!

1 Ответ

2 голосов
/ 07 октября 2019

Можете ли вы попробовать этот запрос:

MATCH p = (n:Folder)-[:CHILD*]->(f:Folder { id: '1d05a36b-a67f-3fe7-a13a-6f12b1a38d26' })
WHERE NOT ()-[:CHILD]->(n)
WITH NODES(p) AS folders
RETURN folders

Я думаю, что ваша проблема связана с тем, что существует несколько путей p, и именно поэтому вы использовали distinct.

Не забывайте, что если вы попросите базу данных найти шаблон (n:Folder)-[:CHILD*]->(f:Folder { id: '1d05a36b-a67f-3fe7-a13a-6f12b1a38d26' }), база данных предоставит вам все возможности, поэтому в вашем примере:

  • F4 -> F5
  • F3 -> F4 -> F5
  • F2 -> F3 -> F4 -> F5
  • F1 -> F2 -> F3 -> F4 -> F5

И если вы сделаете distinct для этого набора результатов, да, у вас будет результат F4, F5, F3, F2, F1.

...