2016-05-28 2 views
0

Это является продолжением до этого ранее вопрос How to model two nodes related through a third node in neo4j?Как смоделировать отношения, добавляющие функцию к узлу?

Если возможности продукта усиливаются по connects_to отношения с другим продуктом, как следует, что факт быть захвачены?

Пример: данный (shelf:Shelf {maxload:20}), если (node:L-bracket)-[connects-to]->(shelf), то shelf «s maxload увеличивается на 10. Теперь, если кто-то запрашивает для Shelfmaxload=30, который поддерживает, я должен быть в состоянии получить эту комбинацию L-Bracket+Shelf в качестве опции, в дополнение на полки, поддерживающие максимальный заряд без L-bracket. Это один случай использования.

Другое, когда отношение connects_to добавляет совершенно новое свойство к узлу Shelf. Опция, о которой я думаю, заключается в добавлении свойства в отношение, называемое функцией «предоставляет функцию», а затем запрашивать их также при возврате узлов, чтобы узнать, улучшен ли продукт каким-либо из его соединений.

ответ

0

Часть 1:

я должен иметь возможность получить эту комбинацию L-образный кронштейн + шельф, как вариант, в дополнении к полкам, которые поддерживают maxload без L-образного кронштейна.

Этот случай использования обрабатывается с OPTIONAL MATCH:

MATCH (shelf:Shelf {maxload:30}) 
OPTIONAL MATCH (shelf)<-[:CONNECTS_TO]-(bracket:L-Bracket) 
RETURN shelf, collect(bracket) as brackets 

Это вернет вам список полкам и коллекцию скобок для каждого из них - пустая коллекция, если они не имеют каких-либо скобок.

Часть 2:

другой, когда отношения connects_to добавляет совершенно новый свойства в узел Shelf. Вариант я имею в виду добавляет свойство отношения называется «предоставляет функцию», а затем запросить те, а при возврате узлов, чтобы увидеть, если продукт был усиливается любым из его соединений

Вы можете просто использовать тип отношений PROVIDES_FEATURE, не нужно свойство на нем. Вы можете запросить их так же, как и для части 1.

0

Чтобы быть более общим, предположим, что все, что может быть подключено к полке (а не только к L-образному кронштейну), было представлено узлом Accessory, который имеет type и extraLoad свойства, как это:

(:Accessory {type: 'L-Bracket', extraLoad: 10}) 

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

С помощью этой модели вы можете найти все Shelf/Accessory комбинации, которые могут держать нагрузку, по меньшей мере, 30 таким образом:

MATCH (shelf:Shelf) 
OPTIONAL MATCH (shelf)<-[:CONNECTS_TO]-(x:Accessory) 
WITH shelf, COLLECT(x) AS accessories, SUM(x.extraLoad) AS extra 
WHERE shelf.maxLoad + extra >= 30 
RETURN shelf, accessories;