nowadaya我正在学习neo4j的新traverse api,我按照下面的链接
http://neo4j.com/docs/stable/tutorial-traversal-java-api.html
所以现在我知道如何使用唯一性,评估者等。 那就是我知道如何改变api的行为。
但我想知道的是它究竟是如何遍历的。
例如我试图找到一个节点的邻居。
neo4j使用索引来找到这个吗? neo4j是否保留哈希以找到邻居?
更具体地说,例如,当我编写以下代码时。
TraversalDescription desc = database.traversalDescription().breadthFirst().evaluator( Evaluators.toDepth( 3) );
node =database.getNodeById(4601410);
Traverser traverser = desc.traverse(node);
在我的描述中,我使用了breadthFirst。所以这意味着当我给节点遍历时,代码应该找到第一个邻居。那么api如何找到第一个邻居就是我想知道的事情。是否有指向节点中邻居的指针?因此,当我说遍历到深度3时,它会找到第一个邻居,然后将邻居作为递归函数中的节点,依此类推?所以,如果我们说深度10那么它可能会很慢?
所以我想要的是如何改变api的自然行为来进行遍历?
答案 0 :(得分:2)
Simplified,Neo4j存储代表节点和关系a.s.o的记录。在它的商店里。每个节点都由磁盘上的节点记录表示,该记录包含第一个关系的指针(直接偏移到关系存储中)(如果愿意,则为邻居)。关系记录相互链接,因此获取节点的所有邻居将读取节点记录,其关系指向该关系记录,并继续跟踪这些前向指针,直到该链的末尾。这会回答你的问题吗?
答案 1 :(得分:1)
TraversalDescription具有PathExpander的概念 - 这是决定将用于下一步的关系的组件。请使用TraversalDescription.expand()。
您可以使用自己的PathExpander实现,也可以使用PathExpanders中的一种预定义方法。
如果您只是希望您的遍历遵循特定关系类型,则可以使用TraversalDescription.relationships()来指定这些类型。