Индексирование узлов в neo4j в python - PullRequest
2 голосов
/ 24 февраля 2012

Я строю базу данных с узлами тегов и узлами URL, а узлы URL связаны с узлами тегов. В этом случае, если тот же URL-адрес вставлен в базу данных, он должен быть связан с узлом тега, а не создавать повторяющиеся узлы URL-адреса. Я думаю, что индексация решит эту проблему. Как можно выполнить индексацию и обход с помощью neo4jrestclient? Ссылка на учебник будет в порядке. В настоящее время я использую versae neo4jrestclient .

Спасибо

Ответы [ 2 ]

5 голосов
/ 24 февраля 2012

neo4jrestclient поддерживает как индексацию, так и обход графика, но я думаю, что использование только индексации может быть полезным для вашего случая использования.Однако я не знаю, правильно ли я понял вашу проблему.В любом случае, что-то вроде этого может работать:

>>> from neo4jrestclient.client import GraphDatabase

>>> gdb = GraphDatabase("http://localhost:7474/db/data/")

>>> idx =  gdb.nodes.indexes.create("urltags")

>>> url_node = gdb.nodes.create(url="http://foo.bar", type="URL")

>>> tag_node = gdb.nodes.create(tag="foobar", type="TAG")

Мы добавляем свойство count в отношение, чтобы отслеживать количество URL "http://foo.bar", помеченных тегом foobar.

* 1008.*

И после этого мы индексируем узел url в соответствии со значением URL.

>>> idx["url"][url_node["url"]] = url_node

Затем, когда мне нужно создать новый узел URL, помеченный узлом TAG, мы сначала запрашиваемИндекс, чтобы проверить, если это еще не проиндексировано.В противном случае мы создаем узел и индексируем его.

>>> new_url = "http://foo.bar2"

>>> nodes = idx["url"][new_url]

>>> if len(nodes):
...     rel = nodes[0].relationships.all(types=[tag_node["tag"]])[0]
...     rel["count"] += 1
... else:
...     new_url_node = gdb.nodes.create(url=new_url, type="URL")
...     new_url_node.relationships.create(tag_node["tag"], tag_node, count=1)
...     idx["url"][new_url_node["url"]] = new_url_node
3 голосов
/ 20 декабря 2012

Важной концепцией является то, что индексы представляют собой триплеты ключ / значение / объект , где объект является либо узлом, либо отношением, которое вы хотите проиндексировать.

Шаги по созданию и использованиюindex:

Создание экземпляра остального клиента базы данных графа.

from neo4jrestclient.client import GraphDatabase
gdb = GraphDatabase("http://localhost:7474/db/data/")

Создание индекса узла или отношения (Создание индекса узла здесь)

index = gdb.nodes.indexes.create('latin_genre')

Добавитьузлы для индекса

nelly = gdb.nodes.create(name='Nelly Furtado')
shakira = gdb.nodes.create(name='Shakira')

index['latin_genre'][nelly.get('name')] = nelly
index['latin_genre'][shakira.get('name')] = shakira

Извлечение узлов на основе индекса и дальнейшая обработка:

for artist in index['latin_genre']['Shakira']:

  print artist.get('name')

Более подробную информацию можно найти в примечаниях в webadmin

Neo4j имеет два типа индексов: индексы узлов и отношений.С помощью индексов узлов вы индексируете и находите узлы, а с индексами отношений вы делаете то же самое для отношений.

У каждого индекса есть поставщик, который является базовой реализацией, обрабатывающей этот индекс.Поставщик по умолчанию - lucene, но вы можете создать свой собственный индекс, если хотите.

Индексы Neo4j принимают триплеты ключ / значение / объект («объект» - это узел или отношение), он будет индексировать ключ/ значение, и связать это с предоставленным объектом.После того как вы проиндексировали набор триплетов ключ / значение / объект, вы можете запросить индекс и получить объекты, которые были проиндексированы с помощью пар ключ / значение, соответствующих вашему запросу.

Например, если у вас есть «Пользователь»узлы в вашей базе данных, и если вы хотите быстро найти их по имени пользователя или электронной почте, вы можете создать индекс узла с именем «Users» и для каждого индекса пользователя имя пользователя и адрес электронной почты.В конфигурации lucene по умолчанию вы можете выполнить поиск в индексе «Users» с помощью запроса: «username: bob ИЛИ email: bob@gmail.com».

Вы можете использовать браузер данных для запроса ваших индексовтаким образом, синтаксис для вышеупомянутого запроса будет "узел: индекс: пользователи: имя пользователя: bob ИЛИ электронная почта: bob@gmail.com".

...