使用数据库时如何使用 Anylogic 对象 (INode) 作为类型
How to use an Anylogic Object (INode) as a Type when using Databases
问题:我的数据库 tables(导入 excel)具有 orders 和 locations。订单有一个名为 "destination" 的列,该列交叉引用(使用 "Foreign Key" 引用 locations.location)到位置列 locations table它应该代表实际的 INode。我如何在 moveTo 块中指定此地址?
- 我没有看到可以将 INode 指定为数据库中类型的选项 table。如果我选择其他作为类型并尝试写入 INode,我会收到权限错误。
- 如何在代码或操作行中实现这种交叉引用?它已经在代理 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。
问题:我的数据库 tables(导入 excel)具有 orders 和 locations。订单有一个名为 "destination" 的列,该列交叉引用(使用 "Foreign Key" 引用 locations.location)到位置列 locations table它应该代表实际的 INode。我如何在 moveTo 块中指定此地址?
- 我没有看到可以将 INode 指定为数据库中类型的选项 table。如果我选择其他作为类型并尝试写入 INode,我会收到权限错误。
- 如何在代码或操作行中实现这种交叉引用?它已经在代理 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。