给定一组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
为{{ 1}})和部分自定义枚举。 MEMBER_OF
数组包含应该成为会话一部分的所有用户顶点。
vertex
答案 0 :(得分:4)
让我们从示例图开始:
g = TinkerGraph.open().traversal()
g.addV("user").property("name", "alice").as("a").
addV("user").property("name", "bob").as("b").
addV("user").property("name", "caesar").as("c").
addV("chat").property("name", "A").as("A").
addV("chat").property("name", "B").as("B").
addV("chat").property("name", "C").as("C").
addV("message").property("timestamp", 1).property("text", "Sed mollis velit.").as("m1").
addV("message").property("timestamp", 2).property("text", "Aenean aliquet dapibus.").as("m2").
addV("message").property("timestamp", 3).property("text", "Nunc vel dignissim.").as("m3").
addV("message").property("timestamp", 4).property("text", "Aliquam in auctor.").as("m4").
addV("message").property("timestamp", 5).property("text", "Nulla dignissim et.").as("m5").
addV("message").property("timestamp", 6).property("text", "Pellentesque semper dignissim.").as("m6").
addE("participates").from("a").to("A").
addE("participates").from("a").to("B").
addE("participates").from("a").to("C").
addE("participates").from("b").to("B").
addE("participates").from("b").to("C").
addE("participates").from("c").to("C").
addE("contains").from("A").to("m1").
addE("contains").from("A").to("m2").
addE("contains").from("B").to("m3").
addE("contains").from("B").to("m4").
addE("contains").from("C").to("m5").
addE("contains").from("C").to("m6").iterate()
因此,如果我们现在通过Alice和Bob之间的对话寻找聊天,我们应该只找到聊天B.确实如此:
gremlin> g.V(users.head()).
out("participates").
not(__.in("participates").is(without(users))).
filter(__.in("participates").is(within(users)).count().is(users.size())).
order().by(out("contains").values("timestamp").order().by(decr).limit(1), decr).
valueMap()
==>[name:[B]]
如果时间戳是contains
边缘的一部分,那将会更容易和更快。