Laravel NeoEloquent-динамические отношения между одним и тем же классом узлов

Я работаю над доказательством концепции, используя Laravel и Neo4j в качестве бэкенда. NeoEloquent является pefered выбор на данный момент: https://github.com/Vinelab/NeoEloquent

На данный момент у меня есть модель «человек» с хасманийским отношением к «термину». Это работает хорошо, так же, как описано в: https://github.com/Vinelab/NeoEloquent#one-to-many

Следующий шаг-создание динамических отношений. Таким образом, термин может иметь отношение к другому термину. Тип отношений также должен быть гибким. Таким образом, это может быть своего рода, скопированный, отношение к и т.д. Так же, как это:

Введите описание изображения здесь

Типы отношений не должны фиксироваться и будут визуализироваться на более позднем этапе. Каков наилучший подход для этого? Могу ли я сделать это с полиморфными отношениями и Гиперэджами? Из того, что я понимаю, что с полиморфными отношениями между ними создается дополнительный узел. Эта концепция отличается от того, как работает Neo4j, где ребра имеют свойства и атрибуты. Я прав? Каков наилучший подход для этого?

1 ответ

  1. Я вроде бы исправил это, используя полиморфное отношение. Это не оптимально, потому что создается дополнительный узел со свойствами, которые я хочу установить в отношении, но он работает на данный момент. Вот класс отношений, который я создал:

    class Relation extends NeoEloquent
    {
        protected $label = 'Relation';
        protected $guarded = [];
        public $timestamps = false;
        protected $fillable = ['relation_name','relation_description'];
        public function subject()
        {
            return $this->morphMany('App\Term','TO');
        }
    }
    

    Вот термин класс:

    class Term extends NeoEloquent
    {
        protected $label = 'Term';
        protected $guarded = [];
        public $timestamps = false;
        protected $fillable = ['term_name','term_definition'];
        public function author()
        {
            return $this->belongsTo('App\User', 'CREATED');
        }
        public function relationship($morph=null)
        {
            return $this->hyperMorph($morph, 'App\Relation', 'RELATION', 'TO');
        }
        public function object()
        {
            return $this->belongsToMany('App\Term', 'RELATION');
        }
        public function whichRelation()
        {
            return $this->morphMany('App\Relation','TO');
        }
    }
    

    I open sourced some parts as a Laravel + NeoEloquent + Neo4j demo. Ссылка на github здесь: https://github.com/pietheinstrengholt/laravel-neo4j-neoeloquent-demo