【问题标题】:Spring Data Neo4j - Combining Fulltext and Simple Indexes in the same Cypher querySpring Data Neo4j - 在同一个 Cypher 查询中结合全文和简单索引
【发布时间】:2013-05-03 13:35:06
【问题描述】:

我想知道如何构建一个 Cypher 查询,该查询将使用 spring data neo4j 结合全文和简单索引。考虑以下节点实体:

@NodeEntity
public class SomeObject {

    public SomeObject() {

    }

    public SomeObject(String name, int height) {
        this.name = name;
        this.height = height;
    }

    @Indexed(indexType = IndexType.FULLTEXT, indexName = "search_name")
    String name;

    @Indexed(numeric = false)
    int height;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

好的,所以我的问题是如何通过在同一查询中引用它们的简单索引和全文索引来运行从SomeObject 节点开始的查询(通过使用SomeObject 图形存储库)。例如我想写这样的东西:

START n=node:SomeObject('name: Roy AND height: [170 TO 190]') RETURN n

我知道我不能完全那样写,因为 spring data neo4j 迫使我为需要 FULLTEXT 索引的字段提供单独的索引名称。但是,如果我需要为结合了两个文件的SomeObject 实体进行索引查找怎么办? (姓名和身高)

在这种情况下,最佳做法是什么?有没有办法将它们结合在同一个查询中?或者也许我应该分别查询它们中的每一个,然后在两个结果之间执行某种交集,所以我会得到完全符合我原始查询查找条件的节点? (name: Roy AND height: [170 TO 190])。

谢谢! 罗伊。

【问题讨论】:

    标签: spring neo4j spring-data cypher spring-data-neo4j


    【解决方案1】:

    我永远不会启动两个单独的查询。也许只使用一个索引作为查询的起点?

    START n=node:search_name('name: Roy')
    WHERE n.height >= 170 AND n.height <= 190
    RETURN n
    

    此查询的性能如何?这绕过了 SomeObject 索引,但我没有看到任何其他选项,因为您确实无法合并两个索引。

    我也在考虑以下查询,但您仍然会得到重复:

    START n=node:search_name('name: Roy'), m=node:SomeObject('height: [170 TO 190]')
    RETURN DISTINCT n,m
    

    【讨论】:

    • 我想到了两个方案: 1.所以第一个方案是运行两个查询,然后手动将两个查询的结果相交,这样我就剩下满足条件的节点了两个查询。 2.另一个选项可能类似于您编写的内容(您建议的第二个查询),但还添加了一个 WHERE 子句,以确保 m 和 n 的图形 ID b> 是一样的,所以我只会得到满足这两个条件的节点。可能吗?我现在无法检查,但我会在今晚尝试给出答案。
    • 添加 WHERE 子句无济于事,但我不知道任何其他选项。请让我知道我的第一个查询的性能如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 2014-05-30
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多