【发布时间】:2016-07-04 11:31:27
【问题描述】:
我有 recently asked about how to find all paths between two types os nodes in a way where all the edges in the path had the same attribute(就像同一个 ID)。这将是这样的:
MATCH (a {type: 'cin1'})-[rels:Next*1.. {value: 1}]->(b {type: 'cancer'})
RETURN (a), (b)
在哪里有 value: 1 我会有 value: same for all edges.
我找到了一种通过使用类似这样的方法来解决这个问题的方法(正如我在另一个问题中所回答的那样):
MATCH (a:Label {type: 'cin1'})
MATCH (b:Label {type: 'cancer'})
MATCH shortestPath((a)-[rels:Next*1..20]->(b))
WHERE ALL(r in tail(rels) WHERE (head(rels)).value = r.value)
RETURN (a), (b)
我遇到的问题是,这种方法首先创建所有可能的不同路径,然后过滤它们,在我的情况下,这会创建成倍增长的路径。比如下面这张图
给出的方法将首先匹配所有路径:
id:1 -> id:1 -> id:1
id:1 -> id:2 -> id:1
id:1 -> id:1 -> id:2
id:1 -> id:2 -> id:2
id:1 -> id:2 -> id:3
...
然后才过滤这些选项以返回 1->1->1、2->2->2、3->3-> 3 以此类推。因此,事实证明这种方法非常无效,我想知道是否有更简单的方法。
【问题讨论】:
-
有什么方法可以优化你的人际关系?现在我的假设是他们都使用具有不同属性的相同标签。你能把它们改成标签,还是不可行?
-
不可行 :/ 基本上你有太多了
-
我害怕那个。虽然我了解您的性能问题,但我想知道您是否已在示例数据集上运行此程序以确认性能确实是一个问题。我猜你有一个庞大的数据集和相当庞大的连接网络?
-
是的!几十万个节点!虽然它可以在较小的数据集上完美运行
-
我想知道那个 WHERE ALL 子句......是在最短路径执行中使用的(如果是这样,是不是对整个路径中的每个关系都执行检查)评估),还是仅在详尽搜索结束时执行以进行过滤?另外,您能否提供有关根节点(cin1 类型)的任何信息?那里有多少?他们平均有多少感兴趣的关系?在它们之间迭代查询是否比像现在这样使用一个超级查询更有意义?
标签: neo4j cypher graph-databases