2013-08-07 57 views
0

有一些問題CYPHER查詢和數字指標Neo4j和spring-data:數字索引密碼查詢不起作用?

@Indexed(unique = true, numeric = false) 
private Long accountId; 

返回:

neo4j-sh (0)$ start n=node:Principal(accountId = '1') return n;  
+---------------------------------------------------------------------------------------------+ 
| n                       | 
+---------------------------------------------------------------------------------------------+ 
| Node[41722]{__type__:"example.package.Principal",accountId:1,name:"Simple User"} | 
+---------------------------------------------------------------------------------------------+ 
1 row 

@Indexed(unique = true, numeric = true) 
private Long accountId; 

返回:

neo4j-sh (0)$ start n=node:Principal(accountId = '1') return n; 
+---+ 
| n | 
+---+ 
+---+ 
0 row 

Neo4j的1.9.2
彈簧數據的Neo4j 2.3.0.RC1

如果我正確理解這可能是ralted這discussion,但它是很老?

UPDATE:

如果我使用

@Indexed(unique = true, numeric = false) 

另一個有趣的事情發生了。檢查是否存在關係(它actualy在分貝存在):

計數(r)是等於0 - 不正確的:

Long accountId = 1L; 
Map<String, Object> result = template.query(
     "START child=node:Principal(accountId='{childId}') " + 
       "MATCH child-[r:IS_MEMBER_OF]->parent " + 
       "RETURN count(r)", MapUtil.map("childId", accountId)).singleOrNull(); 

計數(r)是等於1 - 正確的:

Long accountId = 1L; 
Map<String, Object> result = template.query(
     "START child=node:Principal(accountId='1') " + 
       "MATCH child-[r:IS_MEMBER_OF]->parent " + 
       "RETURN count(r)",null).singleOrNull(); 

回答

1

數字索引查找不適用於密碼文字值,lucene分析器不會創建正確的內部查詢。同樣,在參數中,傳遞給索引的普通基本值在neo4j lucene實現中被視爲字符串,因爲查詢無法知道數據是以數字形式還是字符串索引。

// this won't work, you have to remove the single quotes around '{childId}' 
"START child=node:Principal(accountId='{childId}') " + 

    "MATCH child-[r:IS_MEMBER_OF]->parent " + 
    "RETURN count(r)", MapUtil.map("childId", accountId)).singleOrNull(); 

你得到的數字的查詢與CYPHER工作的唯一辦法是在ValueContext.numeric(1)值傳遞作爲參數在Java參數映射到嵌入式數據庫。

+0

還有一個問題,我是否正確承認這一點,如果我使用@Indexed(unique = true,numeric = true),那麼我不能從neo4j控制檯/ Neoeclipse執行密碼查詢? – gerasalus