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

时间:2010-03-11 01:35:29

标签: java algorithm neo4j

这是一个图表,其节点同时存在于许多连接的组件中,因为节点的关系是边缘组的集合,因此每个边缘组只能同时出现一个边缘。我需要能够找到节点所在的所有连接组件。在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

我很感谢你的帮助。

UPDATE2:

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

2 个答案:

答案 0 :(得分:1)

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

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

此模型的ASCII艺术示例(正如我解释的那样):

(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);
}

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

答案 1 :(得分:0)

关于另一个查询,我在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并构建自己的迭代以进行细粒度控制。

这能解决您的问题吗?

/ peter neubauer