【问题标题】:Relationship auto-indexing in Neo4J 3.x vs 2.xNeo4J 3.x 与 2.x 中的关系自动索引
【发布时间】:2018-02-19 17:13:57
【问题描述】:

在 Neo4J 2.x 中,我使用了关系的自动索引,然后我可以根据已索引的关系属性进行搜索。

在 Neo4J 3.x 中这不起作用。

在 Neo4J 2.x 中,我设置为 neo4j properties

relationship_auto_indexing=true

并设置要使用索引的关系的几个属性

relationship_keys_indexable=user,context,statement,gapscan

然后我将使用旧的 1.x Cypher 查询首先识别TO 类型的用户建立的所有关系,读取他们的上下文属性,然后将其与具有特定上下文属性的节点匹配,然后匹配该用户创建的上下文中的节点并检索它们。查询看起来像

START rel=relationship:relationship_auto_index(user='userid') WHERE TYPE(rel)='TO' WITH DISTINCT rel MATCH (ctx:Context) WHERE rel.context = ctx.uid AND (ctx.name="neo4j3" ) RETURN DISTINCT STARTNODE(rel).uid AS source_id, STARTNODE(rel).name AS source_name, ENDNODE(rel).uid AS target_id, ENDNODE(rel).name AS target_name, rel.uid AS edge_id, ctx.name AS context_name, rel.statement AS statement_id, rel.weight AS weight;

在 Neo4J 3.x 中,此查询不起作用,我相信索引的完成方式不同。

我有两个问题:

1) 我必须手动索引关系还是在 3.x 中自动完成?

2) 我会使用什么查询来代替 START rel=.... - 任何替代使用关系属性进行搜索的方法?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以在 3.X 中做同样的事情,但有所不同。

    是的,您必须手动索引关系。 使用APOC,您可以为您的关系创建手动索引。

    这是填充索引的查询:

    MATCH ()-[r:MY_RELATIONSHIPS]->()
    CALL apoc.index.addRelationship(r,['user'])
    RETURN count(*)
    

    然后您可以检索您的关系,例如:

    CALL apoc.index.relationships('MY_RELATIONSHIPS','userid:userid') YIELD rel, start , end
    RETURN rel, start, end
    

    文档链接:https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_using_manual_index_on_relationship_properties

    此外,要自动填充手动索引,您还可以使用 apoc (https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_triggers_examples) 创建触发器

    【讨论】:

    • 太好了,谢谢@logisima。我唯一的更正是我的请求应该修改为CALL apoc.index.relationships('MY_RELATIONSHIPS','user:userid') YIELD rel, start, end WITH DISTINCT rel, start, end MATCH (ctx:Context) WHERE rel.context = ctx.uid AND (ctx.name="neo4j3" ) RETURN DISTINCT start.uid AS source_id, start.name AS source_name, end.uid AS target_id, end.name AS target_name, rel.uid AS edge_id, ctx.name AS context_name, rel.statement AS statement_id, rel.weight AS weight;
    • 我找不到如何为关系填充手动索引...在那里看不到任何示例...我理解这个概念,但他们没有谈论关系索引触发器
    • 我想通了。必须运行 CALL apoc.trigger.add('Index-TO-Relationships',"UNWIND {createdRelationships} AS r MATCH ()-[r:TO]->() CALL apoc.index.addRelationship(r,['user']) RETURN count(*)", {phase:'after'}) 之类的东西才能在关系上添加索引。 (首先在conf 文件中启用触发器)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多