Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Neo4j中快速找到特定路径_Neo4j_Cypher_Graph Databases - Fatal编程技术网

在Neo4j中快速找到特定路径

在Neo4j中快速找到特定路径,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我(喜欢相同的身份证)。这将类似于: MATCH (a {type: 'cin1'})-[rels:Next*1.. {value: 1}]->(b {type: 'cancer'}) RETURN (a), (b) 其中,我将对所有边使用值:相同,而不是值:1 我找到了一种解决这个问题的方法,使用类似的方法(如我在另一个问题中所回答的): 我遇到的问题是,这种方法首先创建所有可能的不同路径,然后过滤它们,在我的例子中,这会创建成倍多的路径。例如,以下图为例 : 给出的方法将首先匹配所

我(喜欢相同的身份证)。这将类似于:

MATCH (a {type: 'cin1'})-[rels:Next*1.. {value: 1}]->(b {type: 'cancer'}) 
RETURN (a), (b)
其中,我将对所有边使用值:相同,而不是值:1

我找到了一种解决这个问题的方法,使用类似的方法(如我在另一个问题中所回答的):

我遇到的问题是,这种方法首先创建所有可能的不同路径,然后过滤它们,在我的例子中,这会创建成倍多的路径。例如,以下图为例

:

给出的方法将首先匹配所有路径:

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等等。因此,这种方法并不十分有效,我想知道是否有更简单的方法

至于优化,我首先考虑优化开始节点和结束节点上的快速匹配的方法,因为这将显著减少扫描的节点

我的直觉是,您可能没有索引:Label.Type,如果这是与节点匹配的主要方法,这可能是需要考虑和测试的。 查看是否可以在开始节点或结束节点上添加标签也可能很有效。至少看起来是这样的:癌症可能会被有效地应用,尽管如果这是一个更通用的医学应用程序,这种查询需要对许多疾病有效,所以我不确定这对你是否可行


在这种情况下,我认为最好的办法是优化shortestPath(),并对查询进行分析,以确保在计算shortestPath时使用WHERE ALL子句,而不是在穷尽搜索后作为过滤器使用(请参阅和)。如果分析显示它被用作过滤器,而不是在构造最短路径时使用,您将想看看是否可以选择一个更有效的谓词,对于不匹配的模式,最短路径将很快失败。

有什么方法可以优化您的关系吗?现在我的假设是,它们都使用相同的标签,具有不同的属性。你能把它们改成标签吗?或者这不可行吗?不可行:/基本上你有太多的标签,我很害怕。虽然我理解您对性能的担忧,但我想知道您是否已经在示例数据集上运行了此功能,以确认性能确实是一个问题。我猜你有一个巨大的数据集和一个相当庞大的连接网络?是的!几十万个节点!它在一个较小的数据集上运行得很好,但我想知道WHERE ALL子句……是在最短路径执行中使用的(如果是的话,是在每次求值时对整个路径中的每一个关系执行检查),还是仅在要筛选的穷举搜索结束时执行?此外,您能否提供有关根节点的任何信息(输入cin1)?有多少人?他们平均有多少感兴趣的关系?在它们之间迭代查询比像现在这样使用一个超级查询更有意义吗?
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 
...