Neo4j输出格式

时间:2013-12-29 23:32:14

标签: database object graph neo4j

在使用neo4j后,现在考虑让我自己的实体管理器(对象管理器)处理应用程序中提取的数据,我想知道neo4j的输出格式。

当我运行查询时,它总是以表格数据的形式返回。为什么是这样?? 确实的表在数据和处理方面占有很大的位置,但是图形数据库只能以这种格式输出似乎很奇怪。

现在,当我想在我的应用程序中创建一个对象图时,我将不得不对所有对象进行水合,这对性能并不是很好,并且不利用真正的图形性能。

当有一个A和三个B时,请考虑MATCH (A)-->(B) RETURN A, B,它会返回:

A B
1 1
1 2
1 3

相同的A在数据库连接上传递了3次,而我只需要一次,我在获取数据之前知道这一点。


这样的事情似乎很棒http://nigelsmall.com/geoff 一个load2neo很好,从neo加载也很好!以geoff格式或任何其他格式https://gephi.org/users/supported-graph-formats/

然后,每种语言都可以实现它自己的函数来直接创建对象。

澄清:

  • 表格数据中节点之间的关系丢失
  • 图表的冗余(非最佳)格式
  • 边缘(关系)和顶点(节点)通常不在同一个表中。 (使查询更复杂?)

另一个考虑因素(可能值得它自己的帖子),在对象图中建模关系的好方法是什么?作为对象?或作为节点对象内的数据/方法?


@Kikohs
问:你是什么意思"然后每种语言都可以实现它自己的功能来直接创建对象。"?
答:使用由数据库提供的(部分)图形(作为查询的结果),PHP的语言可以提供工厂方法(优选地在C中)来构造对象图(这通常是昂贵的操作)。但只有当对象图以标准格式很好地定义时(因为这个函数应该简单且通用)。

问:您要导出完整图表还是仅导出查询结果? 答:查询的结果。但是,像MATCH (n) OPTIONAL MATCH (n)-[r]-() RETURN n, r这样的查询应该返回完整的图表。

问:您想要将根据查询结果创建的子图转储到磁盘吗? 答:不,像REST这样的现有接口更喜欢获取查询结果。

问:你想创建一个来自内存查询的子图,然后用另一种语言请求它吗? 答:不,我希望以另一种格式查询结果,然后以表格形式(提到的例子)

问:你创建的查询只返回一个节点的名称,在这种情况下,你想获得整个节点的关联还是只是名字?边缘相同。
答:节点没有名字。他们有财产,标签和关系。我想要足够的信息来检索A)节点ID,它的标签,它的属性以及B)与同一结果的其他节点的关系。

请注意,问题的第一部分不是具体的"操作方法"问题,而不是"为什么这不可能?" (或者如果是的话,我希望在这个问题上被证明是错误的)。第二个是真实的"操作方法"问题,即"如何建立关系"。这两个问题的共同之处在于,他们都试图找到答案,以及如何在PHP中有效地获取图形数据。"


@Michael Hunger

当你说并非所有结果数据都可以表示为对象图时,你有一个观点。可以合理地说,表格的替代输出格式只是表格格式的补充而不是替换它。

我从你的回答中了解到,数据库中的自然(原始)输出格式是带有重复项的结果格式("将数据流出来,然后#34;)。在那种情况下,我明白它现在留给另一个程序(dev堆栈)进行映射。所以我对neo4j的结论实现了这样的事情:
专业人士 - 不必在(应用程序的)每种实现语言中执行此操作 Con的 - 1)没有特定于应用程序的映射,2)如果实现语言很快就没有性能提升

"即使您使用geoff,graphml或gephi格式,您也必须将所有数据保存在内存中以对结果进行重复数据删除。"
我完全不明白这一点,你是说这些格式无法保存重复数据删除的结果(在某些情况下)?所以事实上,没有可能的文本格式可以用来描述图形而不重复??

