如何将这种图存储在 neo4j 中以进行快速遍历?

Posted

技术标签:

【中文标题】如何将这种图存储在 neo4j 中以进行快速遍历?【英文标题】:How can I store this kind of graph in neo4j for fast traversal? 【发布时间】:2010-03-11 01:35:28 【问题描述】:

这是一个图,其节点同时存在于许多连接的组件中,因为节点的关系是边组的集合,因此每个边组只能同时出现一条边。我需要能够找到节点所在的所有连接组件。将此图存储在 neo4j 中以快速找到节点所在的所有连接组件的最佳方法是什么?有没有办法使用内置的遍历来做到这一点?

另外:这种图表有名称吗?如有任何帮助/想法,我将不胜感激。

更新:

抱歉,不清楚。所有节点都属于同一类型。节点具有可变数量的边组。需要为特定的连接组件从每个边缘组中选择一个边缘。我将尝试通过示例进行解释:

Node x1 is related to: (x2 or x3 or x4) AND (x5 or x6) AND (x7)
Node x2 is related to: (x8) AND (x9 or x10)

所以x1的第一个边组是(x2, x3, x4),它的第二个边组是(x5, x6),它的第三个边组是(x7)

所以这里有一些 x1 存在于其中的连接组件:

CC1:

x1 is related to: x2, x5, x7
x2 is related to: x8 x9 

CC2:

x1 is related to: x2, x6, x7
x2 is related to: x8, x9

CC3:

x1 is related to: x3, x5, x7

CC4:

x1 is related to: x3, x6, x7

等等

感谢您在这方面的帮助。

更新2:

如果有这个问题的答案,我想我可以做到这一点: How can I specify which relationship type to use as a function of the current node at every step of a traversal with neo4j?

【问题讨论】:

【参考方案1】:

我理解您的问题的方式是,您有许多节点,我们称它们为 X 节点,它们连接到多个类型节点(或类似的东西),我们称这些节点为 T 个节点。一个X节点可以连接多个T节点,但每个T节点只有一个连接,或者可能每个T节点种类只有一个连接(你的描述有点模糊)。

我对此建模的方式是为每个(种类)T 节点使用一个关系类型。然后您可以使用 x_node.getRelationships(T_TYPE_ONE, T_TYPE_TWO, ...etc...) 从 X 节点获取所有 T 节点。当你改变一个 X 节点时,你需要维护你的不变量,它与每个(种类)T 节点最多只能有一个关系。您可以通过使用 x_node.getSingleRelationship(THE_T_TYPE_YOURE_MUTATING) 来执行此操作,如果返回 null,则添加该类型的新关系是安全的,如果返回关系,则必须在添加新关系之前将其删除。

此模型的 ASCII-art 示例(正如我所解释的那样):

(x1)--T_ONE-->(t1a)   (t1b)<--T_ONE--(x2)--T_FOUR-->(t4a)
 |\                                   |
 \ |---T_TWO-->(t2a)                 /
  \                                 /
   |---T_THREE-->(t3a)<--T_THREE---/

在上面的示例中,两个 X 节点都是 T_ONE 组件的一部分,但 x1 是 T_ONE 组件 t1a 的一部分,x2 是 t1b 的一部分。它们都是 T_THREE 组件 t3a 的一部分,那么 x1 是 T_TWO 组件 t2a 的一部分,x2 是 T_FOUR 组件 t4a 的一部分。本例中的查询类似于:

Iterable<Relationship> x1_comps = x1.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);
Iterable<Relationship> x2_comps = x2.getRelationships(T_ONE, T_TWO, T_THREE, T_FOUR);

更新看起来像这样:

void setComponent(Node xNode, RelationshipType tType, Node tNode) 
    Relationship current = xNode.getSingleRelationship(tType);
    if (current != null) current.delete();
    xNode.createRelationshipTo(tNode, tType);

如果我误解了您的要求,请告诉我,我很乐意为您提供更新的说明。

【讨论】:

我认为我提出的解决方案在更新的问题描述下仍然有效。【参考方案2】:

关于另一个查询,我在How can I specify which relationship type to use as a function of the current node at every step of a traversal with neo4j? 指出了一些细粒度函数的可能性 基本上,不要使用遍历器,而是使用更直接的 node.getRelationship* API 并构建您自己的迭代以实现细粒度控制。

这能解决你的问题吗?

/彼得纽鲍尔

【讨论】:

以上是关于如何将这种图存储在 neo4j 中以进行快速遍历?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有遍历框架的情况下在neo4j中进行深度优先遍历?

电影智能问答——neo4j数据库创建

想问一下图数据库neo4j和spark下面的graphx有啥区别

Neo4j 使用cypher语言进行查询

Java集合遍历性能

Neo4j HA环境配置