gpt4 book ai didi

java - 实现可导航图的优雅方式?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:35 31 4
gpt4 key购买 nike

这是一个设计问题。我正在努力为我面临的问题创建一个概念模型。

我有一个包含多个对象 (<1000) 的图表。这些对象以无数种方式连接在一起。这些对象中的每一个都有一些属性。

我需要能够通过它们的连接和属性访问这些对象。

例如让我们假设以下对象 -

{name: A, attributes:{black, thin, invalid}, connections: {B,C}} 
{name: B, attributes:{white, thin, valid}, connections: {A}}
{name: C, attributes:{black, thick, invalid}, connections: {A,B}}

现在我应该能够通过以下方式查询此图 -使用属性 -

black - yields [A,C]
black.thick - yields C

使用连接 -

A.connections[0].connections[0] - yields A

使用它们的组合 -

black[0].connections[0] - yields B

我的主要语言是 Java。但我不认为 Java 有能力处理这些种类的野兽。因此,我试图用像 Python 这样的动态语言来实现它。我还考虑过使用像 OGNL 或图形数据库这样的表达式语言评估。但我很困惑。我对编码解决方案不感兴趣。但对此类问题建模的正确方法是什么?

最佳答案

听起来您有一些想要以不同方式查询的对象模型。一种解决方案是使用 Java 创建模型,然后使用脚本语言支持以不同方式对该模型进行查询。例如:Java + Groovy 是我的推荐。

您可以为模型使用以下 Java 类。

public class Node {

private String name;
private final Set<String> attributes = new HashSet<String>();
private final List<Node> connections = new ArrayList<Node>();

// getter / setter for all
}

然后您应该使用正确填充的“连接”属性填充此类对象的列表。

要支持不同类型的脚本,您需要为脚本创建上下文,然后填充此上下文。上下文基本上是一张 map 。 map 的键成为脚本可用的变量。诀窍是填充此上下文以支持您的查询要求。

例如在 groovy 中绑定(bind)是上下文(引用 http://groovy.codehaus.org/Embedding+Groovy )。因此,如果您按照以下方式填充它,您的查询需求将得到处理

上下文/绑定(bind)映射

1. <Node name(String), Node object instance(Node)>
2. <Attribute name(String), list of nodes having this attribute(List<Node>)>

当您评估一个脚本说“A.connections[0]”时,在绑定(bind)中将查找针对键“A”存储的对象。然后将访问返回的对象的“连接”属性。因为这是一个列表,所以在 groovy 中允许使用 '[0]' 语法。这将返回索引 0 处的对象。同样,为了支持您的查询要求,您需要填充上下文。

关于java - 实现可导航图的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17408825/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com