2011-08-06 49 views
1

图形数据库将数据存储为节点,属性和关系。如果我需要从一个基于查询的对象检索一些特定的数据,那么我需要检索多个对象(因为查询可能有很多结果)。图形数据库中的面向对象编程

考虑面向对象的编程这个简单的场景图中的数据库:

我有用户,其中每个用户被存储为一个对象的(曲线)的数据库。我需要检索生活在特定地点的用户列表(地点属性存储在用户对象中)。那么,我该怎么做呢?我的意思是每次需要执行某些操作时都会检索到不必要的数据(在这种情况下,可能需要检索整个用户对象)。图形数据库中的函数式编程不是更好吗?

这个例子只是我想到的上述问题的一个简单比喻。不要把它当作基准。所以,问题仍然存在,图形数据库中的面向对象编程有多棒?

+0

我宁愿制作地方节点,并使用关系连接用户。 - 为什么使用graphdb就像你想要一些非图形类型的存储?! AFAIK所有图形数据库都带有索引支持,因此您可以使用它来代替逐个检查属性值。 - 我认为你混淆了两个不同的问题:使用OO编程并不意味着你必须始终从DB加载完整的对象。也许你可以试着让问题更清楚? – nawroth

回答

1

每个节点都有可以映射到对象字段的属性。您可以手动执行此操作,也可以使用spring-data进行映射。

3

图形数据库不仅仅是顶点和边缘。在大多数图形数据库(例如neo4j)中,除了具有id的顶点和具有label的边缘之外,它们都具有属性列表。通常,在基于Java的图形数据库中,这些属性仅限于Java primatives - 其他所有内容都需要序列化为字符串(例如日期)。这种对顶点/边缘属性的映射既可以通过使用诸如getPropertysetProperty之类的方法手动完成,也可以使用Frames之类的东西,这是一个使用TinkerPop堆栈的对象映射器。

1

大多数图形数据库至少有一种顶点/边的索引。例如,InfiniteGraph支持B-树,Lucene(用于文本)和分布式的可缩放索引类型。如果您在字段中没有索引作为过滤器,则需要遍历该图并在每个步骤中自行应用谓词。希望这会减少要遍历的节点的数量。

0

Blockquote我需要检索生活在特定位置的用户列表(place属性存储在用户对象中)。

还有一个更好的办法。与用户分开的位置。不要将位置作为属性,请为位置创建节点。 所以你可以有(u:User)-[:LIVES_IN]->(l:Location)类型的关系。

变得更容易获取生活在一个特定的地方有一个简单的查询用户的列表:

match(u:User)-[:LIVES_IN]->(l:Location) where l.name = 'New York'. 
return u,l. 

这将返回居住在纽约的所有用户,而不必扫描每个节点的所有属性。这是一个更快的方法。