WebHU - Programozási kérdések és válaszok

Nagyon furcsa viselkedés a neo4j OPCIONÁLIS MATCH-szal egy linkelt listában

Van egy linkelt listaszerkezetem:

(root:`Desk`)-[:linked_list*0..]->(article:`Article`)-[:linked_list]->...-[:linked_list]->(root:`Desk`)

A lista összes elemének lekérdezéséhez ezt a lekérdezést használom:

MATCH (r)-[:linked_list]->(e) 
WHERE ID(r) = {r_id} 
AND r <> e 
RETURN e

És nagyon jól működik.

De amikor megpróbálok opcionálisan egyeztetni néhány Article-hoz kapcsolódó relációt, a lekérdezés valóban sok időt vesz igénybe, és sok furcsa adatot kapok.

MATCH (r)-[:linked_list]->(e) 
OPTIONAL MATCH (e)-[:author]->(u:`User`) 
WHERE ID(r) = {r_id} 
AND r <> e 
RETURN e, [collect(a)] as authors

Megpróbáltam megjeleníteni az eredményt a http://localhost:7474 címen, és ez az eredmény:

lekérdezés eredménye

Úgy tűnik, hogy kitölti az r és e értékeket az adatbázis összes értékével.

Van ötleted, hogy miért történik ez?

21.01.2016

Válaszok:


1

A megfigyelt viselkedésnek 2 oka van:

  1. A WHERE záradék csak a közvetlenül megelőző MATCH záradékát szűri.
  2. Egy OPTIONAL MATCH záradék, amely nem egyezik, nem távolítja el a korábbi MATCH záradékok eredményét.

Az első MATCH záradék megfelel minden szomszédos r és e csomópontnak (mivel nem követi azonnal egy WHERE záradék).

A második MATCH záradékot a rendszer egy WHERE záradékkal szűri. De mivel ez egy OPTIONAL MATCH záradék, a WHERE záradék teljesítésének elmulasztása nem szünteti meg az első MATCH által talált egyezéseket.

Ezért a WHERE záradékot közvetlenül az első MATCH záradék után kell elhelyeznie (olyan, mint @DaveBennett válasza), hogy elvégezhesse a kívánt szűrést.

21.01.2016

2

Úgy gondolom, hogy valójában valami ilyesmit szeretne csinálni. Keresse meg a linked_list elemet, majd minden egyes e egyezővel hajtsa végre az opcionális egyezést.

MATCH (r)-[:linked_list]->(e) 
WHERE ID(r) = {r_id} 
AND r <> e
WITH e 
OPTIONAL MATCH (e)-[:author]->(a:`User`) 
RETURN e, collect(a) as authors
21.01.2016
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..