0
给定一组User
顶点,我需要找到所有连接到这些顶点的Chat
顶点,但没有其他顶点。例如,所有只有Alice的聊天和Bob参与。查询应该排序结果,以便最先返回与最新消息相关的聊天。如何比较TinkerPop中相等的顶点集?
在我最初的尝试我试图从用户的一个开始,请访问他/她参加了所有的聊天记录,并筛选它们,以便只有那些聊天记录仍然是具有完全相同的所有其他用户参加。
traversal().V(user.id()) //random user of the set
.out("participates")
.hasLabel("Chat")
.where(__.in("participates")
.hasLabel("User")
.fold()) //how could I match this collection against my set?
这会是一个合适的方法吗?如何通过链接Messages
的时间戳来匹配集合和订单?感谢任何指针。
编辑这里是新的查询感谢丹尼尔的回答是:
边缘,顶点和属性标签在实际产品略有不同(Chat
是CONVERSATION
,timestamp
是CREATED_AT
,participates
是MEMBER_OF
)和部分自定义枚举。 vertex
数组包含应该成为对话一部分的所有用户顶点。
traversal().V(vertices[0].id())
.out(EdgeLabel.MEMBER_OF.name())
.hasLabel(VertexLabel.CONVERSATION.name())
.filter(__.in(EdgeLabel.MEMBER_OF.name())
.hasLabel(VertexLabel.USER.name())
.is(P.within(vertices)).count().is(vertices.length))
.order().by(__.out(EdgeLabel.CONTAINS.name())
.values(PropertyKey.CREATED_AT.name())
.order().by(Order.decr).limit(1), Order.decr)
非常感谢这个优雅的查询。我编写了各种测试用例,以确保它能够做到应有的功能。它仍然返回那些''聊天'顶点,也有参与者给定的用户,但不只是那些。就像A,B和C在聊天中一样,我要求只有A和B在聊天,我也会得到这三个人的聊天。你认为它与'.is(in(...))。count()。is(...)''的连接有关。请参阅我编辑的问题以获取当前(Java)查询。 –
你是说你想要完全匹配吗?例如。如果你要求A和B,那么A和B应该是这次聊天的唯一参与者? –
没错。我认为'.is(在(用户)内)'过滤了所有不属于对话的用户,这意味着后续的'.count()。(users.size())'将总是映射到'true'如果所有的用户都是聊天的一部分,不管是否有更多。你怎么看? –