2

我正在构建一个带有标签节点和 url 节点的数据库,并且 url 节点连接到标签节点。在这种情况下,如果将相同的 url 插入到数据库中,它应该链接到标记节点,而不是创建重复的 url 节点。我认为索引可以解决这个问题。如何使用 neo4jrestclient 进行索引和遍历?链接到教程就可以了。我目前正在使用versae neo4jrestclient

谢谢

4

2 回答 2

5

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到关系中以跟踪"http://foo.bar"使用 tag 标记的 URL 的数量foobar

>>> url_node.relationships.create(tag_node["tag"], tag_node, count=1)

之后,我们根据 URL 的值索引 url 节点。

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

然后,当我需要创建一个用 TAG 节点标记的新 URL 节点时,我们首先查询索引以检查它是否已编入索引。否则,我们创建节点并为其编制索引。

>>> 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
于 2012-02-24T17:24:43.573 回答
3

一个重要的概念是索引是键/值/对象三元组,其中对象是要索引的节点或关系。

创建和使用索引的步骤:

创建图形数据库 rest 客户端的实例。

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 索引采用键/值/对象三元组(“对象”是一个节点或关系),它将索引键/值对,并将其与提供的对象相关联。在为一组键/值/对象三元组建立索引后,您可以查询索引并获取使用与您的查询匹配的键/值对索引的对象。

例如,如果您的数据库中有“用户”节点,并希望通过用户名或电子邮件快速找到它们,您可以创建一个名为“用户”的节点索引,并为每个用户索引用户名和电子邮件。使用默认的 lucene 配置,您可以使用如下查询搜索“用户”索引:“用户名:bob 或电子邮件:bob@gmail.com”。

您可以使用数据浏览器以这种方式查询您的索引,上述查询的语法是“node:index:Users:username:bob OR email:bob@gmail.com”。

于 2012-12-20T19:58:57.510 回答