2010-04-17 5 views
6

Ich versuche, Ontologie Grundlagen zu verstehen. Hier ist ein Beispiel:Klassen/Instanzen in Ontology

  • Auto (Klasse)
  • 2009 VW CC (? Unterklasse oder Instanz)
  • Mein Nachbar 2009 VW CC (Beispiel)

Mein Problem ist Verständnis Was ist "2009 VW CC" (als Automodell). Wenn Sie das Produktmodell zu einer Unterklasse in der Ontologie machen, wird Ihre Ontologie plötzlich mit Tausenden von Unterklassen eines "Autos" aufgebläht. Das ist überflüssig. Zur gleichen Zeit können wir nicht sagen, dass "2009 VW CC" eine Instanz ist, zumindest ist es keine materielle Instanz einer Klasse.

Ist es sinnvoll, zwischen regulären Instanzen und Material (verschiedene physikalische Objekte) zu unterscheiden?

Auf der anderen Seite, wenn beide Instanzen (von unterschiedlicher Natur sozusagen) sind, wie kann Instanz Eigenschaften/Relationen einer Nicht-Klasse erben?

Antwort

5

Ich hasse es zu sagen, es kommt darauf an, aber es kommt darauf an.

Wenn Sie jedes einzelne Auto in der Welt modellieren müssen und Methoden haben, auf die Sie zurückgreifen können (wie "Reifen wechseln", was für jedes Modell sehr unterschiedlich ist), dann gehen Sie eine Menge aufgeblähter Klassen zu haben, weil deine reale Welt auch aufgebläht ist.

Wenn Sie nur eine Datenbank mit Bildern von archetypischen Autos haben möchten, und Sie nicht Auto, ob es ein Bild von der Instanz Ihres Nachbarn oder der Instanz Ihrer Schwester ist, dann können Sie die unterste Schicht fallen lassen. "2009 VW CC" könnte durchaus eine Instanz sein, obwohl man sich vorstellen kann, dass es sich auch um eine Klasse in einem anderen Modell handelt.

Alternativ können Sie es vielleicht auch nicht zu einer echten Unterklasse machen. Eine einfache Referenz könnte ausreichen. Zum Beispiel kennt eine Versicherungsgesellschaft eine große Liste von Automodellen und Jahren, aber die Entwickler schreiben nicht jeweils eine Unterklasse. Stattdessen haben sie eine Datenbank von Automodellen, wobei eine Reihe 2009 VW CC darstellen kann. Wenn Sie Ihr Auto versichern, erstellen Sie eine Instanz von "Insured Car" mit einem Verweis auf die Instanz "2009 VW CC".

Dies folgt nicht genau der "Vererbung für eine 'ist-a' Beziehung verwenden", aber die Operationen auf allen Arten von Autos sind identisch - es sind nur die Parameter (zB Versicherungspreis pro Jahr), die sich ändern, und neue Automodelle werden in der Datenbank gespeichert, nicht im Code.

Eine Annahme hier ist, dass Sie die Unterschiede zwischen den Differenzmodellen als bloße Parameter zu den gleichen Methoden am Auto modellieren können.

