2013-09-23 113 views
2

我想知道在cascalog中为可能为null的字段进行外连接时指定默认值的最佳方式是什么。为左外连接提供默认值

(def example-query 
    (<- [?id ?fname ?lname !days-active] 
     (users :> ?id ?fname ?lname) 
     (active :> ?fname ?lname !days-active)) 

在这个例子中用户和活动将预先定义的查询,我只是希望活动的用户信息进行关联(?FNAME?L-NAME!天激活)和普通用户的信息(?ID?FNAME?LNAME )

因此,当如果是为没有相应的信息联接发生了!天活性的零 即

392393 john smith 3 
003030 jane doe 0 

,而不是

它会输出0,而不是
392393 john smith 3 
003030 jane doe null 

更新了例

(<- [!!database-id ?feature !!user-clicks !!engaged-users ?application-id ?active-users] 
        (app-id-db-id-feature-clicks-engaged :> ?application-id !!database-id ?feature !!user-clicks !!engaged-users) 
        (user-info :> ?application-id ?feature ?active-users))] 

例如输出将看起来大致如下

4234 search null null 222 5000 
3232 profile 500 400 331 6000 

与我有兴趣,我可以改变,这将是!!对于从事领域的过滤用户和!!用户点击具有0而不是null。会使用多个谓词有效吗?

回答

1

我想你想要做的是增加一个or谓:

(def example-query 
    (<- [?id ?fname ?lname !days-active] 
     (users :> ?id ?fname ?lname) 
     (active :> ?fname ?lname !days-active) 
     (or !days-active 0 :> ?active-days))) 

这不是一个外部联接,顺便说一下,它只是没有过滤掉在!days-active位置空变量。

+0

我更新了这个例子,以提供更多信息/更接近我的实际问题。你会使用一个或谓词仍然工作? – mcgeep

+0

是的,我敢打赌,你可以编写一个谓词宏,它会扩展出来,让你在一行中完成。应该很好走。 –

+0

谢谢你的帮助! – mcgeep