Как я могу смоделировать домен, который включает роли с несколькими атрибутами? - PullRequest
0 голосов
/ 04 февраля 2020

Я прочитал документацию, и я борюсь со следующим случаем (возможно, я имею в виду neo4j и hyperedges, и поэтому я могу ясно мыслить здесь):

Предположим, что я хочу смоделировать следующее лица: :person (с некоторыми атрибутами, такими как :name, id, et c), :school (снова некоторые атрибуты), отношение между school и person может быть как :student или :teacher. И это может развиться во времени (а: человек не может быть связан со школой, позже это :student и гораздо позже, может быть, как :teacher)

Когда :person является :student у него будет идентификатор студента, и как :teacher у него будет другой идентификатор, скажем, идентификатор учителя.

Итак, я должен иметь:

:person/name 'John'
:school/id 'SCHOOL-1'
:student/name 'John'
:student/school 'SCHOOL-1'

? Как я должен включать информацию как student-id, Что, если есть больше школ?

Но сейчас мне кажется, что отношения между этими объектами - это гипер-грань (вот почему я упомянул neo4j). И я не знаю, какой лучший способ моделирования это datomi c.

Заранее спасибо

1 Ответ

0 голосов
/ 04 февраля 2020

У меня есть хороший пример использования Datomi c для отслеживания Джеймса Бонда и различных злодеев , доступных здесь . Все написано в форме модульных тестов с использованием библиотеки Tupelo Datomi c , поэтому легко проверить базовый проект и любые изменения, которые у вас есть:

~/io.tupelo.demo/datomic > lct
Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.

lein test _bootstrap

-------------------------------
   Clojure 1.10.1    Java 13
-------------------------------

lein test tst.tupelo.datomic.bond

Ran 2 tests containing 35 assertions.
0 failures, 0 errors.

. Работайте с Datomi c Free edition, так что вам даже не нужна платная лицензия для начала работы.


В примере Бонда у персонажей может быть несколько видов оружия, которые моделируются как набор:

; Create some antagonists and load them into the db.  We can specify some of the
; attribute-value pairs at the time of creation, and add others later. Note that
; whenever we are adding multiple values for an attribute in a single step (e.g.
; :weapon/type), we must wrap all of the values in a set. Note that the set
; implies there can never be duplicate weapons for any one person.  As before,
; we immediately commit the new entities into the DB.
(td/transact *conn*
  (td/new-entity { :person/name "James Bond" :location "London"     :weapon/type #{ :weapon/gun :weapon/wit   } } )
  (td/new-entity { :person/name "M"          :location "London"     :weapon/type #{ :weapon/gun :weapon/guile } } )
  (td/new-entity { :person/name "Dr No"      :location "Caribbean"  :weapon/type    :weapon/gun                 } ))
...