关系

时间:2017-04-01 15:10:42

标签: neo4j cypher

我有两种类型的节点(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

由于

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中的手动索引,还有一些问题正在解决,我认为这方面的说明尚未添加到文档中。