使用数据库时如何使用 Anylogic 对象 (INode) 作为类型

How to use an Anylogic Object (INode) as a Type when using Databases

问题:我的数据库 tables(导入 excel)具有 orderslocations。订单有一个名为 "destination" 的列,该列交叉引用(使用 "Foreign Key" 引用 locations.location)到位置列 locations table它应该代表实际的 INode。我如何在 moveTo 块中指定此地址?

  1. 我没有看到可以将 INode 指定为数据库中类型的选项 table。如果我选择其他作为类型并尝试写入 INode,我会收到权限错误。
  2. 如何在代码或操作行中实现这种交叉引用?它已经在代理 table/parameters 中设置了外键。

您不能将 INode 之类的 AnyLogic 对象表示为数据库条目。相反,您可以存储 关于 节点的特征,并在模型开始时以编程方式创建节点。

因此存储 X/Y 坐标等内容

下面以GIS点为例,向您展示方法。您需要为 INode 做类似的事情(查看 INode 的 AnyLogic 帮助 API 以了解如何创建它们)。

我将位置名称作为字符串存储在数据库中:

在模型启动时,我以编程方式从数据中创建 GISPoint 元素(假设我有一个名为 map 的 GIS 地图):

List<Tuple> rows = selectFrom(routes)
.list();

for (Tuple row : rows) {
        GISPoint locationFrom = map.searchFirst(row.get( routes.location_from ));
        GISPoint locationTo = map.searchFirst(row.get( routes.location_to ));
        map.add(locationFrom);
        map.add(locationTo);
        GISRoute route = map.getRoute(locationFrom.getLatitude(), locationFrom.getLongitude(), 
             locationTo.getLatitude(), locationTo.getLongitude());
        route.setLineColor( spectrumColor(uniform_discr(1,10), 10) );
}

思路:解析

我同意 Benjamin 的观点:您不能直接保存对 INode 的 Java 对象的引用。如果您仍想使用预定义的 INode,可以将节点的文本名称保存在 Excel/database 中,然后将其解析 ("convert") 到具有此名称的 INode 的引用。

怎么做

为此做准备,最简单的方法是手动将您想要检索的所有 INode 放入一个集合中,对于本示例,我将其命名为 allMyINodes:

然后可以使用解析函数,这里有一个建议: INode getINodeByName(String nodeName):

INode myNode;

myNode = allMyINodes.stream()
    .filter(c -> c.getName().equals(nodeName))
    .findAny()
    .orElse(null);

return myNode;

这里是 Anylogic Cloud 中的 example project,您可以 运行 并在那里下载源文件。

将它应用到您的场景中

在您的应用程序中,这意味着例如在 moveTo 块中,您将编写 getINodeByName(....here the code to get one node name from the db....) 用于 INode 类型的目的地。

关于如何根据找到的订单和 link 键检索位置的第二个问题,我认为这是一个单独的问题,仅与 database/SQL 相关,也许你打开带有 SQL 标签的单独 post。