0

我在尝试使用 Neo4js 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 时,我以后都无法正确获得 AND 运算的笛卡尔积。(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。

4

1 回答 1

1

我认为 Cypher 不能用于评估布尔二元表达式树。引用cybersam对相关问题的回答:

这是因为 Cypher 没有足够强大的循环语句来迭代计算任意深度树的子结果(以正确的顺序)。

您将不得不寻找一些额外的系统来进行评估。

如果您可以编写 Java 代码,您应该能够通过实现自己的自定义过程来以正确的顺序评估布尔表达式树来做到这一点。

于 2017-03-13T04:44:07.177 回答