Лампы: g.vertices.index.lookup(dpi=dpid_str) не работает должным образом

Я использую 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 из моей программы на Python. Для этого я использую пакет лампочек.

Я создаю 3 типа вершин из Python, используя лампочки, как показано ниже. 3 типа вершин

- switch
- port
- device

from bulbs.titan import Graph
 vswitch = self.g.vertices.get_or_create('dpid',dpid_str,{'state':'active','dpid':dpid_str,'type':'switch'})
 vport   = self.g.vertices.get_or_create('port_id',port_id,{'desc':desc,'port_id':port_id,'state':state,'port_state':port_state,'number':number,'type':'port'})

Если я попытаюсь распечатать переменные vswitch, vport и vdevice, я получу следующие результаты.

vswitch     <Vertex: http://localhost:8182/graphs/graph/vertices/4>
vport       <Vertex: http://localhost:8182/graphs/graph/vertices/28>

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

vswitch = self.g.vertices.index.lookup(dpid=dpid_str)
vport   = self.g.vertices.index.lookup(port_id=port_id_str)

И попробуйте распечатать переменные vswitch и vport, я получаю следующие значения

<generator object <genexpr> at 0x26d6370>)
<generator object <genexpr> at 0x26d63c0>

Я делаю что-то НЕПРАВИЛЬНОЕ, пытаясь получить вершины, как указано выше, используя g.vertices.index.lookup(dpid=dpid_str)


person liv2hak    schedule 16.06.2014    source источник


Ответы (1)


Метод Bulbs g.vertices.index.lookup() возвращает генератор Python (который является типом iterator).

Используйте next(), чтобы получить следующее значение в генераторе:

>>> # lookup() returns an generator (can return more than 1 value)

>>> switches = self.g.vertices.index.lookup(dpid=dpid_str)
>>> switch = switches.next()

>>> ports   = self.g.vertices.index.lookup(port_id=port_id_str)
>>> port = ports.next()

Или вы можете использовать list(), чтобы превратить generator в Python list:

>>> switches = self.g.vertices.index.lookup(dpid=dpid_str)
>>> list(switches)

>>> ports   = self.g.vertices.index.lookup(port_id=port_id_str)
>>> list(ports)

Однако, если проиндексированный элемент уникален, вы можете использовать метод get_unique() для возврата одного значения или None:

# returns 1 vertex or None (errors if more than 1)
>>> vertex = g.vertices.index.get_unique( "dpid", dpid_str) 

Видеть...

Документация индекса Rexter:

index.lookup() https://github.com/espeed/bulbs/blob/afa28ccbacd2fb92e0039800090b8aa8bf2c6813/bulbs/titan/index.py#L251

index.get_unique() https://github.com/espeed/bulbs/blob/afa28ccbacd2fb92e0039800090b8aa8bf2c6813/bulbs/titan/index.py#L274

ПРИМЕЧАНИЕ. Итераторы и генераторы — это основы программирования на Python. Они используются повсеместно и не относятся только к Bulb. Если вы новичок в программировании на Python, см. мой ответ на Как научиться программировать на Python? список хороших онлайн-ресурсов для обучения программированию на Python.

person espeed    schedule 17.06.2014