如何建模为节点添加功能的关系?

时间:2016-05-28 07:50:55

标签: neo4j cypher

这是此前一个问题的后续行动 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的{​​{1}}增加10.现在,如果有人查询支持maxload的{​​{1}},除了支持maxload而没有Shelf的货架之外,我应该能够检索maxload=30的这种组合作为选项。这是一个用例。

另一种是L-Bracket+Shelf关系向L-bracket节点添加全新属性的时间。我想到的选项是在称为“提供功能”的关系中添加一个属性,然后在返回节点时查询这些属性,以查看产品是否被其任何连接增强。

2 个答案:

答案 0 :(得分:0)

第1部分:

  

我应该能够将这种L-Bracket + Shelf的组合检索为   一个选项,除了没有支持maxload的架子   L形托架。

此用例由OPTIONAL MATCH处理:

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

这将为您返回一个货架列表和每个货架的一组括号 - 如果它们没有任何括号,则为空集合。

第2部分:

  

另一个是在connections_to关系添加全新的时候   属性到Shelf节点。我想到的选择是添加一个   属于这种关系的属性叫做&#39;提供功能&#39;然后查询   返回节点时,以及是否有产品   通过任何连接增强

您可以简单地使用PROVIDES_FEATURE关系类型,不需要属性。您可以按照与第1部分相同的方式申请。

答案 1 :(得分:0)

为了更加通用,假设可以连接到架子(而不仅仅是L-Bracket)的所有内容都由Accessory节点表示,该节点具有typeextraLoad属性,像这样:

(: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;