基本上,你想要的是把所有子图的项目,但过滤掉失败的过滤器关系的路径。您可以使用ALL/NONE/ANY来确保拾取的路径不违反任何约束。
下面是一个假设from和to可以单独定义的例子,但我认为它足够清晰以适应您的需求。(注意:您可以使用TYPE(r)
检查关系类型名称太)
WITH 11 as num
MATCH p=(s:Bike)-[*..25]-(n)
WHERE
ALL(r IN RELATIONSHIPS(p) WHERE
(NOT EXISTS(r.RANGEFROM) OR toInteger(r.RANGEFROM) <= num) AND
(NOT EXISTS(r.RANGETO) OR num <= toInteger(r.RANGETO)))
AND TYPE(RELATIONSHIPS(p)[-1]) = "LO"
WITH NODES(p) as ns, RELATIONSHIPS(p) as rs
UNWIND ns as n UNWIND rs as r
RETURN COLLECT(DISTINCT n), COLLECT(DISTINCT r)
或者这应该是更有效的。
WITH 11 as num
MATCH (ci)-[lo:LO]->(ds)
WHERE toInteger(lo.RANGEFROM) <= num <= toInteger(lo.RANGETO)
WITH ds, COLLECT(lo) as lo
MATCH p=shortestpath((b:Bike)-[*..25]->(ds))
WHERE ALL(r IN RELATIONSHIPS(p) WHERE TYPE(r) <> "LO" OR r in lo)
WITH NODES(p) as ns, RELATIONSHIPS(p) as rs
UNWIND ns as n UNWIND rs as r
RETURN COLLECT(DISTINCT n), COLLECT(DISTINCT r)
注意:如果你需要更好的性能,你可能要考虑使用的Neo4j Traversal API。
那么每个自行车有一个节点,给它一个数字。 (b:自行车) - [:COMPOSED_OF] - >(c:Component {reference:internalRefAtBikeMaker}) - [:SUPPLIED_BY {supplierPartReference:azertyui}] - >(s:Supplier {name:“SuperSupplier”}) 类似的东西 –
我会知道如何查询这样的图表,如果我可以创建它:)。但我不知道如何重组整个图,因为它由1百万个可能的组件组成。如果你可以帮助我创建图表,你可以从我发布的图表中提出,它可能是一个解决方案... – lug
看起来你对同一供应商使用多个节点,因为图形中的供应商节点确实象征着供应商的一部分,而不是自己的供应商。这在你的'(:Supplier) - [:IsIn] - >(:Component)'关系中也很明显,因为它通常没有意义,除非节点是特定部件的供应商。说'(:Component) - [:IsIn] - >(:Component)''会更有意义。你有没有灵活性来修复这个数据模型?由于它存在,您也无法利用索引查找,因此在大图上查询速度会很慢。 – InverseFalcon