在neo4j中搜索重复模式

在neo4j中搜索重复模式,neo4j,cypher,Neo4j,Cypher,一个物料清单关系由两个关系组成。 然后,我通过在以下关系中搜索找到我的组件定义: (a:Part)-[:consumes]->(b:partBom)-[:referencedBy]->(c:Part) 如何在密码请求中重复此模式以查找物料清单中的n个级别?如果您知道级别的数量,则可以将其拼出来 (a:Part)-[:consumes]->(b:partBom)-[:referencedBy]->(c:Part) (c)-[:consumes]->(d:partBom)-[:re

一个物料清单关系由两个关系组成。 然后,我通过在以下关系中搜索找到我的组件定义:

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


如何在密码请求中重复此模式以查找物料清单中的n个级别?

如果您知道级别的数量,则可以将其拼出来

(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,以便对这样的东西进行有效的增量评估。

Yoann

作为Michael答案的后续,如果您在表单的查询中捕获路径

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中的BOM和集合零件中的零件。上面的查询片段将匹配模式的所有最长链。有关此关系模式概念的更多信息,请参阅Neo4j手册。如果有可能循环,您可能希望在初始匹配中设置跳数的上限

恩典与和平


吉姆

所以我认为没有办法做这种虚假的查询<代码>(a:Part)-([:consumes]->(b:partBom)-[:referencedBy])*->(c:Part)这就是问题所在。我不知道我浏览的结构有多深。如果我可以定义一个关系,比如MYREL=
[:consumes]->(b:partBom)-[:referencedBy]
,然后在此关系上递归浏览,那就太好了。请确保您可以用更高的数字替换8,或者关闭它,然后检查路径长度。我的意思是,请注意,我是如何使用Kleene星来表示两个关系序列的重复的。我的理解是,在Cypher中没有真正的语法来表达这一点。这与
[:consumes | referencedBy*8]
不同,因为后者将匹配一行中的两个
consumes
,这不是OP和我想要的。好东西。我需要清理我的数据库,因为我有循环。但通过限制,我可以得到重复的模式!