Какой самый канонический способ представления отношений в GraphEngine?
Я пытаюсь выяснить, как лучше всего моделировать мои данные в моем TSL. В примере Friends отношения подразумеваются путем сохранения идентификатора ячейки (или списка идентификаторов ячеек) в связанных узлах. В примере Freebase, однако, есть понятие [GraphEdge], которое было введено. Я надеялся на документацию (и, возможно, здесь), мы могли бы получить четкое представление о том, как правильно моделировать отношения / ребра, используя GraphEngine.
1 ответ
Насколько мне известно, не существует такого стандартного способа в соответствии с документами, и лучшая практика также зависит от наших собственных требований, например, производительности или удобства. Вот мой выбор в разных ситуациях:
- Для ориентированного немаркированного графа, который является очень распространенной ситуацией, я просто использую идентификаторы соседних ячеек (список смежности) в качестве поля. И я считаю, что это очень эффективно для большинства операций с графами;
- Для ориентированного графа со свойствами по краям есть два варианта: использовать список значений, определенных пользователем.
struct
или установите отдельную ячейку для ребер и соедините ребра с ячейками исходного / целевого узлов. Первый из них практически быстрее второго для большинства операций с графами. Но цена заключается в том, что он не позволяет получить доступ к границе без посещения ячейки узла, что является преимуществом последней; - Для неориентированного графа без свойств на ребрах для каждого ребра (u, v) я помещаю их идентификаторы ячеек в списки смежности друг друга;
- Для неориентированного графа со свойствами на ребрах для каждого ребра создается отдельная реберная ячейка, в которой хранится вся информация, включая связанные с ней узлы и свойства;
- Для гиперграфа, где ребро может соединять более одного узла, мой выбор такой же, как 4.
Введенное понятие [GraphEdge] используется для распознавания краев с помощью Language Integrated Knowledge Query (LIKQ), однако это не повлияет на наше использование, если наши приложения не построены поверх LIKQ.