0

У меня есть этот сценарий, где каждый (источник) Entity имеет Properties, у которых есть цель, указывающая на другую Entity. Эти сопоставления свойств группируются вместе. То, что я хочу сделать, - это запросить те объекты, которые имеют определенные свойства с соответствующими целевыми объектами, но находятся в одной группе.Какое моделирование данных лучше для этого гиперграфа, используя Gremlin и DSE Graph?

Гиперграф хотел бы, что (прямоугольники гиперребра):

hypergraph version

JSON будет выглядеть так:

{ 
    id: 1, label: "Entity", 
    propertyGroups: [ 
    { 
     propertyGroupUuid: GroupUuid1, 
     property: {id: 1, label: "Property", name: "aName1"}, 
     target: {id: 2, label: "Entity"} 
    }, 
    { 
     propertyGroupUuid: GroupUuid2, 
     property: {id: 2, label: "Property", name: "aName2"}, 
     target: {id: 3, label: "Entity"} 
    }, 
    { 
     propertyGroupUuid: GroupUuid2, 
     property: {id: 3, label: "Property", name: "aName3"}, 
     target: {id: 4, label: "Entity"} 
    }] 
} 

самой плоской версии этого в базе данных графа может выглядеть например:

flattest version

Хотя наиболее расширенная версия этого может выглядеть так:

most expanded version

Так что, если я хочу:

  • получить все Entities, которые имеют Property 2 и Property 3 под тем же PropertyGroupUuid «нацеливание "Entity 3 и Entity 4 соответственно Я должен был вернуться Entity 1
  • получить все Entities t шляпа есть Property 1 и Property 2 под тем же PropertyGroupUuid «ориентации» Entity 2 и Entity 3 соответственно я должен НЕ вернуться Entity 1

Как это можно сделать с помощью гном против двух версий графика и какой из них более гибкими/эффективными, используя правильные индексы, такие как те, которые включены в DSE Graph? Есть ли лучшие альтернативы, о которых я не думал? Если ответ будет подробным и хорошо объясненным, я дам награду как минимум 50 :)

Спасибо!

+0

Вы меня путаете, потому что вы показываете свойства как узлы. Как правило, гиперребрами реализуются как узлы. Если посмотреть только на начальную диаграмму, вы добавите три HE-узла, по одному для каждого из трех прямоугольников, и добавьте ссылку от каждой сущности на каждый узел HE, в котором она находится. Если свойства и группы свойств являются узлами, тогда у них будут ссылки на их содержащих HE-узлы. –

+0

Да, мои свойства на самом деле являются объектами с именами, а не свойствами графика. Вот почему у меня есть их как узлы. –

+1

Итак, как вы получаете доступ к «проти»? 'g.V(). имеет (« Свойство »,« имя »,« Свойство 1 »)'? –

ответ

1

Я не понимаю вашу первую модель с развязанными узлами свойств, но вот обход для модели 2:

g.V().has("Property", "name", "Property 2").in("hasProperty"). /* start at any of the property 2 */ 
    filter(out("hasTarget").has("name", "Entity 3")).   /* with target entity 3   */ 
    in("hasSubGroup").filter(         /* traverse to the property group */ 
    out("hasSubGroup").and(         /* traverse to all sub-groups  */ 
     out("hasProperty").has("name", "Property 3"),   /* filter those that are linked to */ 
     out("hasTarget").has("name", Entity 4")     /* property 3 w/ target entity 4 */ 
    ) 
).in("hasGroup")            /* traverse to all entities that match the above criteria */ 

ничего о данных в вашем графике, не зная, что трудно предсказать performmance для этого ВТП. Но в целом производительность должна быть в порядке, если a) имена свойств индексируются и b) коэффициент ветвления низкий.

+0

Спасибо, Даниил!Первая модель имеет развязанные свойства, поэтому я могу найти идентификаторы и имена. Она может быть сохранена в Кассандре или где-то еще. Обычно я придерживаюсь второго подхода, поэтому не уверен, что первый из них жизнеспособен. Коэффициент ветвления означает, сколько подэлементов Property на каждом из сущностей? –

+0

Я нашел опечатку '' 'has (" name "," Property 4 ")' '' должен быть '' 'имеет (« name »,« Entity 4 »)' ''. Также, где вы проверяете, что подгруппы одинаковы или различны для свойств 2 и 3? Я ожидал чего-то более явного с использованием '' 'as()' ''. Благодаря! –

+0

может быть, что '' 'in (" hasSubGroup "). Filter (' '' должен быть '' 'in (« hasGroup »). Filter (' '' –

 Смежные вопросы

  • Нет связанных вопросов^_^