Bewertungsverhalten von EntityValue
Ich bin verwirrt über ein Verhalten von EntityValue, bei dem ich finde, dass es nicht bewertet wird. Hier ist ein minimales Beispiel. Betrachten Sie den folgenden Brauch EntityStore:
store = EntityStore[{
"Group" -> <|
"Entities" -> <|
"GroupA" -> <|
"name" -> "Group A",
"size" -> 2,
"members" -> {
Entity["Individual", "Claus"],
Entity["Individual", "Andrea"]
}
|>,
"GroupB" -> <|
"name" -> "Group B",
"size" -> 2,
"members" -> {
Entity["Individual", "John"],
Entity["Individual", "Claudia"]
}
|>
|>
|>,
"Individual" -> <|
"Entities" -> <|
"Claus" -> <|"name" -> "Claus Smith", "age" -> 25|>,
"Andrea" -> <|"name" -> "Andrea Fisher", "age" -> 35|>,
"John" -> <|"name" -> "John Allen", "age" -> 45|>,
"Claudia" -> <|"name" -> "Claudia Wilson", "age" -> 60|>
|>
|>
}
]
Registrieren wir es:
EntityRegister[store]
und dann abfragen:
assoc = EntityValue["Group", "PropertyAssociation"]
was wie erwartet gibt:
{<|
EntityProperty["Group", "members"] -> {Entity["Individual", "Claus"], Entity["Individual", "Andrea"]},
EntityProperty["Group", "name"] -> "Group A",
EntityProperty["Group", "size"] -> 2
|>,
<|
EntityProperty["Group", "members"] -> {Entity["Individual", "John"], Entity["Individual", "Claudia"]},
EntityProperty["Group", "name"] -> "Group B",
EntityProperty["Group", "size"] -> 2
|>}
Angenommen, wir möchten diese Zuordnung hierarchisch gestalten, indem wir die einzelnen Eigenschaften durch ihre eigenen Eigenschaftszuordnungen ersetzen:
ds = assoc /. {Entity["Individual", n_] :> EntityValue[Entity["Individual", n], "PropertyAssociation"]}
Dies lässt - für mich unerwartet - die inneren EntityValue-Ausdrücke unbewertet:
{<|
EntityProperty["Group", "members"] -> {EntityValue[Entity["Individual", "Claus"], "PropertyAssociation"], EntityValue[Entity["Individual", "Andrea"], "PropertyAssociation"]},
EntityProperty["Group", "name"] -> "Group A",
EntityProperty["Group", "size"] -> 2|>,
<|EntityProperty["Group", "members"] -> {EntityValue[Entity["Individual", "John"], "PropertyAssociation"], EntityValue[Entity["Individual", "Claudia"], "PropertyAssociation"]},
EntityProperty["Group", "name"] -> "Group B",
EntityProperty["Group", "size"] -> 2
|>
}
Was ist los? Seltsamerweise werden die inneren EntityValueAusdrücke ausgewertet, wenn wir sie irgendwie direkt abfragen:
Lookup[ds, EntityProperty["Group", "members"]]
richtig ergibt
{{<|EntityProperty["Individual", "age"] -> 25,
EntityProperty["Individual", "name"] -> "Claus Smith"|>,
<|EntityProperty["Individual", "age"] -> 35,
EntityProperty["Individual", "name"] -> "Andrea Fisher"|>},
{<|EntityProperty["Individual", "age"] -> 45,
EntityProperty["Individual", "name"] -> "John Allen"|>,
<|EntityProperty["Individual", "age"] -> 60,
EntityProperty["Individual", "name"] -> "Claudia Wilson"
|>}}
Warum nervt mich das? Ich möchte diese Art von Ersetzungsmechanismus verwenden, um einen hierarchischen Zuordnungsausdruck aus einem hierarchischen Entitätsspeicher aufzubauen. Stellen Sie sich eine Kaskade von Eins-zu-Viele-Beziehungen vor, wie Kontinent -> Land -> Region -> Stadt -> Nachbarschaft "oder ähnliches. Ich möchte eine Hierarchie von Assoziationen aufbauen, indem ich die Liste der untergeordneten Entitäten iterativ ersetze von ihren Eigentumsverbänden.
Wie kann ich die Bewertung von steuern EntityValue?
Vielen Dank.
Antworten
ds = Replace[
assoc, {Entity["Individual", n_] :>
EntityValue[Entity["Individual", n], "PropertyAssociation"]},
Infinity]
oder erstellen Sie eine Liste der Regeln (mit Normal) aus der zu verwendenden Zuordnung ReplaceAll.
ds = Normal[assoc] /.
Entity["Individual", n_] :>
EntityValue[Entity["Individual", n], "PropertyAssociation"]