Neo4j和Lucene多键查询(或者:我应该使用Cypher吗?)

时间:2012-04-16 15:59:45

标签: graph lucene neo4j cypher

我在Neo4j中有一个图表,其中节点表示平面中的随机点,每个节点都将坐标存储为属性(x和y,值类型为double)。
我创建节点并索引它们:

    IndexManager index = graph.index();
    Index<Node> nodesIndex = index.forNodes("points");

    for (int i = 0; i < points.length; i++) {
        Point p = points[i]; 
        Node n;

        Transaction tx = graph.beginTx();
        try {
            n = graph.createNode();
            n.setProperty("x", p.getX());
            n.setProperty("y", p.getY());

            nodesIndex.add(n, "x", new ValueContext(p.getX()).indexNumeric());
            nodesIndex.add(n, "y", new ValueContext(p.getY()).indexNumeric());

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

现在,我需要做的是查询方形区域中的节点。例如,我做了这个查询:

http://localhost:7474/db/data/index/node/points?query=x:[0.0 TO 3.0] AND y:[0.0 TO 3.0]

这就是回应:

    Node
    Properties
    y   1.0
    x   14.0
    Node info
    self    /db/data/node/10

    Node
    Properties
    y   1.0
    x   2.0
    Node info
    self    /db/data/node/7

    Node
    Properties
    y   1.0
    x   6.0
    Node info
    self    /db/data/node/8

    Node
    Properties
    y   1.0
    x   7.0
    Node info
    self    /db/data/node/9

[Etc...]

如你所见它不起作用。我不明白为什么(也许我需要配置索引?) 请注意,我没有 使用Lucene。如果有一种方法可以收集Cypher的信息(从以方形区域为中心的节点开始)实际上会更好,因为我还需要找到的节点之间的关系。

其他信息 如果这很重要,图表表示平面上随机点集上的Delaunay三角剖分。用更抽象的术语来说,我需要“提取”放置在给定区域中的整个子图。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

恐怕你不能通过Cypher做到这一点。 Cypher无法推断出您希望为此查询使用数值上下文(可能在将来的版本中可能存在一些索引元信息),并且您需要能够以您希望的方式查询Lucene。通过REST的最简单方法可能是使用Groovy,请参阅http://docs.neo4j.org/chunked/snapshot/gremlin-plugin.html#rest-api-send-an-arbitrary-groovy-script---lucene-sorting上的自定义排序(同一问题)