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= match ul 在上面编辑了我的答案,有帮助吗? 是的..好多了!我认为它让我走上了正确的道路……还有一个问题……如何处理收藏品?这是否发生在 Neo/Cypher 之外?我正在使用 Ruby on Rails - 我是否只是简单地获取这些集合并在我的代码中解析它们?还是仅用于 Cypher 的集合?顺便说一句,谢谢! 欢迎。我使用 Java,所以当我有返回节点或属性集合的 Cypher 查询时,我实际上得到了一个 Collection 对象并遍历它以在我的代码中进行处理。不确定Ruby中的等价物是什么。我想您可以专门针对 Ruby 客户端提出另一个问题。 好吧.. 我相信哈希可以在 ROR 中工作.. 这很酷,因为我喜欢 Cypher 的功能 = 主要是更少的编码和更多的 sql 类,非常适合快速应用程序开发 - 但需要无需再次查询数据库即可处理对象的“子项”的能力。似乎非常适合在帖子等上处理 cmets。非常好! Cypher 可能会慢一些,但是嘿,首先进入市场很重要 - 重构和性能调整可以稍后进行.. :-)

以上是关于neo4j 多个可选路径 - 密码的主要内容,如果未能解决你的问题,请参考以下文章

使用开始/结束日期过滤Neo4j中的关系

Neo4j 重置密码

在 neo4j 密码查询中使用多个匹配子句不会返回任何结果

Neo4j与可变长度路径上的属性匹配

如何在 neo4j .net 客户端中使用密码查询返回两个集合

Neo4j,在返回可分页结果的同时查询多个 lucene 索引