首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >neo4j和java集合搜索

neo4j和java集合搜索
EN

Stack Overflow用户
提问于 2013-07-31 21:41:41
回答 1查看 156关注 0票数 0

嗨,我想用运算符IN搜索,但总是返回一个空的列表,有什么问题吗?我的单元测试。我想要的是通过描述或相似的词来搜索产品。(未来我假装是模糊的)。

代码语言:javascript
复制
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));
}

这是Product

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-01 08:34:55

我希望我把你的用词做对了。但我觉得你的赛弗查询有点混乱。您的查询:

代码语言:javascript
复制
"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数组了。

最后我想你还有别的意思,就是。

代码语言:javascript
复制
 'tv' IN n.similarities

这是对的吗?您希望检查字符串tv是否包含在similarities数组中。当我以这种方式更改查询时,即产生的查询将是

代码语言:javascript
复制
start n=node:node_product('PRODUCT:*') WHERE HAS(n.similarities) AND 'tv' IN n.similarities return n.description

然后,改编后的测试课程对我有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17981501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档