【问题标题】:Filter neo4j nodes by subtracting nodes that are returned by index通过减去索引返回的节点来过滤 neo4j 节点
【发布时间】:2013-06-18 20:18:14
【问题描述】:

我的节点有一个数组属性category_ids,其中包含整数。

我可以查询category_ids与列表[1,2,3]中的任何一个都不匹配的节点:

START node(*)
WHERE NOT(ANY(x in node.category_ids WHERE x IN [1,2,3]))
RETURN node;

我可以使用索引(我称之为nodes_categories,它是一个标准的精确lucene 索引)从我想要过滤掉的节点开始:

START excluded=node:nodes_categories("category_ids:(1 2 3)")
RETURN excluded;

但是我如何使用我的索引来获得我想要的节点? IE 返回所有节点减去我的索引命中返回的节点?这是我的开始:

START node=node(*), excluded=node:nodes_categories("category_ids:(1 2 3)")
???
RETURN node;

编辑:neo4j 版本是 1.9.M02

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    天真的方式(更新):

    START node=node(*), excluded=node:nodes_categories("category_ids:(1 2 3)")
    WITH collect(excluded) as excluded, node
    WHERE not node in(excluded)
    RETURN distinct node;
    

    更好的方法是弄清楚如何仅查询您想要的节点的索引。不过,我不确定是否有办法在 lucene 语法中做到这一点。可能是这样的:

    START node=node:nodes_categories('category_ids:(* NOT 1 NOT 2 NOT 3)')
    return node;
    

    【讨论】:

    • 这种天真的方式似乎只有在索引命中返回单个节点时才有效,否则它会返回所有节点,包括索引命中中的节点。更好的方法确实有效。但我想包含索引中缺少的节点,所以我真的很想以一种天真的方式工作。
    • 如果索引命中返回 0 个节点,那么幼稚的方式也会一起返回 0 个节点。我可以安全地假设索引命中将返回至少 1 个节点,但我指出这一点是为了帮助弄清楚发生了什么。
    • 嗯,好的。我想我一直没有想到。
    • 这是第二次尝试。它使用了一个集合,所以效率可能不是很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多