我有一个带字段的简单图表 - 每个字段有4个邻居(东北 - 西南):
@NodeEntity
public class Field {
@GraphId
Long id;
Field north;
Field east;
Field south;
Field west;
//.. other stuff
}
我是一个图形db(neo4j)设置,所以这些都很好并且连接(像网格)。我现在要做的是获取所有节点 - 从起始节点 - 即5跳。
使用经典的遍历可以正常工作,看起来像这样:
public Collection<Field> getFieldsWithDepth(Field startField, final int depth) {
Node fieldNode = this.getGraphdb().getNodeById(startField.getId());
Traverser traverser = fieldNode.traverse(Traverser.Order.BREADTH_FIRST, // check direct relations first, then go deeper
new StopEvaluator() {
@Override
public boolean isStopNode(TraversalPosition pos) {
if (pos.depth()==depth)
return true;
else
return false;
}
}, // worst case: go to end of graph
new ReturnableEvaluator() {
@Override
public boolean isReturnableNode(TraversalPosition pos) {
return true;
}
},
Relations.north,
Direction.OUTGOING,
Relations.east,
Direction.OUTGOING,
Relations.west,
Direction.OUTGOING,
Relations.south,
Direction.OUTGOING
);
ArrayList<Field> fields = new ArrayList<Field>();
for (Node node : traverser.getAllNodes())
{
fields.add((Field)this.getGraph().get(node));
}
return fields;
}
所以如果我有这样的“地图”:
1 2 | 3| 4 5
6 |7| | 8| | 9| 10
|11| |12| *13* |14| |15|
16 |17| |18| |19| 20
21 22 |23| 24 25
我查询起始节点''13'和“深度”2我需要得到标记的12个节点 - 因为它们距离13节点2步。
我在这里使用了jo4neo ......
如何在cypher或gremlin中实现相同的功能?
我找到了朋友的朋友示例,但这对我没有帮助,因为我需要深度作为参数(即在某些情况下我需要深度为4,有时为6)。
注意:除了Fields之外还有其他连接,但我显然只需要这些字段。此外,我需要获得所有连接的节点 - 而不仅仅是一个方向。
解决方案:感谢指针,我得到了解决方案:
start n=node(13) match n-[*1..2]->b where b.__type__ = "model.Field" return distinct b
答案 0 :(得分:4)
http://docs.neo4j.org/chunked/snapshot/query-match.html#match-variable-length-relationships
START a=node(3)
MATCH a-[:FRIEND*1..3]->x
RETURN a,x
如果您只需要3个步骤:
MATCH a-[:FRIEND*3..3]->x
希望这有帮助!
答案 1 :(得分:0)
如何找到深度?表示*1..3
表示&#34; A-> B,A-> B-&gt; C&amp; A-&GT; B-&GT; C-&GT; d&#34;作为Andres的密码查询的结果,我想要找到深度计数,即在A-> B的情况下为1;在A-> B-> C&amp; C的情况下为2。等等。