Join 函数的奇怪结果——什么';发生什么事了?

Join 函数的奇怪结果——什么';发生什么事了?,join,clojure,relational-algebra,Join,Clojure,Relational Algebra,我正在使用fromclojure.setjoin应该进行自然连接 加载它: user=> (use 'clojure.set) nil 这很有意义——如果联接的任意一侧都有0行,那么结果应该是: user=> (join [{:a 1 :b 2}] []) #{} 这也是有意义的——同名列(全部为0:)具有相同的值: user=> (join [{:a 1 :b 2}] [{}]) #{{:a 1, :b 2}} 这里也一样: user=> (join [{:a

我正在使用from
clojure.set
<带有两个参数的code>join应该进行自然连接

加载它:

user=> (use 'clojure.set)
nil
这很有意义——如果联接的任意一侧都有0行,那么结果应该是:

user=> (join [{:a 1 :b 2}] [])
#{} 
这也是有意义的——同名列(全部为0:)具有相同的值:

user=> (join [{:a 1 :b 2}] [{}])
#{{:a 1, :b 2}}
这里也一样:

user=> (join [{:a 1 :b 2}] [{:c 3}])        
#{{:c 3, :a 1, :b 2}}
但我迷路了:

user=> (join [{:a 1 :b 2}] [{:a 2 :b 1} {}])
#{}

我之前加入了
{:a1:b2}
{}
,得到了一行。我遗漏了什么?

这取决于您如何看待它,它要么是
join
中的一个bug,要么是调用代码中的一个bug,它将
{:a2:b1}
{}
视为同一关系的成员;我倾向于后者

具体来说,发生这种情况的原因是,使用每个关系的第一个映射计算两个关系的键的交点一次。这也是为什么如果在第二个关系中交换两个贴图的位置,会得到不同的结果