Луковицы: как проверить, соединены ли две вершины ребром в Титане

Я использую TitanGraphDB + Cassandra. Я запускаю Titan следующим образом.

cd titan-cassandra-0.3.1
bin/titan.sh config/titan-server-rexster.xml config/titan-server-cassandra.properties

У меня есть оболочка Rexster, которую я могу использовать для связи с Titan+Cassandra, описанной выше.

cd rexster-console-2.3.0
bin/rexster-console.sh

Я пытаюсь смоделировать топологию сети с помощью базы данных Titan Graph. Я хочу запрограммировать базу данных Titan Graph из моей программы на Python. Для этого я использую пакет bulbs. Я создаю три типа вершин

 - switch
 - port 
 - device

Я создаю помеченные ребра между портами, которые физически соединены. Я использую метку «ссылка».

Допустим, у меня есть две вершины порта portA и portB.

Я хочу написать функцию, как показано ниже

def is_connected(portA, portB):
     ...
     ... 
     ...

Как узнать, «соединены ли две вершины помеченным ребром»?

У меня есть две вершины графа

src_sw_other_ports
<Vertex: http://localhost:8182/graphs/graph/vertices/48>

dst_sw_other_ports
<Vertex: http://localhost:8182/graphs/graph/vertices/72>

я пытался

link_exists = src_sw_other_ports.out.retain([dst_sw_other_ports]).hasNext()

Это дает мне следующую ошибку.

  File "/home/karthik/Projects/ryu/ryu/app/simple_switch.py", line 238, in compute_path
    link_exists = src_sw_other_ports.out.retain([dst_sw_other_ports]).hasNext()
  File "/usr/local/lib/python2.7/dist-packages/bulbs/element.py", line 209, in __getattr__
    raise AttributeError(name)
AttributeError: out

person liv2hak    schedule 08.07.2014    source источник
comment
gremlindocs.com — приятный сайт с множеством инструкций и рецептов гремлинов. Например: gremlindocs.com/#recipes/finding-edges-between-vertices   -  person Bob B    schedule 08.07.2014


Ответы (2)


def is_connected(portA, portB):
    return portA.both("link").retain([portB]).hasNext()

См. http://gremlindocs.com/#recipes/finding-edges-between-vertices< /а>

NB: я использовал ваше определение функции в приведенном выше коде; однако ваше определение функции использует синтаксис Python, а не Groovy, поэтому приведенный выше пример будет работать, только если вы вызываете код Gremlin из Jython.

Определение Gremlin-Groovy будет таким:

def isConnected (portA, portB) {
     return portA.both("link").retain([portB]).hasNext()
}
person espeed    schedule 08.07.2014
comment
может ли count() возвращать любое положительное число или ноль или просто «0» или «1»? - person liv2hak; 08.07.2014
comment
count() может возвращать 0 или любое положительное число (любое положительное число равно true); однако я обновил ответ, чтобы использовать retain() и hasNext(), поэтому count() больше не имеет отношения к этому ответу. - person espeed; 08.07.2014
comment
Я использую код Gremlin из Python? Вы имели в виду Jython или это опечатка? - person liv2hak; 09.07.2014
comment
Кажется, можно использовать гремлина, как указано в ссылке выше. Мне нужно создать TinkerGraph() из моего кода Python. В настоящее время я создаю Graph()? Будет ли это работать, если я захочу использовать запросы гремлина? - person liv2hak; 09.07.2014
comment
Я получил эту ошибку, когда попробовал указанный выше код. Файл /home/karthik/Projects/ryu/ryu/app/simple_switch.py, строка 160, в is_connected return portA.both(link).retain([portB]).hasNext( ) Файл /usr/local/lib/python2.7/dist-packages/bulbs/element.py, строка 209, в getattr поднять AttributeError(name) AttributeError: оба - person liv2hak; 09.07.2014

Ответ Эспида хорош. Вот еще вариант:

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> v1 = g.v(1)
==>v[1]
gremlin> v3 = g.v(3)
==>v[3]
gremlin> v6 = g.v(6)
==>v[6]
gremlin> v1.out.retain([v3]).hasNext()
==>true
gremlin> v1.out.retain([v6]).hasNext()
==>false

Немного лучше, чем использовать count, как будто вы просто хотите «существовать» ребро, вам не нужно для этого повторять весь канал.

person stephen mallette    schedule 08.07.2014
comment
Из моего кода на Python я делаю следующее из bulbs.titan import Graph g = Graph() Будет ли вышеописанное работать с этим или мне следует использовать createTinkerGraph()? - person liv2hak; 09.07.2014
comment
Я использовал createTinkerGraph() только для создания пробных данных, чтобы продемонстрировать использование retain. Очевидно, вы должны использовать собственное состояние g, определенное в Rexster. - person stephen mallette; 09.07.2014
comment
Я попробовал то, что вы предложили, но я получаю некоторую ошибку. Я обновил вопрос с подробностями. Благодарю. - person liv2hak; 09.07.2014
comment
Я понимаю, что вы используете Bulbs, но чтобы правильно использовать этот инструмент, вам нужно понимать Gremlin и его корни в Groovy. Прямо сейчас кажется, что вы пытаетесь смешать мой рабочий Groovy с материалом Python/Bulbs... это не сработает. espeed может поправить меня, если я ошибаюсь, но я думаю, вам нужно написать свою функцию в виде отличного скрипта, который затем вы можете выполнить как функцию в лампочках. bulbflow.com/api/bulbs/gremlin - person stephen mallette; 09.07.2014
comment
Я опубликовал еще один вопрос о том, как вызвать скрипт гремлина. " title="вызов скрипта гремлина из программы Python, использующей лампочки"> stackoverflow.com/questions/24769857/ - person liv2hak; 16.07.2014