py2neo set_labels不使用get_or_create_indexed_node

时间:2014-10-05 13:46:57

标签: neo4j py2neo

为什么batch.set_labels()适用于batch.create(),但不适用于batch.get_or_create_indexed_node()

这样可行,节点按预期创建。

batch = neo4j.WriteBatch(neo4j_graph)
a = batch.create(node({'name': 'a'}))
batch.set_labels(a, 'Person')
batch.submit()

这不起作用,没有创建节点。

graph_db.get_or_create_index(neo4j.Node, 'node_index')
batch = neo4j.WriteBatch(neo4j_graph)
b = batch.get_or_create_indexed_node(NEO4J_NODE_INDEX, 'name',
    'b',
    {'name': 'b'}
)
batch.set_labels(b, 'Person')
batch.submit()

1 个答案:

答案 0 :(得分:0)

这是批处理端点和其他资源通过REST接口工作的方式的限制,并且需要熟悉REST API才能完全理解。

批处理端点将多个HTTP请求捆绑到一次调用中,该调用在单个事务中执行。从这些请求返回的值之一是location URI,在某些情况下,这可以传递到其他请求中。例如,可能想要创建两个节点,然后创建连接它们的关系。这可以通过使用诸如{0}{1}之类的指针来引用先前创建的节点作为新关系的端点来实现。有关此表示法的更多详细信息,请参阅here

使用旧版索引调用时遇到了困难。当node is created通过旧索引时,返回的location URI是索引入口点的URI,而不是新创建的节点。这不能用作参考(例如在上面的set_labels调用中),因此不会发生预期的行为。

不幸的是,没有直接的解决方法。您可以转到Cypher,但无法在那里写入旧索引。也许您可以为此查看模式索引?