Fli*_*lip 7 database graph object neo4j
在使用neo4j之后,现在考虑让我自己的实体管理器(对象管理器)处理应用程序中提取的数据,我想知道neo4j的输出格式.
当我运行查询时,它总是作为表格数据返回.为什么是这样??确定的表在数据和处理方面占有很大的位置,但是图形数据库只能以这种格式输出似乎很奇怪.
现在,当我想在我的应用程序中创建一个对象图时,我将不得不对所有对象进行水合,这对性能并不是很好,并且不利用真正的图形性能.
考虑MATCH (A)-->(B) RETURN A, B当有一个A和三个B时,它会返回:
A B
1 1
1 2
1 3
Run Code Online (Sandbox Code Playgroud)
这是相同的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
当你说并非所有结果数据都可以表示为对象图时,你有一个观点.可以合理地说,表的替代输出格式只是表格格式的补充而不是替换它.
我从你的回答中了解到,数据库中的自然(原始)输出格式是带有重复的结果格式("将数据流出来").在那种情况下,我理解它现在留给替代程序(dev堆栈)来进行映射.所以我对neo4j的结论实现了这样的事情:
Pro's - 不必在每个实现语言(应用程序)中执行此操作
Con - 1)没有特定于应用程序的映射,2)如果实现语言很快就没有性能提升
"即使你使用geoff,graphml或gephi格式,你也必须将所有数据保存在内存中,以便对结果进行重复数据删除."
我完全不明白这一点,你是说这些格式无法保存重复数据删除的结果(在某些情况下)?所以事实上没有可能的文本格式可以用来描述图形而不重复?
"还有关于你想要在输出中包含什么的问题?"
我假设cypher语言足够强大,可以在查询中指定它.因此输出格式将具有数据库可以提供的任何结果.
"你可以只返回你得到的路径,这些路径本身就是独特的路径".
有用的建议,我会玩这个想法:)
"neo4j-shell的dump命令使用将cypher结果拉入内存结构的方法,丰富了它".
富集过程是从数据库中获取其他数据还是已包含在初始结果中的数据?
Mic*_*ger 12
还有更多.
首先,正如您所说,来自查询的表格结果非常普遍,需要与其他系统和数据库集成.
其次,您通常不会从查询中返回原始图形数据,而是从图形中返回聚合,投影,切片,提取的信息.因此,在我看到使用的大多数查询结果中,与原始图形数据的关系已经丢失.
人们需要/使用原始图数据的唯一时间是何时从数据库中导出子图数据作为查询结果.
将其作为重复数据删除图表的问题是,db必须首先获取内存中的所有结果数据数据以进行重复数据删除,提取所需的关系等.
通常它只是将数据流出来,并且使用的内存很少.
即使您使用geoff,graphml或gephi格式,您也必须将所有数据保留在内存中以对结果进行重复数据删除(这些结果将作为具有潜在重复节点和关系的路径返回).
还有关于您希望在输出中包含哪些内容的问题?只返回节点和rels?或者另外所有其他在您返回的节点之间相互依赖?或者返回节点的所有相关内容(但是您还必须包含这些关系的末端节点).
您可以返回您获得的路径,这些路径是图形中的唯一路径:
MATCH p = (n)-[r]-(m)
WHERE ...
RETURN p
Run Code Online (Sandbox Code Playgroud)
在Neo4j中解决这个问题的另一种方法是使用合理的聚合.
例如,你可以做的是使用collect来聚合每个节点的数据(即子图的种类)
MATCH (n)-[r]-(m)
WHERE ...
RETURN n, collect([r,type(r),m])
Run Code Online (Sandbox Code Playgroud)
或使用新的文字地图语法(Neo4j 2.0)
MATCH (n)-[r]-(m)
WHERE ...
RETURN {node: n, neighbours: collect({ rel: r, type: type(r), node: m})}
Run Code Online (Sandbox Code Playgroud)
dumpneo4j-shell 的命令使用将cypher结果拉入内存中结构的方法,丰富它然后将其作为cypher create语句输出.
如果需要,类似的方法也可以用于其他输出格式.但到目前为止还没有必要.
如果您确实需要此功能,那么编写一个使用cypher进行查询规范的服务器扩展是有意义的,但不允许返回语句.相反,您总是使用RETURN *,将数据聚合到内存中的结构(org.neo4j.cypher包中的SubGraph).然后将其渲染为合适的格式(例如JSON或上面列出的那些).
这可能是一个起点:
还有其他一些努力,比如GraphAlchemist的GraphJSON:https://github.com/GraphAlchemist/GraphJSON
而d3 json格式也很有用.我们在neo4j控制台(console.neo4j.org)中使用它来返回图形可视化数据,然后由d3直接使用.