Neo4j完全匹配查询到仅指定模式

时间:2013-10-31 19:32:09

标签: neo4j cypher exact-match

我正在研究一个项目建模产品使用模式,我无法确定与单一模式完全匹配的最佳方法

在模型中,我有几个“product_pattern”节点作为代表各种产品的几个节点的中心或集线器。每个产品节点都是唯一的,可以连接到任何product_pattern。一系列产品模式节点可能如下所示:

--pattern_1
--- Product A
--- Product B
--- Product C

--pattern_2
--- Product A
--- Product B
--- Product C
--- Product D

--pattern_3
--- Product B
--- Product C

我想查询使用产品B和C以及仅使用B和C的product_patterns的图表。如果我刚刚使用:

Start b = node(16), c = node(37)
MATCH (b)<-[:PRODUCT_USED]-(n)-[:PRODUCT_USED]->(c)
RETURN n

我会返回所有product_patterns,因为它们都与B和C有关系。要从我查询的内容中删除具有其他关系的匹配,我预见到两种策略..

  1. 在product_pattern.num_products的每个模式节点中创建一个属性,以便在初始MATCH之后对WHERE子句使用。在这种情况下,num_products属性必须匹配仅具有B和C关系的节点的'2'。我关注的是我必须深入了解每个返回节点的属性,而流行的产品将使返回列表更大。< / p>

  2. 为图中的每个其他产品创建一个WHERE NOT子句,我不会与之关系...不理想,最有可能遍历整个图形。

  3. 是否有任何优雅的方法可以确认您的查询确切地返回了您要求的关系匹配,而不是与您的查询匹配但又有其他关系的节点?

1 个答案:

答案 0 :(得分:2)

你可以试试这个:

Start b = node(16), c = node(37)
MATCH (b)<-[:PRODUCT_USED]-(n)-[:PRODUCT_USED]->(c)
WHERE length((n)-[:PRODUCT_USED]->(c)) == 2
RETURN n