2014-03-03 45 views
2

我必须找到所有节点,x1x2 这样x1-[:R1]->x2-[:R2]->x3如何在Neo4j中找到与关系模式匹配的节点列表?

这里R1R2将被称为aforehand,我们必须找到所有这些x1x2 符合条件其中。此外,关系的数量可能会增加或减少,即可能存在三种关系R1R2R3并且它应该全部返回x1x2x4它满足条件。

我需要使用Java API而不是Cypher查询来执行此操作。

我发现类PatternNode和PatternRelationship,但发现很难理解,以及如何构建它们以实现我想实现的目标。此外,这两个类都被弃用。有没有办法通过Java实现这一点?

+0

为什么你想通过Java来做到这一点,如果Cypher可以处理它呢?您可以使用ExecutionEngine从Java使用Cypher。 –

+0

我同意,为什么不使用Cypher?这在Cypher中是一个小问题,每当Cypher进行优化时,您都可以获得性能提升的好处。通常,当我无法获得所需的性能时,我只使用遍历API。这个查询非常简单,我不会认为性能会成为问题。 – joe

+0

这是我项目经理的要求,很可能是因为他需要为特定的一组数据实现他自己的查询语言。他不希望通过Cypher构建查询语言,并希望通过Java API函数调用实现这一点。 – user2560730

回答

1

你有几种方法来遍历java中的图。这是你的选择:

执行一个暗号查询

使用ExecutionEngine执行的Cypher查询:

final ExecutionEngine engine = new ExecutionEngine(graphDB); 
ExecutionResult result = engine.execute("YOUR_CYPHER_QUERY"); 

使用Cypher支架DSL语法

再次,你”基本上写一个Cypher查询,但这一次,你使用一个很好的DSL语句。检查出https://github.com/neo4j/cypher-dsl

Execute q = start(node("john", john)). 
      match(path().from("john").out("friend").link().out("friend").to("fof")). 
      returns(properties("john.name", "fof.name")); 
ExecutionResult result = engine.execute(q.toString()).toString(); 

使用遍历API

您可以控制总图的遍历。举例:

for (final Path position : Traversal.description().depthFirst() 
    .relationships(RelationType.RELATIONSHIP_TYPE, Direction.INCOMING).traverse(node)) { 
    System.out.println(position.endNode(); 
} 

这取决于你,但我更喜欢简单的Cypher语句。

相关问题