Graph数据库中面向对象的编程

时间:2011-08-06 14:01:01

标签: database oop functional-programming neo4j graph-databases

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

  

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

有一种更好的方法。与用户分开的位置。不是将位置作为属性,而是为位置创建节点。 所以你可以有(u:User)-[:LIVES_IN]->(l:Location)种关系。

通过简单的查询检索生活在特定位置的用户列表变得更加容易:

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

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