พฤติกรรมการประเมิน EntityValue

Sep 29 2020

ฉันงงงวยกับพฤติกรรมEntityValueที่ฉันพบว่ามันไม่มีการประเมินค่า นี่คือตัวอย่างเล็กน้อย พิจารณาธรรมเนียมต่อไปนี้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|>
       |>
     |>
   }
  ]

มาลงทะเบียนกันเถอะ:

EntityRegister[store]

แล้วสอบถาม:

assoc = EntityValue["Group", "PropertyAssociation"]

ซึ่งให้ตามที่คาดไว้:

{<|
  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
|>}

ตอนนี้สมมติว่าเราต้องการทำให้การเชื่อมโยงนี้เป็นลำดับชั้นโดยการแทนที่คุณสมบัติส่วนบุคคลด้วยการเชื่อมโยงคุณสมบัติของตนเอง:

ds = assoc /. {Entity["Individual", n_] :> EntityValue[Entity["Individual", n], "PropertyAssociation"]}

สิ่งนี้ - โดยไม่คาดคิดสำหรับฉัน - ทำให้นิพจน์ EntityValue ภายในไม่ได้รับการประเมิน:

{<|
  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
|>
}

เกิดอะไรขึ้น? น่าแปลกที่EntityValueนิพจน์ภายในจะประเมินเมื่อเราสอบถามโดยตรง:

Lookup[ds, EntityProperty["Group", "members"]]

ให้ผลผลิตอย่างถูกต้อง

{{<|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"
|>}}

ทำไมถึงทำให้ฉันรำคาญ ฉันต้องการใช้กลไกการแทนที่ประเภทนี้เพื่อสร้างนิพจน์การเชื่อมโยงตามลำดับชั้นจากที่เก็บเอนทิตีแบบลำดับชั้น ลองนึกภาพการเรียงซ้อนของความสัมพันธ์แบบหนึ่งต่อกลุ่มเช่นทวีป -> ประเทศ -> ภูมิภาค -> เมือง -> ละแวกใกล้เคียง "หรือสิ่งที่คล้ายกันฉันต้องการสร้างลำดับชั้นของการเชื่อมโยงโดยการแทนที่รายการเอนทิตีลูกซ้ำ ๆ โดยสมาคมทรัพย์สินของพวกเขา

แล้วฉันจะควบคุมการประเมินผลได้EntityValueอย่างไร?

ขอบคุณ.

คำตอบ

2 Jean-Pierre Sep 29 2020 at 04:53
ds = Replace[
  assoc, {Entity["Individual", n_] :> 
    EntityValue[Entity["Individual", n], "PropertyAssociation"]}, 
  Infinity]

หรือสร้างรายการของกฎ (ใช้Normal) ReplaceAllจากสมาคมกับการใช้งาน

ds = Normal[assoc] /. 
 Entity["Individual", n_] :> 
  EntityValue[Entity["Individual", n], "PropertyAssociation"]