基本上,你想要的是把所有子圖的項目,但過濾掉失敗的過濾器關係的路徑。您可以使用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