neo4j 多个可选路径 - 密码
Posted
技术标签:
【中文标题】neo4j 多个可选路径 - 密码【英文标题】:neo4j Multiple optional paths - cypher 【发布时间】:2013-05-08 23:21:09 【问题描述】:我正在跟踪用户是否喜欢和/或对其他人发布的对象列表中的对象投票。我可以获得喜欢和投票,但不能同时获得两者。 (一个人可以对一个对象点赞和投票,这些选项并不相互排斥)。
为了简化这个问题,让我用关系术语来描述它(使用左连接 - 始终返回对象,仅当存在该类型的记录时才返回喜欢者和投票者数据)
[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 人,所以让我这样解释一下 - 我在左侧有一个 objects 表,我想将它左连接到一个 liker 表和一个 voter 表,并返回 liker id 和 voter id 与对象数据一起在一行上。无论是否有投票者或喜欢者记录,都会返回所有对象记录。
[object]+ -> liker
+ -> voter
这可能吗?
是否可以通过密码来做到这一点?
【问题讨论】:
【参考方案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
【讨论】:
绝对干净,但我还需要检索参赛者数据。我可以得到两个匹配的结果,但是当我尝试第三个时没有骰子.. 更像这样的东西: start o=以上是关于neo4j 多个可选路径 - 密码的主要内容,如果未能解决你的问题,请参考以下文章