Neo4j Cypher 中的异或与树
XOR, AND Tree in Neo4j Cypher
我在尝试使用 Neo4js Cypher "decypher" 逻辑树时遇到问题。
我有一个树叶操作的逻辑树。我想收集有效的树叶集。
我目前正在尝试在有效配置节点上收集有效的叶子集。所以我以后可以快速通过该配置节点。
例子
(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 时,我以后都无法正确获得 AND 运算的笛卡尔积。 (13,14,23,24)
有效。
一般来说,我有一个可变深度的树(最大大约 3-4)
操作是XOR, AND, Not AND, Not XOR
- 我在 Cypher 中是否有一种简单的方法来导航这些树?
- 尝试在 ValidConfiguration 节点中合并有效集是否是快速查询的好主意?
以后应该会支持这种形式的查询
(:Model)->(:ValidConf)->(:Leaf:Option)->(:Feature)
然后 return 在有效配置中具有特定功能的所有模型。
或以一定配置价格的多个功能。
我需要 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。
我认为 Cypher 不会用于计算布尔二元表达式树。引用 相关问题:
This is because Cypher has no looping statements powerful enough to
iteratively calculate subresults (in the correct order) for trees of
arbitrary depth.
您将不得不寻找一些额外的系统来进行评估。
如果您会编码 Java,您应该能够通过实施您自己的自定义过程以正确的顺序评估布尔表达式树来做到这一点。
我在尝试使用 Neo4js Cypher "decypher" 逻辑树时遇到问题。
我有一个树叶操作的逻辑树。我想收集有效的树叶集。 我目前正在尝试在有效配置节点上收集有效的叶子集。所以我以后可以快速通过该配置节点。
例子
(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 时,我以后都无法正确获得 AND 运算的笛卡尔积。 (13,14,23,24)
有效。
一般来说,我有一个可变深度的树(最大大约 3-4)
操作是XOR, AND, Not AND, Not XOR
- 我在 Cypher 中是否有一种简单的方法来导航这些树?
- 尝试在 ValidConfiguration 节点中合并有效集是否是快速查询的好主意?
以后应该会支持这种形式的查询
(:Model)->(:ValidConf)->(:Leaf:Option)->(:Feature)
然后 return 在有效配置中具有特定功能的所有模型。 或以一定配置价格的多个功能。我需要 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。
我认为 Cypher 不会用于计算布尔二元表达式树。引用
This is because Cypher has no looping statements powerful enough to iteratively calculate subresults (in the correct order) for trees of arbitrary depth.
您将不得不寻找一些额外的系统来进行评估。
如果您会编码 Java,您应该能够通过实施您自己的自定义过程以正确的顺序评估布尔表达式树来做到这一点。