Neo4j/Gremlin/Cypher:如何获取所有节点,直到我在类似地图的设置中达到一定距离(深度)?

2024-04-10

我有一个带有字段的简单图表 - 每个字段有 4 个邻居(东北-南-西):

@NodeEntity
public class Field {
    @GraphId
    Long id;
    Field north;
    Field east;
    Field south;
    Field west;
    //.. other stuff
}

我设置了一个图形数据库(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 两步。

我在这个中使用了jo4neo...

如何在 cypher 或 gremlin 中实现相同的功能?

我找到了朋友的朋友的例子,但这并没有真正帮助我,因为我需要深度作为参数(即在某些情况下我想要深度为 4,有时为 6)。

Note:除了字段之外还有其他连接,但我显然只需要字段。另外,我需要获取所有连接的节点 - 而不仅仅是一个方向。

解决方案:感谢指点,我得到了解决方案:

start n=node(13) match n-[*1..2]->b where b.__type__ = "model.Field" return distinct b

http://docs.neo4j.org/chunked/snapshot/query-match.html#match-variable-length-relationships 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

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Neo4j/Gremlin/Cypher:如何获取所有节点,直到我在类似地图的设置中达到一定距离(深度)? 的相关文章

  • 用 HashMap[Int, Vector[Int]] (Scala) 表示图(邻接列表)?

    我想知道如何 如果可能的话 我可以通过以下方式制作 可变 图的邻接列表表示HashMap Int Vector Int HashMap当然是可变的 目前我将其设置为HashMap Int ArrayBuffer Int 但我可以更改 Arr
  • 为什么我的 Python 散点图不起作用?

    我使用 pylab 创建了一个非常简单的散点图 pylab scatter engineSize fuelMile pylab show 该程序的其余部分不值得发布 因为正是该行给我带来了问题 当我将 散点 更改为 绘图 时 它会绘制数据图
  • Neo4j 中合并和创建唯一之间的区别

    我试图找出合并和创建唯一之间的区别 我知道这些功能 合并 如果不存在模式 我可以创建节点 MERGE n name X RETURN n 这将创建具有属性名称的节点 n 空节点 m 和关系 RELATED MERGE n name X RE
  • 如何在 R 中的多图形环境中画一条线?

    举一个非常简单的例子 mfrow c 1 3 每个图都是不同的直方图 我将如何画一条水平线 类似于abline h 10 所经过的all3位数 也就是说 甚至是它们之间的边距 显然 我可以为每个图形添加一条 abline 但这不是我想要的
  • 无法将 neo4j shell 连接到本地服务器

    我已经通过自制程序安装了 neo4j 2 0 0 并启动了服务器 我可以通过端口 7474 访问 webadmin 控制台 但是当我运行时neo4j shell host localhost port 7474 I get non JRMP
  • 绘图:仅保留最相关的数据

    为了节省带宽并且不用自己生成图片 图表 我计划使用 Google 的图表 API http code google com apis chart http code google com apis chart 它的工作原理是简单地发出一个
  • boost::graph 算法是否能够使用以前的解决方案更快地解决密切相关的新问题?

    我在下图中定义了最大流量问题 最初 所有四个边缘的容量均为 4 个单位 我求从 0 到 3 的最大流量值 答案是 8 沿路径 0 gt 1 gt 3 4 个单位 沿路径 0 gt 2 gt 3 4 个单位 以下代码创建图表并查找最大流量 i
  • Flot 0.8.2 折线图 - 颜色错误

    我正在使用 Flot 折线图并设置它们的颜色 我发现了一个奇怪的错误 在前 3 种颜色之后 绘图对所有其他线条使用最后一种颜色 这不是正确的行为 更有趣的是图例显示了正确的颜色 这是一个已知的错误 var dataSet label d1
  • 读取 CSV 并绘制彩色折线图

    我正在尝试在阈值之前和之后绘制带有彩色标记的图表 如果我使用 for 循环for随着时间的推移读取解析输入文件H M我只能绘制和着色两个点 但对于所有的点我无法绘制 Input akdj 12 00 34515 sdfg sgqv 13 0
  • 使用 Cypher 向现有节点添加标签

    如何使用 Cypher 查询向现有节点添加标签 这在参考文档中 请参阅http docs neo4j org chunked stable query set html set set a label on a node http docs
  • 在 X 轴刻度上渲染 HTML

    我想在 D3 图表的 x 轴上渲染 HTML 基本上 我希望轴上的每个标签都是到数据中另一列的超链接 我试过了 x domain data map function d return a href d Name a 但它根本不起作用 我得到
  • Neo4j 服务器无法使用非托管扩展启动

    我正在尝试在 neo4j 服务器 版本 CE 2 3 2 上使用非托管扩展 所以我正在尝试一个简单的你好世界的例子 http neo4j com docs stable server unmanaged extensions htmlNeo
  • Neo4j:节点属性等于值 A 和值 B(交集)的求和关系属性

    基本上我的问题是 当存在属性等于值 A 和值 B 的相关节点时 如何对关系属性求和 例如 我有一个简单的数据库 具有以下关系 site HAS MEMBER gt user POSTED gt status TAGGED WITH gt t
  • Python 3.x 中的绘图

    在Python 2 6中 我使用matplotlib制作了一些简单的图表 但是 它与 Python 3 1 不兼容 有哪些替代模块可以完成相同的事情而不非常复杂 您说您想创建一些简单的图表 但没有真正说明您想要多简单或哪种类型的图表 只要它
  • 构造映射不允许索引集合作为映射键?

    所以我正在尝试写一个答案这个问题 https stackoverflow com questions 29262918 cypher zip collections这对我来说似乎很有趣 什么鬼 我来试试 这是我想出的解决方案 对我来说这似乎
  • 如何检查无向图是否有奇数环

    我试图找到一个 O V E 时间算法来检查是否已连接 无向图有或没有奇数环 我正在考虑对图进行广度优先搜索 并尝试将顶点标记为黑色和白色 以便没有两个标记为相同颜色的顶点相邻 是否有任何已知的更简洁的算法可以在线性时间内解决这个问题 你的方
  • 如何仅匹配两个节点之间的一种关系

    我正在使用 neo4j 图形数据库 它在 Ruby on Rails 中使用 例如 我汤姆和杰瑞之间有3个关系 他们合作盖了3栋房子 现在我只想匹配3个中的1个 如何编写查询代码 我已经尝试过 这是我的代码 Neo4j Session qu
  • 添加边权重以在 networkx 中绘制输出

    我正在使用 networkx 包在 python 中做一些图论 我想 将图表边缘的权重添加到绘图输出中 我怎样才能做到这一点 例如 我如何修改以下代码以获得所需的输出 import networkx as nx import matplot
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • 如何使用 Bolt 协议将对象数组(批量插入)插入到 Neo4j 中(javascript)

    1 将带有对象数组的http post发送到服务器 id 1 title one id 2 title two 2 在服务器上接收帖子并使用bolt批量插入neo4j let data req body set up bolt let db

随机推荐