我有一个图,其中节点与 2 个关系相关:
subclassOf
, partOf
.
有一些节点具有一些属性。如果 B 是subclassOf
A,则 B 继承 A 的属性,如果 D 是partOf
C,则 C 继承 D 的属性。
我尝试了一些算法来推断所有节点属性,但我的程序挂起。
任何算法(蛮力)都可以做到这一点吗?
我有一个图,其中节点与 2 个关系相关:
subclassOf
, partOf
.
有一些节点具有一些属性。如果 B 是subclassOf
A,则 B 继承 A 的属性,如果 D 是partOf
C,则 C 继承 D 的属性。
我尝试了一些算法来推断所有节点属性,但我的程序挂起。
任何算法(蛮力)都可以做到这一点吗?
假设 B 类从 A 继承,C 类从 B 继承,所以 C 类实际上也从 A 继承。
A a = new A();
B b = new B();
C c = new C();
if (b is A)
{
//True
}
if (c is B)
{
//True
}
if (c is A)
{
//True
}
if (a is B)
{
//False
}
A a1 = b as A;
if (a1 != null)
{
//So a1 is b
}
这是一个有向无环图(DAG),因为如果 B 是subClassOf
A : A->B
,则 A 是not subClassOf
B 或属于 B 的任何类subClassOf
。同样的规则也适用于partOf
属性(D 是partOf
C : D->C
)。这意味着类之间没有循环依赖。
顺便说一句,在 OOP 世界中,partOf
关系根本不意味着继承。所以通常如果 D isPartOf
C,C 不会得到 D 的属性。可以使用诸如适配器模式之类的东西来获取它,但默认情况下 C encapsulates
D is all 是隐含的。
如果您正在编写一个查询函数来返回C
您想要的类的所有属性,您可以使用递归并获取它。由于这是一个 DAG,递归将终止。如果错误地在关系图中存在循环,则递归将堆栈溢出。伪代码如下。
Properties propertyOf(c) {
Properties p = c.localProperties; //Init to props defined specific to `C`
foreach (var edge in edges(c)){
if(dest(edge) == c){ //Only interested in `inflowing` edges.
if( type(edge) == "subClassOf" || type(edge) == "partOf"){
p.append( propertyOf ( source(edge) ) ) //Recurse further into source nodes
}
}
}
return p
}