"还有关于您希望在输出中包含哪些内容的问题?"
我假设cypher语言足够强大,可以在查询中指定它。因此输出格式将具有数据库可以提供的任何结果。

"您可以返回您获得的路径,这些路径是图表中的唯一路径"。
有用的建议,我会玩弄这个想法:)

" neo4j-shell的dump命令使用将cypher结果拉入内存结构的方法,丰富了它"。
富集过程是从数据库中获取其他数据还是已包含在初始结果中的数据?

2 个答案:

答案 0 :(得分:12)

还有更多内容。

首先,正如您所说,来自查询的表格结果非常普遍,需要与其他系统和数据库集成。

其次,您通常不会从查询中返回原始图表数据,而是从图表中返回聚合,投影,切片,提取的信息。因此,在我看到使用的大多数查询结果中,与原始图形数据的关系已经丢失。

人们需要/使用原始图表数据的唯一时间是何时从数据库中导出子图数据作为查询结果。

将其作为重复数据删除图表的问题是,db必须首先获取内存中的所有结果数据数据以进行重复数据删除,提取所需的关系等。

通常情况下,它只会将数据流式传输出来并使用很少的内存。

即使您使用geoff,graphml或gephi格式,您也必须将所有数据保留在内存中以对结果进行重复数据删除(这些结果将作为具有潜在重复节点和关系的路径返回)。

还有关于要在输出中包含哪些内容的问题?只返回节点和rels?或者另外所有其他在您返回的节点之间相互依赖?或者返回节点的所有rels(但是你还必须包含这些关系的结束节点)。

您可以返回您获得的路径,这些路径是图表中的唯一路径:

MATCH p = (n)-[r]-(m)
WHERE ...
RETURN p

在Neo4j中解决此问题的另一种方法是使用合理的聚合。

E.g。你可以做的是使用collect来聚合每个节点的数据(即子图的种类)

MATCH (n)-[r]-(m)
WHERE ...
RETURN n, collect([r,type(r),m])

或使用新的文字地图语法(Neo4j 2.0)

MATCH (n)-[r]-(m)
WHERE ...
RETURN {node: n, neighbours: collect({ rel: r, type: type(r), node: m})}

neo4j-shell的dump命令使用将cypher结果拉入内存结构的方法,丰富它然后将其作为cypher create语句输出。

如果需要,也可以将类似的方法用于其他输出格式。但到目前为止还没有必要。

如果您确实需要此功能,那么编写一个使用cypher进行查询规范的服务器扩展是有意义的,但不允许返回语句。相反,您总是使用RETURN *,将数据聚合到内存中结构(org.neo4j.cypher包中的SubGraph)。然后将其渲染为合适的格式(例如JSON或上面列出的格式之一)。

这可能是一个起点:

还有其他工作,例如GraphAlchemist的GraphJSON:https://github.com/GraphAlchemist/GraphJSON

d3 json格式也很有用。我们在neo4j控制台(console.neo4j.org)中使用它来返回图形可视化数据,然后直接由d3使用。

答案 1 :(得分:-1)

我一直在使用neo4j一段时间了,我可以告诉你,如果你关心内存和性能,你应该放弃cypher,并使用索引和其他图形遍历方法(例如,检索所有某种类型与起始节点之间的关系,然后迭代所找到的节点)。

正如文档所述,Cypher不是用于应用内使用,而是用作管理工具。此外,在生产规模的环境中,通过运行错误的查询来破坏服务器非常容易。

第二,在API方法的文档中没有提及将输出检索为类似图形的结构。您必须处理查询的输出并构建它。

那就是说,在这个例子中,你告诉你只有一个A并且你在获取数据之前知道它,所以你不需要这样做:

MATCH (A)-->(B) RETURN A, B 

但只是

MATCH (A)-->(B) RETURN B

(您不需要接收A三次,因为您已经知道这些是与A连接的节点)

或更好(如果您需要关于关系的信息)类似

MATCH (A)-[r]->(B) RETURN r