2017-03-08 68 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代码,您应该可以通过实现您自己的自定义过程来按照正确的顺序评估布尔表达式树。