2

我正在跟踪用户是否喜欢和/或对其他人发布的对象列表中的对象进行投票。我可以获得喜欢和投票,但不能同时获得两者。(一个人可以对一个对象点赞和投票,这些选项并不相互排斥)。

为了简单地解决这个问题,让我用关系术语来描述它(使用左连接 - 始终返回对象,仅当存在该类型的记录时才返回喜欢者和投票者数据)

[object]+ -> liker
        + -> voter

我想返回的是:

objectID likerID  voterID
2343     null     88
2345     11       null
2382     44       1256
2400     null     null

然而,我切的每一种方式都不能让它像那样出来。要么跳过第 2400 行(我已经尝试了 where 的每种组合),要么值甚至从 likerID 转移到 voterID 列(错误?)。

这是密码的示例:

    start objects=node(158) 
match contestant-[:POSTED]->object_node-[:POSTED_OBJECT]->objects<-[?:POSTED_OBJECT]-object_node_a<-[?:LIKES]-liker
    , objects<-[?:POSTED_OBJECT]-object_node_b<-[?:VOTES]-voter
    return id(object, id(liker), id(voter)

即使我尝试 where id(object_node_a) = id(object_node_b)... 它也不起作用

如果我只是想得到一个喜欢它的作品..与选民一样..但是当我尝试同时做这两个时..炸弹..

我试过使用 where 等,但最终我从来没有得到完整的对象列表——它要么根据匹配项修剪列表,要么给我一个 distinct 无法解析的笛卡尔积。

SQL 示例:左连接

我是一个 sql 人,所以让我这样解释一下——我在左边有一个对象表,我想把它加入到一个喜欢表和一个投票者表中,并返回喜欢者 ID 和投票者 ID单行以及对象数据。无论是否有投票者或喜欢者记录,都将返回所有对象记录。

[object]+ -> liker
        + -> voter

这甚至可能吗?

是否可以通过密码来做到这一点?

4

1 回答 1

1

希望我没有误解。要得到

objectID likerID  voterID
2343     null     88
2345     11       null
2382     44       1256
2400     null     null

即所有对象和那些喜欢它并投票支持它的对象的ID,这个查询应该这样做-

start o=<lookup for objects>
match ul-[like?:LIKED]->o, uv-[vote?:VOTED]->o 
return o,ID(ul),ID(uv)

这将返回没有投票和喜欢的对象,包括投票和喜欢以及任何一个。请注意,如果您有多个用户可能为同一个对象投票,那么您的对象行将为每个用户重复。你可能想做类似的事情

start o=<lookup for objects>
match ul-[like?:LIKED]->o, uv-[vote?:VOTED]->o 
return o,collect(ID(ul)),collect(ID(uv))

仍然可以为每个对象获取一行,但要收集用于投票和点赞的用户 ID。

要包括发布对象的人:

start o=node(4,5,6,7) 
match ul-[like?:LIKED]->o, uv-[vote?:VOTED]->o, c-[:POSTED_OBJECT]->o 
return o,ID(ul),ID(uv),ID(c)

我创建了一个小样本来玩:http ://console.neo4j.org/r/in8g4w

于 2013-05-09T02:45:56.557 回答