2013-05-03 63 views
0

我想知道如何构建一个Cypher查询,它将使用spring数据neo4j将全文和简单索引结合起来。请看下面的节点实体:Spring Data Neo4j - 在同一个Cypher查询中合并全文和简单索引

@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; 
    } 
} 

OK,所以我的问题是我怎么可以运行一个查询(通过使用SomeObject图形库)将从SomeObject节点开始,通过引用其简单的索引和全文索引在相同的查询中。例如我想写出这样的事情:

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

我知道,我不能写它完全一样的,因为春季数据Neo4j的力量我为那些需要进行全文索引的字段给一个单独的索引名。但是,如果我需要为我的SomeObject实体组合这两个文件的索引查找呢? (名称&高度)

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

谢谢! Roy。

回答

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 
+0

我想到了两个选项: 1.所以第一个选项是运行两个查询,并然后手动交叉两个查询的结果,所以我将留下满足两个查询条件的节点。 2.其他选项可能类似于您所写的内容(您建议的第二个查询),但还要添加一个WHERE子句以确保** m **和** n **的图形ID是同样的,所以我只会得到满足两个条件的节点。可能吗?我现在无法检查,但我会尽量在今天晚上给出答案。 – gipouf 2013-05-07 13:30:37

+0

添加WHERE子句不会有帮助,但我不知道任何其他选项。请让我知道我的第一个查询的性能是什么。 – tstorms 2013-05-07 13:35:12

+0

我会试试看,谢谢 – gipouf 2013-05-07 13:37:37