【发布时间】:2017-08-02 14:27:27
【问题描述】:
给定一组User 顶点,我需要找到与这些顶点相连的所有Chat 顶点,但没有其他顶点。例如,只有 Alice 和 Bob 参与的所有聊天。查询应该对结果进行排序,以便首先返回与最新消息相关的聊天。
在我最初的尝试中,我尝试从其中一个用户开始,访问他/她参与的所有聊天,并对其进行过滤,以便只保留那些完全由所有其他用户作为参与者的聊天。
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)
【问题讨论】:
标签: java gremlin tinkerpop3