Как запрашивать узлы исключительно в связи с определенными узлами - PullRequest
0 голосов
/ 02 июля 2018

У меня есть график, содержащий типы узлов Fruit, Veggie и Dish, с одним типом отношения [:in], чтобы указать, какие ингредиенты содержатся в каждом блюде.

Пример данных:

create (A:Ingredient:Fruit { name: "Apple" }), 
   (B:Ingredient:Fruit { name: "Banana" }),
   (C:Ingredient:Veggie { name: "Cellery" }),
   (D:Ingredient:Veggie { name: "Daikon" }),
   (E:Ingredient:Veggie { name: "Eggplant" }),
   (F:Ingredient:Veggie { name: "Fennel" }),
   (G:Ingredient:Veggie { name: "Gord" }),
   (H:Ingredient:Veggie { name: "Horseradish" }),
   (Salad:Dish { name: "Salad" }),
   (FruitBowl:Dish { name: "FruitBowl" }),
   (Platter:Dish { name: "Platter" }), 
   (StirFry:Dish { name: "StirFry" }), 
   (A)-[:in]->(FruitBowl),
   (B)-[:in]->(FruitBowl), 
   (A)-[:in]->(Platter),
   (B)-[:in]->(Platter),
   (C)-[:in]->(Platter),
   (D)-[:in]->(Platter), 
   (C)-[:in]->(Salad),
   (D)-[:in]->(Salad),
   (E)-[:in]->(Salad),
   (F)-[:in]->(StirFry),
   (G)-[:in]->(StirFry),
   (H)-[:in]->(StirFry)

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

match (d:Dish) 
where not ((:Fruit)-[:in]->(d)) 
return d

Это возвращает Salad и StirFry, как я и ожидал.

Есть ли способ затем запросить все овощи, которые только принадлежат этому набору? (в этом примере только Veggies E, F, G, & H) Если нет, или если это действительно трудно сделать, есть ли лучший способ структурировать эти данные, чтобы сделать эти очевидные отношения более очевидными?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы можете продолжить свой запрос с того, который вы начали, добавив дополнительное предложение MATCH:

MATCH (d:Dish) 
WHERE NOT ((:Fruit)-[:in]->(d))
MATCH (veggie:Veggie)-[:in]->(d)
RETURN (veggie)
0 голосов
/ 02 июля 2018

Вы близки к решению. Вы можете match овощи в первом шаблоне. Предложение where удалит нежелательные блюда.

match (d:Dish)<-[:in]-(v:Veggie)
where not ((v)-[:in]->(:Dish)<-[:in]-(:Fruit))
return v

вывод будет примерно таким:

╒═══════════════════╕
│v                  │
╞═══════════════════╡
│{name: Eggplant}   │
├───────────────────┤
│{name: Horseradish}│
├───────────────────┤
│{name: Gord}       │
├───────────────────┤
│{name: Fennel}     │
└───────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...