Метки, вершины и ребра TitanDB
Вопрос
У меня есть следующая информация в базе данных Titan Graph.Я пытаюсь разобраться в информации, отправляя запросы через оболочку gremlin.База данных Graph, которую я пытаюсь исследовать, моделирует сеть.Существует два типа вершин
- `Switch`
- `Port`
Я пытаюсь выяснить взаимосвязь между этими двумя типами вершин.
g = TitanFactory.open("/tmp/cassandra.titan")
Чтобы просмотреть список вершин каждого типа
$ g.V('type', 'switch')
==>v[228]
==>v[108]
==>v[124]
==>v[92]
==>v[156]
==>v[140]
$ g.V('type', 'port')
==>v[160]
==>v[120152]
==>v[164]
==>v[120156]
==>v[560104]
==>v[680020]
==>v[680040]
==>v[112]
==>v[120164]
==>v[560112]
==>v[680012]
==>v[680004]
==>v[144]
==>v[680032]
==>v[236]
==>v[100]
==>v[560128]
==>v[128]
==>v[680028]
==>v[232]
==>v[96]
Чтобы найти связь между коммутатором и портом.
g.v(108).out
==>v[560104]
==>v[680004]
==>v[112]
Что это за "выход"?Насколько я понимаю, есть стрелка наружу, указывающая от переключателя, представленного вершиной 108
к портам , представленным вершинами 560104
680004
и 112
Что это in
и out
?Это что-то очень специфичное для графических баз данных?Также, что такое метка в базе данных graph?Являются in
и out
ярлыки?
Решение
Использование in
и out
описывает направление ребра, идущего от одной вершины к другой.В вашем случае у вас есть это:
switch --> port
Когда ты пишешь:
g.v(108).out
вы говорите Гремлину, чтобы он нашел вершину в 108
, затем пройдитесь по ребрам , которые указывают out
или подальше от него.Вы также можете подумать о out
как начинающаяся от хвоста стрелка и идущая к голове.Учитывая вашу схему, они ведут к "портам".
Аналогично, in
просто означает, что Гремлин должен ходить по краям, которые указывают in
к вершине.Вы также можете подумать о in
как начинающий от головки стрелки и идущий к хвосту.Учитывая вашу схему, коммутаторы не будут иметь in
ребра и, следовательно, всегда не будут возвращать результатов.Однако, если бы вы начали с вершины "порта" и пересекли in
:
g.v(560104).in
ты бы , по крайней мере , вернулся обратно . 108
поскольку вершина "560104" имеет по крайней мере одно ребро со стрелкой, указывающей на него (учитывая то, что я знаю о ваших образцовых данных).
К настоящему времени вы уже поняли, что in
и out
это "указания", а не "ярлыки".Ярлык имеет другое назначение;он классифицирует ребро.Например, у вас может быть следующая схема:
switch --connectsTo--> port
company --manufactures--> switch
switch --locatedIn--> rack
Другими словами, у вас может быть три метки ребер, представляющие различные способы связи "переключателя" с другими частями вашей схемы.Таким образом, ваши запросы могут быть более наглядными относительно того, что вы хотите.Учитывая ваш предыдущий пример и эту пересмотренную схему, вам нужно было бы написать следующее, чтобы получить тот же результат, который вы показывали изначально:
g.v(108).out("connectsTo")
==>v[560104]
==>v[680004]
==>v[112]
Графические базы данных обычно используют преимущества этих меток для повышения производительности запросов.