2013-07-31 72 views
0

嗨我试图搜索使用运算符IN,但总是返回一个空列表,什么是错的?波纹管我的单元测试。我想要的是通过描述或相似词来搜索产品。 (未来我假装实现模糊)。neo4j和java收集搜索

private GraphDatabaseService graph; 
private Index<Node> indexProduct; 
private ExecutionEngine engine; 

@Before 
public void prepareTestDatabase() { 
    TestGraphDatabaseFactory testGraphDatabaseFactory = new TestGraphDatabaseFactory(); 
    this.graph = testGraphDatabaseFactory.newEmbeddedDatabase("/tmp/neo4j/tests"); 
    this.indexProduct = this.graph.index().forNodes("node_product"); 
    this.engine = new ExecutionEngine(this.graph, StringLogger.SYSTEM); 
    this.loadDataForTest(); 
} 

private void loadDataForTest() { 
    Transaction tx = this.graph.beginTx(); 

    List<String> similarities = new ArrayList<>(); 
    similarities.add("televisor"); 
    similarities.add("tv"); 
    String description = "televisão"; 
    Product product = new Product(description, similarities); 

    Node node = this.graph.createNode(DynamicLabel.label(product.description)); 
    node.setProperty("description", product.description); 
    node.setProperty("similarities", product.similarities); 

    this.indexProduct.add(node, "PRODUCT", product.description); 

    tx.success(); 
    tx.finish(); 
} 

@Test 
public void searchByDescription(){ 
    String description = "televisão"; 

    List<String> list = new ArrayList<>(); 
    ExecutionResult result = this.engine.execute("start n=node:node_product('PRODUCT:*') WHERE HAS(n.similarities) AND n.similarities IN ['tv'] return n.description"); 
    for (Map<String, Object> row : result) { 
     for (Entry<String, Object> column : row.entrySet()) { 
      Object value = column.getValue(); 
      list.add(String.valueOf(value)); 
     } 
    } 

    Assert.assertTrue(list.contains(description)); 
} 

这是产品类

class Product { 
    String description; 
String[] similarities; 

Product(String description, List<String> similaritiesList) { 
    super(); 
    this.description = description; 
    this.similarities = new String[similaritiesList.size()]; 
    for (int i=0; i<similaritiesList.size(); i++) 
     this.similarities[i] = similaritiesList.get(i); 
} 

回答

1

我希望我有你的用例的权利。但是我认为你的Cypher查询有点混乱。 您的疑问:

"start n=node:node_product('PRODUCT:*') WHERE HAS(n.similarities) AND n.similarities IN ['tv'] return n.description" 

让对n.similarities IN ['tv']看看。属性similarities是一个数组。 ['tv']是一个字符串数组。因此,表达式`n.similarities IN ['tv']总是计算为false,因为['tv']不包含任何数组,更不用说similarities数组。

最后,我只是想你的意思是别的东西,即。

'tv' IN n.similarities 

这是正确的吗?您想要检查similarities阵列中是否包含字符串tv。当我改变了查询方式,即生成的查询将

start n=node:node_product('PRODUCT:*') WHERE HAS(n.similarities) AND 'tv' IN n.similarities return n.description 

然后,改编测试类为我工作。

+0

这就是它的人...我刚刚开始与neo4j昨天...谢谢 – giullianomorroni