Исключить вершины на основе ребер

#gremlin #amazon-neptune

Вопрос:

У меня есть традиционный график социальных сетей, где пользователь делает сообщение, другие пользователи комментируют это сообщение, и пользователи могут блокировать других пользователей. Я пытаюсь создать обход, исключающий комментарии, в которых пользователь, комментирующий, имеет block преимущество перед пользователем публикации (пользователь публикации заблокировал пользователя, комментирующего, исключите их комментарии).

 g.addV("user").as("poster") .addV("post") .addV("user").as("commenter") .addV("comment") .addE("post").from("poster").to("post") .addE("comment").from("commenter").to("comment") .addE("comment").from("comment").to("post") .addE("block").from("poster").to("commenter")  

Это все, что я получил, но не компилируется:

 g.V() .hasLabel("comment") .as("comment") .not(  __.in_("comment")  .as("commenter")  .select("comment")  .where(  __.out("comment")  .in_("post")  .out("block")  .hasId(__.select("commentOwner").id()) // the poster is blocking the commenter  ) )  

Это не работает, но это общая идея. Исключите комментарии, в которых владелец поста блокирует комментатора. Как я могу построить этот обход?

Ответ №1:

Я изменил ваш набор данных, чтобы у вас было 2 комментария к сообщению. 1 от заблокированного пользователя и 1 от разрешенного пользователя.

(Также изменены метки, чтобы более четко представлять действие в краевых метках)

 g.addV("user").as("poster")  .addV("post").as("post")  .addV("user").as("commenter")  .addV("user").property("name","user1").as("commenter1") # USERS   .addV("comment").property("value", "commented by first user").as("comment")  .addV("comment").property("value", "commented by second user").as("comment1") # COMMENTS   .addE("posted").from("poster").to("post")    .addE("commentedBy").from("commenter").to("comment")   .addE("commentedBy").from("commenter1").to("comment1")    .addE("commentedOn").from("comment").to("post")  .addE("commentedOn").from("comment1").to("post")   .addE("block").from("poster").to("commenter")  

Тогда этот приведенный ниже запрос должен сделать свое дело:

 g.V().  hasLabel("user").as("poster").  out("posted").  in("commentedOn").as("comments").  not(in("commentedBy").in("block").where(eq("poster"))).  valueMap()  

( Он предоставляет все комментарии к сообщению пользователя от комментаторов, которые не заблокировали пользователя.)