java - 如何在 TinkerPop 中比较顶点集是否相等?

标签 java gremlin tinkerpop3

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

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?

这是一个合适的方法吗?如何根据链接消息的时间戳来匹配集合和顺序?感谢您的指点。

编辑由于 Daniel 的回答,这是新查询:

边、顶点和属性标签与实际产品略有不同(ChatCONVERSATIONtimestampCREATED_AT参与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)

最佳答案

让我们从示例图表开始:

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 边的一部分,会更容易、更快一些。

关于java - 如何在 TinkerPop 中比较顶点集是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45463633/

相关文章:

gremlin - 为什么叶子节点的深度是垃圾值而不是1?

javascript - 如何在 Selenium 中禁用文本框

java - 如何使用多线程创建 gremlin 边

python - 如何将gremlin服务器与orientDB连接

titan - 如何使用 Gremlin/Titan/TinkerPop3 更新特定的边属性?

stack-trace - TinkerPop 3.1.0 控制台 - 显示堆栈跟踪?

java - 从头开始创建模式对话框

java - 如何调试从 Java 调用的 JavaScript 代码(通过 JSR-223)?

Java 和 MySQL PreparedStatement : storing 5000 numbers in a table. 什么是正确的方法?

c# - Graph Cosmos DB 上的交易