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

抄送1:

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

ETC。

我很感谢你在这方面的帮助。

更新2:

我想如果这个问题有答案的话我就能做到这一点:如何在 Neo4j 遍历的每一步中指定使用哪种关系类型作为当前节点的函数?

有帮助吗?

解决方案

他们这样,我明白你的问题,你有多个节点,让我们称他们的 X节点的,连接到许多类型的节点(或类似的东西),我们称这些节点的Ť节点。一种X节点可以具有到多个T节点的连接,但只有一个连接到每个T节点,或者可能只有一个连接到每个 T结点的(您的描述是有点模糊这里)。

我会对此建模的方式是通过使用一个的RelationshipType每个(种)T结点。然后你可以使用x_node.getRelationships(T_TYPE_ONE,T_TYPE_TWO,...等)从一个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);
}

请让我知道如果我误解你的要求,我会很乐意给你更新的描述刺伤。

其他提示

关于另一个查询,我指出了细粒度函数的一些可能性 如何在 Neo4j 遍历的每一步中指定使用哪种关系类型作为当前节点的函数?基本上,不要使用遍历器,而是使用更直接的 node.getRelationship* API 并构建您自己的迭代以进行细粒度控制。

这能解决你的问题吗?

/彼得·纽鲍尔

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top