Hi all,
Last night I had some time to play with Neo4j (1.1) API. I do have a
couple of questions and comments that I'd like to share with you:
1. The documentation I've found mentions that `Node` IDs are not
"permanent". I'm wondering why are IDs exposed them?
2. I was surprised to see a `Node`.delete() failing. The reason was it
had relationships. I think adding a method `Node`.delete(boolean
force) would
make code much easier. The method would automatically:
- remove all relationships
- clean up indexes
Note 1: I've been able to implement locally such a method in an
utility class and it seems to work without any problems. Anyways
another thing that I've found a bit weird was that I had to use
separate reference to GraphDatabaseService and 2 IndexServices (a
simple LuceneIndexService and a LuceneFulltextIndexService). I think
it would once again simplify a lot of things if these IndexServices
would be available through the GraphDatabaseService API.
Note 2: as far as I can say this would be a non-breaking API change
3. I was a bit confused when trying to index a new node as I wasn't
sure what's the last parameter in `IndexService.index(Node, String,
Object)`.
While understanding the flexibility this would offer, I'd speculate
that most of the time you'd want to actually index the values set in
the Node, so an
API like `IndexService.index(Node, String... properties)` would once
again simplify a lot of code.
Note: as far as I can say this is a non-breaking API change
4. Q: while running my tests, I've tried to clean up data behind. Thus
I've discovered that I can delete the so called "reference node". That
made me wonder: if it is a default node, why allowing to be deleted?
5. Q: by looking at the documentation I couldn't figure out for sure
if you are allowed to use both a LuceneIndexService and
LuceneFullIndexService. My tests seem to work while using both, but
I'm not sure if that is what's suppose to happen.
6. I've run into a test where LuceneFullIndexService doesn't seem to
return what I'm expecting. But I'm not a Lucene specialist so maybe
I'm doing something wrong. Code below:
package com.mypopescu.neo4j;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.Transaction;
import org.neo4j.index.IndexHits;
import org.neo4j.index.IndexService;
import org.neo4j.index.lucene.LuceneFulltextIndexService;
import org.neo4j.kernel.EmbeddedGraphDatabase;
import java.io.File;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* @author Alex Popescu
* @since Sep 3, 2010
*/
public class LuceneFulltextIndexServiceTest {
static GraphDatabaseService gds;
static IndexService fulltextIndex;
@BeforeClass
public static void setup() {
gds= new EmbeddedGraphDatabase("data/neodb/neodb-tmp");
fulltextIndex= new LuceneFulltextIndexService(gds);
}
@Test
public void fullTextIndex() {
Transaction tx= gds.beginTx();
try {
Node ndOne= gds.createNode();
ndOne.setProperty("ft", "some text in here to be fully indexed");
fulltextIndex.index(ndOne, "ft", ndOne.getProperty("ft"));
Node ndTwo= gds.createNode();
ndTwo.setProperty("ft", "some other text in there not to
be indexed uniquely");
fulltextIndex.index(ndTwo, "ft", ndTwo.getProperty("ft"));
tx.success();
}
finally {
tx.finish();
}
IndexHits<Node> ns= fulltextIndex.getNodes("ft", "some text");
assertThat(ns.size(), is(2));
for(Node n : ns) {
System.out.printf("Full text n...@%s: {%s}%n", n.getId(),
n.getProperty("ft"));
}
ns= fulltextIndex.getNodes("ft", "some text indexed");
assertThat(ns.size(), is(2));
for(Node n : ns) {
System.out.printf("Full text n...@%s: {%s}%n", n.getId(),
n.getProperty("ft"));
}
ns= fulltextIndex.getNodes("ft", "indexed text");
assertThat(ns.size(), is(2));
for(Node n : ns) {
System.out.printf("Full text n...@%s: {%s}%n", n.getId(),
n.getProperty("ft"));
}
ns= fulltextIndex.getNodes("ft", "uniquely text");
assertThat(ns.size(), is(1));
for(Node n : ns) {
System.out.printf("Full text n...@%s: {%s}%n", n.getId(),
n.getProperty("ft"));
}
// THIS ONE IS FAILING
ns= fulltextIndex.getNodes("ft", "uniquely OR text");
assertThat("actually it should find 2", ns.size(), is(2));
for(Node n : ns) {
System.out.printf("Full text n...@%s: {%s}", n.getId(),
n.getProperty("ft"));
}
}
@AfterClass
public static void shutdown() {
fulltextIndex.shutdown();
gds.shutdown();
}
}
7. I was wondering what is the best way to clean up a temporary test database.
My apologies in advance for such a long email (I usually don't do
this). And thanks in advance for all your answers,
:- alex
_______________________________________________
Neo4j mailing list
[email protected]
https://lists.neo4j.org/mailman/listinfo/user