Java Neo4j双向遍历api

Java Neo4j双向遍历api,java,neo4j,graph-databases,Java,Neo4j,Graph Databases,我正在玩Neo4j,到目前为止,我有一个地理图,其中机场连接到一个城市,城市连接到一个国家,国家连接到一个大陆,如图所示 箭头上的标签将org.neo4j.graphdb.RelationshipType转换为我的代码。到目前为止,我可以使用以下单向遍历来构建开始节点MXP到结束节点LTN之间的路径 Traverser traverse = database.traversalDescription().depthFirst() .relationships(CITY, BOTH) .r

我正在玩Neo4j,到目前为止,我有一个地理图,其中机场连接到一个城市,城市连接到一个国家,国家连接到一个大陆,如图所示

箭头上的标签将org.neo4j.graphdb.RelationshipType转换为我的代码。到目前为止,我可以使用以下单向遍历来构建开始节点MXP到结束节点LTN之间的路径

Traverser traverse = database.traversalDescription().depthFirst()
  .relationships(CITY, BOTH)
  .relationships(CONTINENT, BOTH)
  .relationships(COUNTRY, BOTH)
  .relationships(REGION, BOTH)
  .evaluator(Evaluators.includeWhereEndNodeIs(endNode)).traverse(startNode);

有了这个,我得到了一个单路径MXP->米兰->意大利->欧洲我终于得到了一个有效的解决方案。我的代码中的问题与的概念有关。我的问题的有趣之处是

设置在遍历过程中如何重新访问位置的规则,如“唯一性”中所述。如果未设置,则默认值为NODE_GLOBAL

节点\全局唯一性:整个图中的任何节点都不能访问一次以上。这可能会消耗大量内存,因为它需要保持内存中的数据结构来记住所有访问的节点

节点\路径唯一性:节点以前可能不会出现在到达它的路径中

这些描述在某种程度上不同于之前的描述,因此我尝试了不同的组合,最终得到了以下代码:

TraversalDescription bothSide = database.traversalDescription().depthFirst()
    .relationships(CITY, OUTGOING)
    .relationships(REGION, OUTGOING)
    .relationships(COUNTRY, OUTGOING)
    .relationships(CONTINENT, OUTGOING)
    .uniqueness(NODE_PATH);
  
Traverser traverser = database
    .bidirectionalTraversalDescription()
    .startSide(bothSide)
    .endSide(bothSide)
    .traverse(node, endNode);

基本上,我定义了对于结束和开始的一个共同的遍历描述,在这里我只想跟踪关系,我只考虑路径本身内的节点唯一的路径。< /P> 然后,我定义了一个双向遍历器,它简单地设置端点和起始端,并将图形从起始节点遍历到结束节点endNode,实际上它同时从起点遍历到终点和从终点遍历到起点,当两个遍历发生冲突时停止,将结果路径合并为一条从起点到终点的路径


注意:我不完全确定NODE_GLOBAL的含义,因为在我的数据库中,每个节点都代表一个地理实体,所以路径MXP->Milan->Italy->Europe中的每个节点可能通过测试学习有助于获得更多理解。我已经找到了它们,但没有花时间彻底阅读它们。现在,我花了50分钟的时间来阅读它们,它们写得很好,可以理解。我仍然没有解决我的问题,但我想我能在深入研究之后解决。谢谢@StefanArmburster!
TraversalDescription bothSide = database.traversalDescription().depthFirst()
    .relationships(CITY, OUTGOING)
    .relationships(REGION, OUTGOING)
    .relationships(COUNTRY, OUTGOING)
    .relationships(CONTINENT, OUTGOING)
    .uniqueness(NODE_PATH);
  
Traverser traverser = database
    .bidirectionalTraversalDescription()
    .startSide(bothSide)
    .endSide(bothSide)
    .traverse(node, endNode);