在neo4j中搜索重复的模式

时间:2014-09-08 21:58:44

标签: neo4j cypher

一种物料清单关系由两种关系组成。 然后我通过搜索这个关系找到我的组件定义:

(a:部分) - [:消费] - >(b:partBom) - [:referencedBy] - >(c:部分)

如何在cypher请求中重复此模式,以便找到我的物料清单的n级?

2 个答案:

答案 0 :(得分:3)

的Yoann,

作为迈克尔答案的后续内容,如果您在表单查询中捕获路径

MATCH (a:Part), p=(a)-[:consumes|referencedBy*2..]->(c:Part)
WHERE NOT (c)-[:consumes]->()
WITH a, rels(p) AS rs, nodes(p) AS ns
WITH a, rs, ns, FILTER(n IN ns WHERE 'partBom' IN LABELS(n)) AS boms, FILTER(n in ns WHERE 'Part' in LABELS(n)) AS parts

以下任何子句都可以访问集合ns和rs中的所有节点和关系,以及集合框中的BOM和集合部件中的部件。上面的查询片段将匹配模式的所有最长链。您可以在this link的Neo4j手册中阅读有关此关系模式概念的更多信息。如果有可能循环,您可能希望在初始匹配中对跳数设置上限。

恩典与和平,

吉姆

答案 1 :(得分:1)

如果您知道级别的数量,那么您可以拼出它们。

(a:Part)-[:consumes]->(b:partBom)-[:referencedBy]->(c:Part)
(c)-[:consumes]->(d:partBom)-[:referencedBy]->(e:Part)
....

或者你可以做得更有活力。

(a:Part)-[:consumes|referencedBy*8]->(c:Part)
WITH rels(path) as rels, nodes(path) as nodes
WHERE ALL(idx in range(0,length(rels)-1,2) WHERE type(rels[idx]) = 'consumes') 
  AND ALL(idx in range(1,length(rels)-1,2) WHERE type(rels[idx]) = 'referencedBy')
  AND ALL(idx in range(1,length(nodes)-1,2) WHERE labels(nodes[idx])[0] = 'partBom') 

通常对于这样的事情,我会查看Java API,以便对此类内容进行有效的增量评估。