頂点の集合がUser
の場合、それらに接続されている頂点はすべて見つけ出す必要がありますが、それ以外の頂点はありません。たとえば、すべてのチャットがアリスとボブに参加します。クエリは、最新のメッセージに接続されたチャットが最初に返されるように結果を並べる必要があります。参加者とまったく他のすべてのユーザーを持っている私は、それらのチャットが残るように、ユーザの一人から始め、彼/彼女はに参加し、すべてのチャットを訪問し、それらをフィルタリングしようとした私の最初の試みで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
がtimestamp
がCREATED_AT
で、CONVERSATION
で、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だけのチャットを求めているように、私も3つともチャットを取得します。 '.is(within(...))。count()。is(...)'の連結と関係があると思いますか?現在の(Java)クエリについては、私の編集した質問をご覧ください。 –
あなたは完全一致したいと言っていますか?例えば。あなたがAとBを求めているなら、AとBはこのチャットの唯一の参加者であるべきですか? –
そうです。 '.is(within users) 'は、会話の一部ではないすべてのユーザをフィルタリングします。つまり、' .count()。(users.size()) 'は常に' true'にマップされます。すべてのユーザーがチャットに参加していれば、それ以上のチャットがあっても関係ありません。どう思いますか? –