【问题标题】:How to model boolean expressions in JSON tree structure如何在 JSON 树结构中建模布尔表达式
【发布时间】:2020-07-14 19:44:52
【问题描述】:

我已经在 google 和堆栈溢出方面花费了几个小时,但我还没有就如何对嵌套布尔数据进行建模得出结论。

假设我有以下表达式:

123 and 321 and (18 or 19 and (20 or 21))

我如何在 JSON 树结构中对其进行建模,以便我可以通过简单地遍历树来重建您在上面看到的表达式?我不需要实际评估逻辑,只需将其构建为以树形描述逻辑的方式。

提前致谢。

为了记录,这是我正在尝试完成的系统类型,以及我猜测应该如何根据下面的答案构建树。

ANY OF THESE:
    13
    14
    ALL OF THESE:
        18
        19
        20

          or
        /   \
       or   13
      /  \
    14    and
         /   \
       and   18
       / \
     20   19

【问题讨论】:

  • 值得注意的是,问答似乎与JSON无关。是的,在接受的答案中讨论了将逻辑建模为树但 JSON 的讨论。也许应该将问题更新为“作为抽象树的模型逻辑”。

标签: json tree boolean


【解决方案1】:

我的 json 格式的条件集:

"FilterCondition": {
  "LogicalOperator": "AND",
  "Conditions": [
    {
      "Field": "age",
      "Operator": ">",
      "Value": "8"
    },
    {
      "LogicalOperator": "OR",
      "Conditions": [
        {
          "Field": "gender",
          "Operator": "=",
          "Value": "female"
        },
        {
          "Field": "occupation",
          "Operator": "IN",
          "Value": ["business","service"]
        }
      ]
    }
  ]
}

参考:https://zebzhao.github.io/Angular-QueryBuilder/demo/

【讨论】:

  • 这是对 OP 问题的回答吗?
【解决方案2】:

考虑一下编程语言会以哪个顺序评估语句的各个部分。根据 and 和 or 的优先级以及它们的左或右结合性,它必须选择一些“最深”的部分,并且必须首先进行评估,然后将其作为其完全评估的操作数之一提供给其“父级”(最接近的关联性较小的运算符),然后在评估时它具有父级,依此类推。

因此,您将拥有一棵树,在完全评估后到达根,叶节点是表达式中可以首先评估的部分(不要依赖任何评估来得出其结果)。

作为一个简单的例子,1 and (2 OR 3) 将被建模为

  and
 /   \
1    or
    /  \
   2    3

如果具有相同优先级的运算符从左到右求值,并且 AND 的优先级高于 OR(例如 C++ 中的 true:http://en.cppreference.com/w/cpp/language/operator_precedence),则

123 and 321 and (18 or 19 and (20 or 21))

变成

        and
       /   \
    and     \
   /   \     \
123     321   \
               \
                or
               /  \
             18    and
                  /   \
                or     19
               /  \
             20    21

并且要评估这棵树的结果,您将首先评估最深的值,将每个节点替换为用当前运算符评估其左侧和右侧的结果,直到根中只剩下一个数字。

要以编程方式从布尔表达式转换为布尔表达式树,您需要编写解析器*,例如在 Python 中,您可以使用 PLY http://www.dabeaz.com/ply/ 编写它,并且每种语言都有不同的第三方解析器构造库,即最受欢迎。

【讨论】:

  • 您能否提供一个在同一级别具有多个和的示例,也许使用我上面的示例?
  • 你怎么知道括号放在哪里?
  • @ThinkingInBits 如果您的意思是编程,您需要编写一个解析器(查看 PLY 的文档,该文档旨在为表达式、语法等编写解析器,您会看到它是如何工作的以及为什么它必须工作)。不要试图在没有解析器的情况下这样做。
  • 用户实际上是要通过一个表单来定义界面中的逻辑,该表单允许他们说“所有这些:1,2,3,任何这些:4,5,6,缩进-- 所有这些 7、8"
  • @ThinkingInBits 您能否编辑您的问题以准确说明您想要什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
相关资源
最近更新 更多