首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Neo4j -慢速密码查询-具有层次结构的大图

Neo4j -慢速密码查询-具有层次结构的大图
EN

Stack Overflow用户
提问于 2014-10-20 02:05:50
回答 1查看 478关注 0票数 0

使用Neo4j 2.1.4。我有一个在节点之间有'IS‘关系(和其他类型的关系)的图。我在图中有一些层次结构(是A关系),我需要知道一个层次的后代(是A关系),它与第二个层次的后代有着特定的已知关系。如果存在特定的已知关系,则返回第一个层次结构的后代。

输入: 'ID_parentnode_hierarchy_01‘、'ID_relationship’、'ID_parentnode_hierarchy_02‘。

输出:带有“ID_parentnode__02”的“ID_relationship”的“ID_parentnode_hierarchy_01”(是A关系)的后代。

注意:图有500.000个节点和200万个关系。

我正在使用这个密码查询,但它非常慢(aprox )。在一个4GB的RAM和3 3GHz奔腾双核64位PC)。建立更快的查询是可能的吗?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (parentnode_hierarchy_01: Node{nodeid : {ID_parentnode_hierarchy_01}})
WITH parentnode_hierarchy_01 
MATCH (parentnode_hierarchy_01) <- [:REL* {reltype: {isA}}] - (descendants01: Node)
WITH descendants01
MATCH (descendants01) - [:REL {reltype: {ID_relationship}}] -> (descendants02: Node)
WITH descendants02, descendants01
MATCH (parentnode_hierarchy_02: Node {nodeid: {ID_parentnode_hierarchy_02} }) 
<- [:REL* {reltype: {isA}}] - (descendants02)
RETURN DISTINCT descendants01;

非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2014-10-20 04:53:28

嗯,我可以稍微清理一下您的查询--这可能有助于我们更好地理解这些问题。我怀疑这个版本会运行得更快,但使用已清理的版本,我们可以讨论正在发生的事情:(主要是消除MATCH/WITH不必要的使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH (parent:Node {nodeid: {ID_parentnode_hierarchy_01}})<-[:REL* {reltype:{isA}}]-
      (descendants01:Node)-[:REL {reltype:{ID_relationship}}]->(descendants02:Node),

      (parent2:Node {nodeid: {ID_parentnode_hierarchy_02}})<-[:REL* {reltype:{isA}}]-
      (descendants02)
RETURN distinct descendants01;

这看起来像是在搜索两个(可能很大)树,从根开始搜索由{ID_relationship}链接的树中的两个节点。

除非您能够提供一些查询提示,说明树中的哪个节点可能有ID_relationship或类似的东西,否则,在最坏的情况下,您可能最终会比较这两棵树中的每两个节点。这看起来可能需要n*k时间,其中n是第一棵树中的节点数,k是第二棵树中的节点数。

下面是一些需要考虑的策略--您应该根据数据使用这些策略:

  1. 在树中有可能找到这些链接的深度吗?你能给[:REL* {reltype:{isA}}]的深度设定一个范围吗?
  2. 您还可以添加到descendants01descendants02中的其他标准是什么?有什么东西可以帮助查询更有选择性,这样就不会将一个树中的每个节点与另一个树中的每个节点进行比较?

您可能尝试的另一种策略是:(这可能是一个可怕的想法,但值得一试) --基本上是从一个根到另一个根,在任意数量的isa类型的无向边缘上寻找路径。您的数据模型具有具有:REL属性的reltype关系。这可能是反模式,而不是reltype属性,为什么关系类型不只是这样呢?这防止了我希望编写的查询,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MATCH p=shortestPath((p1:Node {nodeid: {first_parent_id}})-[:isA|ID_relationship*]-(p2:Node {nodeid: {second_parent_id}}))
return p;

这将返回路径从一个“根”到另一个,通过你想要的桥。然后,您可以使用path函数提取任何您想要的节点。请注意,由于您的数据模型,当前无法进行此查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26463059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文