我试图将graphDB作为问题域的关系数据库管理系统的替代方案进行分析。下面是我正试图解决的一个问题的类比。
P:Michael和P:Angela r:like_to_eat G:Apple和G:coder:available_in G:苹果和G:面包是:沃尔玛和S:Whole 。到目前为止还是很简单的。这是一幅我认为最能表达这张图的图片。

问题是当我试图明确安琪拉喜欢全食苹果和沃尔玛面包的时候。迈克尔喜欢吃沃尔玛的苹果和全食的面包。我怎么能用图表来表示这样的东西呢?听起来我需要超图的概念才能解决这个问题,但我也听说过,任何超图问题也可以用属性图来解决。这能用Neo4j或CosmosDB这样的标准图形解决方案解决吗?有人能帮我一下吗?
发布于 2020-04-23 19:28:15
您可以在一个Person节点(比方说)中“具体化”Person、Grocery和Store之间的3路关系,从而形成如下数据模型:

在neo4j中,您可以使用这个Cypher查询来表示“安吉拉喜欢全食苹果和沃尔玛面包”:
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)发布于 2020-04-26 07:14:12
另一种选择是将“安琪拉喜欢吃苹果”中的“全食”表示为“喜欢吃”的属性,这将成为一个真实的“财产图”。以下是数据模型:

在NebulaGraph(这是一个图形数据库段式)中,您可以使用以下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找出安吉拉在沃尔玛喜欢多少杂货
> GO FROM 101 OVER likes WHERE likes.storeID = 300希望这能有所帮助。
https://stackoverflow.com/questions/61395285
复制相似问题