2017-03-08 11 views
0

Neo4js Cypherを使用して論理ツリーを「解読」しようとすると問題が発生します。Neo4j CypherのXORとツリー

私は論理的なツリーを持っています。私は葉の有効なセットを収集したい。 現在、有効なコンフィギュレーションノードに有効なリーフセットを収集しようとしています。そのため、後でそのコンフィグレーションノードをすばやくパスすることができます。

(1 AND 2) AND (3 AND 4)(1 XOR 2) AND (3 XOR 4) しかしmatch (rule)-[AND*]->(leaf) return collect(leaf) するのは簡単です、私は単一の変数で1,2,3,4を収集するたびに、私は後できちんとAND演算のデカルト積を得ることができないため、問題です。 (13,14,23,24)が有効です。

私は(約3-4最大件まで)変数の深さの木を持っている一般的に

操作がXOR, AND, Not AND, Not XOR

  • ある私は、このようなツリーをナビゲートするために行方不明ですサイファーでの簡単な方法はありますか?
  • 有効な設定を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を引用すると:サイファーは 任意の深さの木のための繰り返し(正しい順序で)subresultsを計算 に十分に強力で何ループ文を持っていないので、

これがあります。

評価を行うには、いくつかの追加システムを探す必要があります。

Javaをコーディングできる場合は、独自のカスタムプロシージャを実装して、ブール式の式ツリーを正しい順序で評価する必要があります。