2012-04-16 3 views
0

Neo4j에서 평면에있는 임의의 점을 나타내는 그래프가 있는데, 각 노드는 좌표가 속성으로 저장되어 있습니다 (x 및 y, 값 유형은 double).Neo4j 및 Lucene 다중 키 쿼리 (또는 : Cypher를 사용해야합니까?)

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 삼각 측량을 나타내는 것입니다. 좀 더 추상적 인 용어로, 주어진 영역에있는 전체 서브 그래프를 "추출"해야합니다.

도움이 정말 감사합니다!

답변

0

저는 Cypher를 통해이 작업을 수행 할 수 없습니다. Cypher가이 쿼리에 대한 숫자 값 컨텍스트 (이후 릴리스에서는 일부 인덱싱 메타 정보에있을 수 있음)를 사용하려는 것으로 추측 할 수있는 방법이 없으므로 Lucene을 원하는 방식으로 쿼리 할 수 ​​있어야합니다. REST를 사용하는 가장 쉬운 방법은 Groovy를 사용하는 것입니다. 맞춤 정렬 (동일한 문제)을 참조하십시오. http://docs.neo4j.org/chunked/snapshot/gremlin-plugin.html#rest-api-send-an-arbitrary-groovy-script---lucene-sorting

+0

좋아, 왜 lucene 쿼리가 작동하지 않습니까? – Metz