在 EMF 中建模自引用节点并使用 ECP 编辑它们
modeling self referencing nodes in EMF and edit them with ECP
我正在尝试使用 EMF 为网络建模。
网络应该由相互连接的节点组成。
每个节点应该与其他节点有一个或多个连接,就像一个网状网络。
该模型应可由 EMF 客户端平台 (ECP) 演示应用程序编辑。
当用户创建节点时,在 ECPs model-explorer 中,he/she 可以设置与其他节点的连接,最好是在列表中。
第一次尝试是自引用,但问题是没有双向自引用。这导致看不到来自对面节点的连接。
我的下一个想法是使用中间连接class,这导致了另一个问题。我想自动创建此连接,而模型资源管理器中不会出现连接 class。这可以在生成的 EMF 查看器中实现,但不能在我使用的 ECP 演示应用程序中实现。
第三个想法:我能想到的解决最后一个想法的唯一方法是在节点视图中使用 tableControl,在其中编辑连接 class。但是随后在模型资源管理器中隐藏连接 class 的问题仍然存在,并且连接 class 出现在项目文件夹(最高级别)中而不是它们包含的 class (在我的例子中网络 class).
有没有人有一些想法,如何解决我的任何问题?
编辑:附加信息
根据定义,节点之间的连接是全双工的。
然后该图应用作最短路径算法的输入。
你的第一次尝试是好的。实际上,您可以在 Ecore 中建立相反的模型。为此,您必须为同一对象建模两个 EReferences
(因此两个自反引用),然后将其中一个 EReference
的 属性 eOpposite
设置为另一个一。
这是一个带有 eOpposite
集的简单元模型:https://repository.genmymodel.com/vincent.aranega/NodeGraph
在 Ecore-XMI 中,它看起来像这样(注意 eOpposite
值):
<eStructuralFeatures xsi:type="ecore:EReference" xmi:id="_pwXZhv1pEeW9zv77lynsJg"
name="references" upperBound="-1" eType="#_pwXZg_1pEeW9zv77lynsJg" eOpposite="#_pwXZiv1pEeW9zv77lynsJg"/>
<eStructuralFeatures xsi:type="ecore:EReference" xmi:id="_pwXZiv1pEeW9zv77lynsJg"
name="relatives" upperBound="-1" eType="#_pwXZg_1pEeW9zv77lynsJg" eOpposite="#_pwXZhv1pEeW9zv77lynsJg" />
使用此元模型,您可以创建一个包含许多 Node
的 Graph
。每个节点可以 reference
其他节点。如果 Node
A
作为对另一个名为 B
的引用,B
的 relatives
集合将自动更新为 A
.
我正在尝试使用 EMF 为网络建模。 网络应该由相互连接的节点组成。 每个节点应该与其他节点有一个或多个连接,就像一个网状网络。
该模型应可由 EMF 客户端平台 (ECP) 演示应用程序编辑。 当用户创建节点时,在 ECPs model-explorer 中,he/she 可以设置与其他节点的连接,最好是在列表中。
第一次尝试是自引用,但问题是没有双向自引用。这导致看不到来自对面节点的连接。
我的下一个想法是使用中间连接class,这导致了另一个问题。我想自动创建此连接,而模型资源管理器中不会出现连接 class。这可以在生成的 EMF 查看器中实现,但不能在我使用的 ECP 演示应用程序中实现。
第三个想法:我能想到的解决最后一个想法的唯一方法是在节点视图中使用 tableControl,在其中编辑连接 class。但是随后在模型资源管理器中隐藏连接 class 的问题仍然存在,并且连接 class 出现在项目文件夹(最高级别)中而不是它们包含的 class (在我的例子中网络 class).
有没有人有一些想法,如何解决我的任何问题?
编辑:附加信息
根据定义,节点之间的连接是全双工的。 然后该图应用作最短路径算法的输入。
你的第一次尝试是好的。实际上,您可以在 Ecore 中建立相反的模型。为此,您必须为同一对象建模两个 EReferences
(因此两个自反引用),然后将其中一个 EReference
的 属性 eOpposite
设置为另一个一。
这是一个带有 eOpposite
集的简单元模型:https://repository.genmymodel.com/vincent.aranega/NodeGraph
在 Ecore-XMI 中,它看起来像这样(注意 eOpposite
值):
<eStructuralFeatures xsi:type="ecore:EReference" xmi:id="_pwXZhv1pEeW9zv77lynsJg"
name="references" upperBound="-1" eType="#_pwXZg_1pEeW9zv77lynsJg" eOpposite="#_pwXZiv1pEeW9zv77lynsJg"/>
<eStructuralFeatures xsi:type="ecore:EReference" xmi:id="_pwXZiv1pEeW9zv77lynsJg"
name="relatives" upperBound="-1" eType="#_pwXZg_1pEeW9zv77lynsJg" eOpposite="#_pwXZhv1pEeW9zv77lynsJg" />
使用此元模型,您可以创建一个包含许多 Node
的 Graph
。每个节点可以 reference
其他节点。如果 Node
A
作为对另一个名为 B
的引用,B
的 relatives
集合将自动更新为 A
.