Создайте запрос подграфа в Gremlin вокруг одного узла с исходящими и входящими ребрами - PullRequest
0 голосов
/ 31 марта 2020

У меня есть большая база данных Janusgraph, и я хотел бы создать подграф, сосредоточенный вокруг одного типа узла и включающий входящие и исходящие узлы определенных c типов.

В Cypher запрос будет выглядеть следующим образом:

MATCH (a:Journal)N-[:PublishedIn]-(b:Paper{paperTitle:'My Paper Title'})<-[:AuthorOf]-(c:Author) 
RETURN a,b,c

Это то, что я пробовал в Gremlin:

sg = g.V().outE('PublishedIn').subgraph('j_p_a').has('Paper','paperTitle', 'My Paper Title')
     .inE('AuthorOf').subgraph('j_p_a')
     .cap('j_p_a').next()

Но я получаю синтаксическую ошибку. «AuthorOf» и «Опубликовано в» - не единственные типы ребер, заканчивающиеся на узлах «Бумага».

Может кто-нибудь показать мне, как правильно выполнить этот запрос в Gremlin?

1 Ответ

2 голосов
/ 01 апреля 2020

Как написано в вашем запросе, шаг outE возвращает ребра, а шаг has проверяет свойства этих ребер, после чего обработчик запросов будет ожидать inV, а не inE. Без вашей модели данных трудно точно знать, что вам нужно, однако, глядя на Cypher, я думаю, что это то, что вы хотите.

sg = g.V().outE('PublishedIn').
           subgraph('j_p_a').
           inV().
           has('Paper','paperTitle', 'My Paper Title').
           inE('AuthorOf').
           subgraph('j_p_a')
           cap('j_p_a').
           next()

Отредактировано, чтобы добавить:

Поскольку у меня нет ваших данных, я использовал свой график воздушных маршрутов. Я смоделировал этот запрос на вашем и использовал несколько шагов select, чтобы ограничить размер обрабатываемых данных. Кажется, это работает в моем тестировании. Надеюсь, вы сможете увидеть сделанные мной изменения и попробовать их в своем запросе.

sg = g.V().outE('route').as('a').
      inV().
      has('code','AUS').as('b').
      select('a').
      subgraph('sg').
      select('b').
      inE('contains').
      subgraph('sg').
      cap('sg').
      next()  
...