【问题标题】:Neo4j filter on relationshipNeo4j 过滤关系
【发布时间】:2017-04-01 15:10:42
【问题描述】:

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

谢谢

【问题讨论】:

标签: neo4j cypher


【解决方案1】:

正如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

【讨论】:

  • 使用此解决方案并将 dbhits 从 185000 减少到 40000。谢谢。希望 Neo4j 支持关系索引。
【解决方案2】:

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 中的手动索引的支持,一些问题仍在解决中,我认为文档中尚未添加相关说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多