(Nebenbei: Als das iPhone anfing, über die Websites von Telefongesellschaften verfügbar zu werden, bemerkte ich, dass es ihre Klassenmodelle brach - ihre Websites schienen mit Dutzenden von Marken und Modellen von Telefon auf einer Seite umzugehen - vermutlich mit einem einfachen Datenbank von Telefonen und ihren Funktionen - und brauchte dann eine spezielle Seite, um mit den iPhone-Modellen umzugehen, vermutlich, weil neue spezielle Methoden in ihren Klassen benötigt wurden, um einige Aspekte des iPhone-Verkaufs zu unterstützen.Automatische Verkaufschreibtische würden sagen: Drücken Sie 1, um ein Telefon zu kaufen Drücken Sie 2, um ein iPhone zu kaufen. ")

+0

Ich beabsichtige nicht, jede Instanz eines Autos (oder irgendeines anderen Produkts) zu modellieren, aber ich möchte einen Weg bereitstellen, dies in meiner Anwendung zu tun. Zum Beispiel, wenn ein Produkt in einer limitierten Auflage veröffentlicht wird oder ausreichend einzigartig/angepasst ist. –

+0

Dann ist vielleicht ein hybrides Modell angebracht. Standard_Car erbt von Car und hat einen Verweis auf eine Datenbank verschiedener Modelle, die es unterstützt. Custom_Car erbt von Car und hat selbst Unterklassen für jeden Autotyp, die beide unterschiedlich genug und wichtig genug sind, um den teuren Schritt der Modellierung im Code zu durchlaufen. Das Auto Ihres Nachbarn kann abhängig von seiner Neuheit eine Instanz von Standard_Car oder eine der benutzerdefinierten Unterklassen von Auto sein. – Oddthinking

1

Sie haben es rückwärts.

2009 VW CC erbt von der Klasse car. So muss 2009 VW CC über car wissen, aber car muss nicht über 2009 VW CC wissen. Obwohl wir in der Realität gelegentlich den Begriff "Unterklasse" verwenden, weiß car nichts über irgendeine seiner Unterklassen.

Was interessant ist, ist, wenn Sie prototypal Erbe betrachten (wie in Javascript), wo Objekte von anderen Objekten direkt erben (vorstellen, wenn Ihr 2009 VW CC die Aspekte deines Nächsten 2009 VW CC geerbt). In Wirklichkeit ist dies so implementiert, dass das neue Objekt einen geheimen Zeiger auf das Objekt hat, von dem es geerbt wurde. Wenn Sie an diesen geheimen Zeiger denken, können Sie sehen, wie das entstehende Objekt nicht aufgebläht wird.

Wenn Sie jetzt vorschlagen, dass Mehrfachvererbung und lange Stammbäume zu verwirrenden Strukturen führen können, dann stimme ich Ihnen zu.

+0

Ich stimme deinem zweiten Absatz zu, aber ich kann nicht sehen, wo SODA nicht damit einverstanden ist oder es rückwärts bekommt. Ich sehe nicht einmal, wo er eine Mehrfachvererbung oder lange Stammbäume vorschlägt. Er scheint sich Sorgen um einen WIDE-Stammbaum zu machen, unter dem Auto. – Oddthinking

+0

Er denkt, dass Klasse Unterklasse wissen muss. Das ist rückwärts. Nur die Unterklasse muss etwas über die Klasse wissen. – tzenes

+0

Danke, das sind ausgezeichnete Ideen. Es scheint also, dass wir im realen Leben, wenn wir unsere Struktur überschaubar halten, sagen können, dass Produkte (im Sinne von Produktmodellen) alle Instanzen sind, die noch konkretere Instanzen mit noch spezifischeren Eigenschaften haben können? –

0

Ich stimme wirklich mit Oddthinking überein. Plus, wenn Sie Automodelle als Klassen benötigen, "plötzlich wird Ihre Ontologie mit Tausenden Unterklassen eines Autos aufgebläht" ist eigentlich kein Problem. Warum sollte es sein? Sie definieren nur Klassen anstelle von Individuen, Sie können eine "abstrakte" Ontologie mit Basisklassen und eine "konkrete" Ontologie mit Klassen haben, die die jeweilige Situation in der realen Welt repräsentieren. Das ist kein OOP, tausende Klassen zu definieren, die tatsächlich etwas zwischen Instanzen und Klassen liegen, ist keine große Sache, zumindest konzeptionell betrachtet niemand dies als "aufgebläht" oder auf irgendeine andere Weise merkwürdig. In der Tat, sie machen es die ganze Zeit in meinem Bereich (Biowissenschaften, wo uns normalerweise die Proteine ​​P53 in unserem Körper egal sind, also ist P53 eine Klasse, obwohl sie auch verwendet wird, um einen Datensatz in einer relationalen Datenbank zu modellieren) .

Außer, meine Erfahrung ist, dass Tools wie Virtuoso für die Situation von wenigen Klassen und viele Instanzen optimiert scheinen. Tatsächlich habe ich deutliche Leistungsverbesserungen beobachtet, als ich Millionen von Klassen in Virtuoso in Instanzen verwandelte. Also, nun, es ist kompliziert ...