neo4j多个可选路径 - 密码

时间:2013-05-08 23:21:09

标签: neo4j cypher

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

简单地说这个问题让我用关系术语描述它(使用左连接 - 对象总是返回,只有当存在该类型的记录时才会返回liker和选民数据)

[object]+ -> liker
        + -> voter

我想回来的是:

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

然而,我切割的每一种方式都无法让它像那样出来。跳过行2400(我已尝试过where的每个组合),或者值甚至从likerID转移到voterID列(bug?)。

以下是密码的示例:

    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)

即使我尝试id(object_node_a)= id(object_node_b)...

,它也不起作用

如果我只是试图得到一个骗子,那就有效......和选民一样..但是当我试图做两个......炸弹......

我已经尝试过使用where等,但最终我从来没有得到完整的对象列表 - 它可以根据匹配来减少列表,也可以给我笛卡尔积,但不能解析。

SQL示例:LEFT JOIN

我是一个sql人,所以让我用这种方式解释一下 - 我左边有一个对象表,我想把它连接到一个liker表和一个选民表,并返回liker id和voter id与单个行以及对象数据。无论是否有选民或利克记录,都将返回所有对象记录。

[object]+ -> liker
        + -> voter

这是否可能?

是否可以通过密码执行此操作?

1 个答案:

答案 0 :(得分: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))

仍然为每个对象获取一行,但是用于投票和喜欢的用户IDS的集合。

包括发布对象的人:

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