2017-04-01 125 views
1

我有两种类型的节点(node1)和(node2),每个节点有大约100,000条记录。我具有一种类型的关系:只对100行(a)的Neo4j过滤器的关系

这两个节点之间。如果我个人资料[类型1]: MATCH (a:node1)-[:TYPE1]->(b:node2) RETURN a.field1, b.field2

它说,做了NodeByLabelScan与80000次分贝命中,然后使用关系到筛选到100行我想要更多的分贝点击。该查询确实会返回我想要的行,但是如何让neo4j分析器将[:TYPE1]视为启动执行路径的最低基数?

在Windows 10

感谢

+0

也许尝试在暗号使用提示https://neo4j.com/docs/developer-manual/current/ cypher/query-tuning /使用/ –

+0

我可能忽略了一些东西,但我研究过,但是提示强制索引使用节点或节点扫描。我需要强制使用关系类型作为优选的限制因素。 – AndyP1970

回答

4

As InverseFalcon表示Neo4j的模式索引不适用于关系。他提出的方法是有效的。还有另一种选择:使用节点标签。

例如,添加节点和关系:

CREATE (n1:node1) 
CREATE (n2:node2) 
CREATE (n1)-[r:TYPE1]->(n2) 
SET n1:REL_OUT_TYPE1, 
    n2:REL_IN_TYPE1 
RETURN n1, n2, r 

搭配:

MATCH (n1:node1:REL_OUT_TYPE1)-[:TYPE1]->(n2:node2:REL_IN_TYPE1) 
RETURN n1, n2 
+0

使用此解决方案,并从185000到40000削减dbhits。谢谢。会喜欢Neo4j支持关系索引。 – AndyP1970

3

的Neo4j的模式索引使用的Neo4j V 3.1.2不适用的关系,所以你需要使用传统的指标来代替。 APOC Procedures支持这些,并且将是按类型查找关系的最简单方法。当你有机会利用这个优势时,肯定会安装APOC。

但是,APOC针对这些索引的方法是按类型和属性,而不是单独的类型。这可能需要您为该类型的所有关系添加占位符属性,以便将它们添加到手动索引中并在稍后查询。

事情是这样的:

MATCH (:node1)-[r:TYPE1]->(:node2) 
SET r.indexed = true 
CALL apoc.index.addRelationship(r,['indexed']) 
RETURN DISTINCT 1 

一旦这样做了,你可以使用APOC查找通过关系指数关系:

CALL apoc.index.relationships('TYPE1','indexed:true') YIELD rel 
WITH startNode(rel) as a, endNode(rel) as b 
RETURN a.field1, b.field2 

您还可以使用*:*在上面的查询的属性查找以节省一些击键。

请注意,这些索引是手动的,不是自动的,因此您需要将此应用于任何新的:要添加的TYPE1关系。

正在实现自动更新APOC中的手动索引的支持,一些问题仍在解决之中,我不认为这些说明已被添加到文档中。