代码之家  ›  专栏  ›  技术社区  ›  sof

为什么逻辑“和”谓词不起作用?

  •  0
  • sof  · 技术社区  · 4 年前

    测试时间 datascript 1.3.0

    数据:

    [{:db/id -1 :name "Smith" :firstname "Oliver" :age 20}
     {:db/id -2 :name "Jones" :firstname "Oliver" :age 20}
     {:db/id -3 :name "Smith" :firstname "Amelia" :age 16}
     {:db/id -4 :name "Jones" :firstname "Amelia" :age 16}]
    

    尝试使用逻辑查询 and 下面的谓词谁叫Smith,年龄超过18岁,为什么它会返回未经过滤的整个集合?

    '[:find ?firstname ?name
      :where
      [?p :name ?name]
      [?p :firstname ?firstname]
      [?p :age ?age]
      [(and (= ?name "Smith") (> ?age 18))]]
    
    ;;; wrong result: #{[Oliver Smith] [Oliver Jones] [Amelia Smith] [Amelia Jones]}
    

    然后改为使用离散谓词进行查询,得到了令人满意的结果。

    '[:find ?firstname ?name
      :where
      [?p :name ?name]
      [?p :firstname ?firstname]
      [?p :age ?age]
      [(= ?name "Smith")]
      [(> ?age 18)]]
    
    ;;; correct result: #{[Oliver Smith]}
    

    datomic datascript datalog 通常只支持分散到离散子句的数据模式?是传统的逻辑运算吗 等等在这里不兼容?

    0 回复  |  直到 4 年前
        1
  •  3
  •   Niki Tonsky    4 年前

    这是因为AND是隐含的。所有子句都通过AND隐式连接,因为在中它们必须同时为true才能匹配查询

        2
  •  1
  •   akond    4 年前

    根据 the manual 不能使用 and-clause 就这样。唯一可以使用的方法 和条款 当它在一个 or-clause :

    内部 子句,您可以使用 子句以指定 结合此条款在或条款之外不可用, 因为在其他子句中,连词是默认的。

    推荐文章