使用数据库时如何使用 Anylogic 对象 (INode) 作为类型
Posted
技术标签:
【中文标题】使用数据库时如何使用 Anylogic 对象 (INode) 作为类型【英文标题】:How to use an Anylogic Object (INode) as a Type when using Databases 【发布时间】:2020-03-28 18:09:09 【问题描述】:问题:我有带有 orders 和 locations 的数据库表(导入的 excel)。订单有一个名为“destination”的列,它被交叉引用(使用“外键”来引用locations.location)到位置列locations表,该表应该代表实际的INode。如何在 moveTo 块中指定此地址?
-
我没有看到可以将 INode 指定为数据库表中的类型的选项。如果我选择 Other 作为类型并尝试编写 INode,则会出现权限错误。
如何在代码或操作行中实现此交叉引用?它已经在代理表/参数中设置了外键。
【问题讨论】:
【参考方案1】:您不能将像 INode
这样的 AnyLogic 对象表示为数据库条目。相反,您可以存储关于节点的特征,并在模型开始时以编程方式创建节点。
所以存储诸如 X/Y 坐标之类的东西。
以下是 GIS 点的示例,可向您展示该方法。您需要对 INode 执行类似的操作(查看 INode API 的 AnyLogic 帮助以了解如何创建它们)。
我将位置名称作为字符串存储在 dbase 中:
在模型启动时,我以编程方式从数据中创建 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) );
【讨论】:
感谢本杰明的回复,我希望我可以把它留在电子表格中,并在它发生变化时更新它。【参考方案2】:思路:解析
我同意 Benjamin 的观点:您不能直接保存对 INode 的 Java 对象的引用。如果您仍想使用预定义的 INode,可以将节点的文本名称保存在 Excel/数据库中,然后将其解析(“转换”)为具有此名称的 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 类型的目的地。
关于如何根据找到的订单和按键链接检索位置的第二个问题,我认为这是一个单独的问题,仅与数据库/SQL 相关,也许您使用 SQL 打开一个单独的帖子标记。
【讨论】:
谢谢弗洛里安。并感谢您上传示例。我使用函数和 case/switch 语句有类似的东西。我从来没有使用过过滤器/流,我对 lambda 的了解也只是初步的。所以我会用这个简单的案例来获得更多的曝光。以上是关于使用数据库时如何使用 Anylogic 对象 (INode) 作为类型的主要内容,如果未能解决你的问题,请参考以下文章
AnyLogic - 使用 Key-Value 数据库连接对象
如何在不导入的情况下将excel电子表格导入anylogic数据库,即在主启动时使用代码
如何使用anylogic中的参数变化从图表上的main获取某些数据?
anylogic中的Agent连接: 我在使用Anylogic建立Agent模型时,在系统开始动态运行时,加入Agent,想让新加