如何比较TinkerPop中的相等顶点集?

时间:2017-08-02 14:27:27

标签: java gremlin tinkerpop3

给定一组User个顶点,我需要找到与这些顶点连接的所有Chat个顶点,但没有其他顶点。例如,只有 Alice Bob 参与的所有聊天。查询应该对结果进行排序,以便首先返回连接到最新消息的聊天。

Query Example

在我最初的尝试中,我尝试从其中一个用户开始,访问他/她参与的所有聊天,并过滤它们,以便只保留那些只有所有其他用户作为参与者的聊天。

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的时间戳匹配集和顺序?谢谢你的任何指示。

编辑感谢丹尼尔的回答以下是新查询:

实际产品中的边缘,顶点和属性标签略有不同(ChatCONVERSATIONtimestampCREATED_ATparticipates为{{ 1}})和部分自定义枚举。 MEMBER_OF数组包含应该成为会话一部分的所有用户顶点。

vertex

1 个答案:

答案 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参与聊天A,B和C.
  • Bob参与聊天B和C.
  • Caesar只参加聊天C.

因此,如果我们现在通过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边缘的一部分,那将会更容易和更快。