GraphDB: узел как свойство отношения - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь проанализировать graphDB как альтернативу RDBMS для проблемной области. Вот аналогия проблемы, которую я пытаюсь решить.

P: Майкл и P: Анджела r: like_to_eat G: яблоко и G: хлеб . G: яблоко и G: хлеб r: available_in S: Walmart и S: Whole Foods . Пока все просто. Вот изображение, которое, я думаю, лучше всего отражает график.

Graph database

Проблема заключается в том, что я пытаюсь указать, что Анжеле нравятся яблоки из цельных продуктов и хлеб от Walmart. А Майкл любит есть яблоки из Walmart и хлеб из Whole Foods. Как я могу представить что-то подобное на графике? Похоже, мне нужна концепция гиперграфа, чтобы решить эту проблему, но я также слышал, что любую проблему гиперграфа можно решить и с помощью графа свойств. Можно ли это решить с помощью стандартных графовых решений, таких как Neo4j или CosmosDB? Может кто-нибудь, пожалуйста, помогите мне с этим

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Другой альтернативой является представление «Whole Foods» из «Анджела любит яблоки из Whole Foods» как свойство края «любит есть», которое становится настоящим «графом свойств». Вот модель данных:

enter image description here

В Nebula Graph (который представляет собой базу данных графа) вы можете использовать следующий запрос nGQL для моделирования:

// Define the schema
create tag person(name string)
create tag grocery(name string)
create tag store(name string)
create edge likes(storeID int)
create edge sells()

// Insert the vertices
INSERT VERTEX person(name) VALUES 100:("Michael");
INSERT VERTEX person(name) VALUES 101:("Angela");
INSERT VERTEX grocery(name) VALUES 200:("Apple");
INSERT VERTEX grocery(name) VALUES 201:("Bread");
INSERT VERTEX store(name) VALUES 300:("Walmart");
INSERT VERTEX store(name) VALUES 301:("Whole Foods");


// Insert the edges
INSERT EDGE likes(storeID) VALUES 101->200:(301);
INSERT EDGE likes(storeID) VALUES 101->201:(300);
INSERT EDGE sells() VALUES 300->200:();
INSERT EDGE sells() VALUES 300->201:();
INSERT EDGE sells() VALUES 301->200:();
INSERT EDGE sells() VALUES 301->201:();

Чтобы найти яблоки в каком магазине любит Анжела

> GO FROM 101 OVER likes where likes._dst==200 YIELD likes.storeID as storeID | FETCH PROP ON store $-.storeID

Чтобы найти, сколько продуктов нравится Анжеле в Walmart

> GO FROM 101 OVER likes WHERE likes.storeID = 300

Надеюсь, это поможет.

1 голос
/ 23 апреля 2020

Вы можете «повторно» определить трехстороннее отношение (между Person, Grocery и Store) в узле Preference (скажем), в результате чего получается модель данных, подобная этой:

enter image description here

В neo4j вы можете использовать этот запрос Cypher для представления "Анджеле нравится яблоки из цельных продуктов и хлеб из Walmart":

MERGE (angela:Person {name: 'Angela'})
MERGE (apple:Grocery {name: 'Apple'})
MERGE (bread:Grocery {name: 'Bread'})
MERGE (wf:Store {name: 'Whole Foods'})
MERGE (wm:Store {name: 'Walmart'})
CREATE
  (angela)-[:LIKES]->(pref1:Preference),
  (pref1)-[:ITEM]->(apple),
  (pref1)-[:AT_STORE]->(wf),
  (angela)-[:LIKES]->(pref2:Preference),
  (pref2)-[:ITEM]->(bread),
  (pref2)-[:AT_STORE]->(wm)
...