2017-03-08 85 views
0

我試圖用Neo4js Cypher「分解」一個邏輯樹時出現問題。XOR和Neo4j中的Tree Cypher

我有一個邏輯的操作樹葉。我想收集有效的葉子集。 我目前正在嘗試在有效配置節點上收集有效樹葉集。所以我以後可以快速通過該配置節點。

(1 AND 2) AND (3 AND 4) 是容易match (rule)-[AND*]->(leaf) return collect(leaf) 然而 (1 XOR 2) AND (3 XOR 4) 是一個問題,因爲每當我在一個變量收集1,2,3,4,我以後就不能正確地獲得和操作笛卡爾乘積。 (13,14,23,24)將是有效的。

總的來說,我有可變深度的樹(高達最大約3-4) 操作是XOR, AND, Not AND, Not XOR

  • 是否有Cypher支架一個簡單的方法,我失蹤了導航這些樹木?
  • 正在嘗試合併ValidConfiguration節點中的有效集合快速查詢的一個好主意?
  • 稍後,它應該支持 (:Model)->(:ValidConf)->(:Leaf:Option)->(:Feature) 表格的查詢,然後返回具有某個特徵的所有模型。 或以特定配置價格購買多個功能。

  • 我是否需要UDF或ObjectGraphMapper才能解決此問題? 有沒有與我可以使用的決策樹一起工作的UDF?

任何幫助將不勝感激。

創建實例

CREATE (r:Rule{id:123})-[:COMPOSITION]-> 
startOp:AndOperation:Operation:Operand) 
CREATE (startOp)-[:AND]->(intermediateOp1:OrOperation:Operation:Operand) 
CREATE (startOp)-[:AND]->(intermediateOp2:OrOperation:Operation:Operand) 
CREATE (intermediateOp1)-[:XOR]->(o1:Option:Operand{id:321}) 
CREATE (intermediateOp1)-[:XOR]->(o2:Option:Operand{id:564}) 
CREATE (intermediateOp2)-[:XOR]->(o3:Option:Operand{id:876}) 
CREATE (intermediateOp2)-[:XOR]->(o4:Option:Operand{id:227}) 
CREATE (o1)-[:CONSISTS_OF]->(f1:Feature{text:"magicwand"}) 
.... 

此樹是對稱的,但它們通常都沒有。我需要使o1 + o4有效,o1 + o2無效。 OR被理解爲XOR。

+0

你的數據模型是怎樣的?你能分享一個小例子圖表(例如作爲'CREATE'操作)嗎? –

回答

1

我不認爲Cypher會去評估布爾二進制表達式樹。引用cybersam's answer到一個相關的問題:

這是因爲Cypher支架有 任意深度的樹木沒有循環語句強大到足以 迭代計算子結果(以正確的順序)。

你將不得不尋找一些額外的系統來做評估。

如果您可以編寫Java代碼,您應該可以通過實現您自己的自定義過程來按照正確的順序評估布爾表達式樹。