由id访问的py2neo节点返回与索引访问的节点不同的对象

时间:2014-03-26 14:27:33

标签: py2neo neo4j

我使用py2neo 1.6.4和neo4j 2.0.1,我发现了一些访问索引节点的奇怪之处。特别是,索引访问的索引节点不会返回与id访问的节点相同的对象。

例如:

>>> graph_db.get_or_create_indexed_node('index','key',1)
Node('http://localhost:7474/db/data/node/1')
>>> graph_db.get_indexed_node('index','key',1)
Node('http://localhost:7474/db/data/node/1')   #get works fine after create
>>> graph_db.get_indexed_node('index','key',1).exists
True                                 #the node exists in the db
>>> graph_db.get_indexed_node('index','key',1)._id
1                                    #the id for the node
>>> graph_db.node(1)
Node('http://localhost:7474/db/node/ #note that this is different than the query on the index
>>> graph_db.node(1).exists
False                                #node does not exist in db when accessed by id

因此,当由id访问时返回的节点实际上并不存在于数据库中,即使返回的id正是分配给索引节点的id。

我对neo4j和py2neo都相当新,并且对索引没有非常复杂的理解,所以如果有一个答案可以帮助教育我和其他会很棒的答案,如果这代表了一个错误,那么很高兴知道:)

谢谢!

1 个答案:

答案 0 :(得分:2)

我并不完全熟悉py2neo如何确定数据库中是否存在节点,但您可能想尝试使用Neo4j 2.0.0中引入的新索引。您在这里使用的索引是遗留索引,需要您手动保持它们是最新的,并且有关它们的操作有几个警告。新索引会自动保持最新,并作为查询的优化工作,与索引在关系数据库中的工作方式相同。

我不确定py2neo是如何直接公开这些索引的,但你可以通过py2neos cypher API访问它们。在对抗neo4j服务器时使用密码查询语言通常是一个更好的主意,因为它允许您在数据库中发送更大的域工作块,而不是一次从一个http调用中提取数据并执行在客户端工作。

例如:

from py2neo import cypher

session = cypher.Session("http://localhost:7474")
tx = session.create_transaction()

# Create an index
tx.append("CREATE INDEX ON :User(name)")
tx.commit()

# Query that will use the index for lookup
tx = session.create_transaction()
tx.append("MATCH (n:User) WHERE n.name='Cat Stevens' RETURN n")
results = tx.execute()