我有两种类型的节点(node1)和(node2),每种节点有大约100,000条记录。我在(a)
的100行中的这两个节点之间有一种关系[:TYPE1]如果我描述:
MATCH (a:node1)-[:TYPE1]->(b:node2) RETURN a.field1, b.field2
它说它有一个具有80,000+ db命中的NodeByLabelScan,然后使用该关系过滤到我想要的100行以及更多db命中。查询确实返回了我想要的行,但是如何让neo4j分析器查看[:TYPE1]作为启动执行路径的最低基数?
在Windows 10上使用Neo4j V 3.1.2
由于
答案 0 :(得分:4)
正如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
答案 1 :(得分:3)
Neo4j的架构索引不适用于关系,因此您需要使用旧版索引。 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中的手动索引,还有一些问题正在解决,我认为这方面的说明尚未添加到文档中。