图形数据库将数据存储为节点,属性和关系。如果我需要根据查询从对象中检索某些特定数据,那么我需要检索多个对象(因为查询可能有很多结果)。
在图形数据库的面向对象编程中考虑这个简单的场景:
我有一个(图形)用户数据库,其中每个用户都存储为一个对象。我需要检索生活在特定位置的用户列表(place属性存储在用户对象中)。那么,我该怎么做呢?我的意思是每次我需要做某事时都会检索不必要的数据(在这种情况下,可能需要检索整个用户对象)。图形数据库中的函数式编程不是更好吗?
这个例子只是我想到的上述问题的一个简单类比。不要把它作为基准。那么,问题仍然存在,图形数据库中的面向对象编程有多棒?
答案 0 :(得分:3)
图形数据库不仅仅是顶点和边。在大多数图形数据库中,例如neo4j,除了具有id
的顶点和具有label
的边之外,它们还具有属性列表。通常在基于Java的图形数据库中,这些属性仅限于java原型 - 其他所有内容都需要序列化为字符串(例如日期)。这种到顶点/边缘属性的映射可以使用getProperty
和setProperty
之类的方法手动完成,也可以像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.
这将返回所有居住在纽约的用户,而无需扫描每个节点的所有属性。这是一种更快的方法。