GraphDB:节点作为关系的 属性
GraphDB: Node as a property of a relationship
我正在尝试分析 graphDB 作为问题域的 RDBMS 的替代品。这是我试图解决的问题的类比。
P:Michael 和 P:Angela r:like_to_eat G:Apple 和 G:Bread。 G:Apple 和 G:Bread 是 r:available_in S:Walmart 和 S:Whole Foods。
到目前为止它很简单。这是我认为最能表达图表的图像。
问题是当我尝试指定 Angela 喜欢 Whole Foods 的苹果和沃尔玛的面包时。迈克尔喜欢吃沃尔玛的苹果和全食超市的面包。我如何在图表中表示类似的东西?听起来我需要超图的概念才能解决这个问题,但我也听说任何超图问题也可以用 属性 图来解决。这可以使用 Neo4j 或 CosmosDB 等标准图形解决方案来解决吗?有人可以帮我解决这个问题
您可以在 Preference
节点中 "reify" 三向关系(Person
、Grocery
和 Store
之间)(例如),产生这样的数据模型:
在neo4j中,你可以使用这个Cypher查询来表示"Angela likes Apples from Whole Foods and Bread from 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)
另一种方法是将 "Angela likes Apples from Whole Foods" 中的 "Whole Foods" 表示为边 "likes to eat" 的 属性,这变成了真正的 "property graph"。这是数据模型:
在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:();
找出 Angela 喜欢哪家商店的苹果
> GO FROM 101 OVER likes where likes._dst==200 YIELD likes.storeID as storeID | FETCH PROP ON store $-.storeID
找出 Angela 在沃尔玛喜欢多少杂货
> GO FROM 101 OVER likes WHERE likes.storeID = 300
希望对您有所帮助。
我正在尝试分析 graphDB 作为问题域的 RDBMS 的替代品。这是我试图解决的问题的类比。
P:Michael 和 P:Angela r:like_to_eat G:Apple 和 G:Bread。 G:Apple 和 G:Bread 是 r:available_in S:Walmart 和 S:Whole Foods。 到目前为止它很简单。这是我认为最能表达图表的图像。
问题是当我尝试指定 Angela 喜欢 Whole Foods 的苹果和沃尔玛的面包时。迈克尔喜欢吃沃尔玛的苹果和全食超市的面包。我如何在图表中表示类似的东西?听起来我需要超图的概念才能解决这个问题,但我也听说任何超图问题也可以用 属性 图来解决。这可以使用 Neo4j 或 CosmosDB 等标准图形解决方案来解决吗?有人可以帮我解决这个问题
您可以在 Preference
节点中 "reify" 三向关系(Person
、Grocery
和 Store
之间)(例如),产生这样的数据模型:
在neo4j中,你可以使用这个Cypher查询来表示"Angela likes Apples from Whole Foods and Bread from 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)
另一种方法是将 "Angela likes Apples from Whole Foods" 中的 "Whole Foods" 表示为边 "likes to eat" 的 属性,这变成了真正的 "property graph"。这是数据模型:
在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:();
找出 Angela 喜欢哪家商店的苹果
> GO FROM 101 OVER likes where likes._dst==200 YIELD likes.storeID as storeID | FETCH PROP ON store $-.storeID
找出 Angela 在沃尔玛喜欢多少杂货
> GO FROM 101 OVER likes WHERE likes.storeID = 300
希望对您有所帮助。