Составление ответов на запрос обхода Гремлина - PullRequest
1 голос
/ 18 октября 2019

У меня есть следующая структура графика:

Вершины - Кампания, Проект, Ведущий

{"Name":["CompanyV"],"sid":["SidFromSQL"]}
{"name":["Campaign3V"],"status":["paused"]}
{"name":["Campaign1"],"startDate":["Jan 1, 2019 5:30:00 AM"]}
{"name":["Campaign2V"],"status":["active"]}
{"name":["Lead11V"]}
{"name":["Lead2V"]}
{"name":["Project1V"],"Name":[""],"sid":["SidFromSQL"]}
{"name":["Project2V"],"Name":[""],"sid":["SidFromSQL"]}
{"name":["Lead3V"]}
{"name":["Campaign1V"],"status":["active"]}

Края:

{"inVertex":{"id":"58b6e79f-6809-6fc4-9f0a-c8a26337a729","label":"Campaign"},"outVertex":{"id":"1cb6e79d-1ca7-4d3c-e71d-c05c13abac15","label":"Project"},"id":"a6b6e79f-6809-87bf-a535-eec9101e683c","label":"hasCampaign"}
{"inVertex":{"id":"c4b6e7ae-64d3-b8b9-ce7b-c319e7ed70ca","label":"Lead"},"outVertex":{"id":"1cb6e79d-1ca7-4d3c-e71d-c05c13abac15","label":"Project"},"id":"6cb6e7ae-64d4-6fb0-9314-411eb72d9a28","label":"hasLead"}
{"inVertex":{"id":"a2b6e79d-1ca7-db4e-f19f-2ef1df514ade","label":"Project"},"outVertex":{"id":"64b6e79c-d58b-37ad-6c3e-63a783e6df97","label":"Company"},"id":"4eb6e7a8-451f-4365-1d79-d5d118b5ff56","label":"hasProject"}
{"inVertex":{"id":"c4b6e7ae-64d3-b8b9-ce7b-c319e7ed70ca","label":"Lead"},"outVertex":{"id":"58b6e79f-6809-6fc4-9f0a-c8a26337a729","label":"Campaign"},"id":"96b6e7ae-64d4-b918-353d-fccc13cbd9bb","label":"hasLead"}
{"inVertex":{"id":"94b6e79f-69b9-ccfe-d9e6-a41c4be59979","label":"Campaign"},"outVertex":{"id":"a2b6e79d-1ca7-db4e-f19f-2ef1df514ade","label":"Project"},"id":"34b6e79f-69b9-bd15-9331-0551c464f222","label":"hasCampaign"}
{"inVertex":{"id":"36b6e7b2-3d78-3229-9ebd-05c2c5f5927b","label":"Lead"},"outVertex":{"id":"1cb6e79d-1ca7-4d3c-e71d-c05c13abac15","label":"Project"},"id":"c2b6e7b2-3d78-16d0-ee95-46b66108236e","label":"hasLead"}
{"inVertex":{"id":"36b6e7b2-3d78-3229-9ebd-05c2c5f5927b","label":"Lead"},"outVertex":{"id":"58b6e79f-6809-6fc4-9f0a-c8a26337a729","label":"Campaign"},"id":"04b6e7b2-3d79-3d95-855e-a206d38b8603","label":"hasLead"}
{"inVertex":{"id":"1cb6e79d-1ca7-4d3c-e71d-c05c13abac15","label":"Project"},"outVertex":{"id":"64b6e79c-d58b-37ad-6c3e-63a783e6df97","label":"Company"},"id":"ccb6e7a8-449b-d92c-1330-4f6288ab0852","label":"hasProject"}
{"inVertex":{"id":"7eb6e7dc-94f9-ca83-df4c-87284897151f","label":"Lead"},"outVertex":{"id":"1cb6e79d-1ca7-4d3c-e71d-c05c13abac15","label":"Project"},"id":"d2b6e7dc-94fb-8219-30a2-d304ccaed75d","label":"hasLead"}
{"inVertex":{"id":"d0b6e79f-692a-8c03-112e-9388e54b1f9d","label":"Campaign"},"outVertex":{"id":"1cb6e79d-1ca7-4d3c-e71d-c05c13abac15","label":"Project"},"id":"3cb6e79f-692b-4cad-48ac-1e4991e75b60","label":"hasCampaign"}

Я выполняю следующий запросчтобы получить Лиды, связанные с Проектом и конкретной кампанией.

        GraphTraversal t =g.V("1cb6e79d-1ca7-4d3c-e71d-c05c13abac15").out("hasLead")
                .where(in("hasLead").has("Campaign","name","Campaign1V"));

Это возвращает информацию о Лидах в выводе, я хотел знать, есть ли способ, которым я могу получить конкретныйИнформация о кампании, а также информация об идентификаторе в выходном ответе (с использованием одного оператора обхода), чтобы компонент UI мог использовать его для визуализации в HTML.

1 Ответ

0 голосов
/ 18 октября 2019

Вам просто нужно преобразовать свой результат в форму, которую вы хотите. В этом случае вы можете использовать что-то вроде project()

g.V("1cb6e79d-1ca7-4d3c-e71d-c05c13abac15").out("hasLead").
  where(__.in("hasLead").has("Campaign","name","Campaign1V")).
  project('lead','campaign').
    by().
    by(__.in("hasLead").has("Campaign","name","Campaign1V").fold())

Возможно, вы захотите включить что-то в этот первый by() модулятор для дальнейшего преобразования вершины в нужные вам свойства, и вы можете захотеть сделатьто же самое для второго. Кроме того, fold() необходим только в том случае, если у вас есть более одной кампании на лидерство.

Итак, вышеприведенное работает хорошо и легко следовать, но оно дважды пересекает одни и те же ребра hasLead. Вы можете избежать этого, но это добавляет немного неправильности в удобочитаемости, с которой вы должны решить, можете ли вы жить:

g.V("1cb6e79d-1ca7-4d3c-e71d-c05c13abac15").out("hasLead").
  project('lead','campaign').
    by().
    by(__.in("hasLead").has("Campaign","name","Campaign1V").fold()).
  filter(select('campaign').unfold())

Теперь вы проецируете все "отведения", но отфильтровываете все, которые имеютпустой список для «кампании».

...