Let me check that I understand all this correctly. There are two options to achieve the fulltext index at the moment: - (legacy?) manual fulltext index, which is how it is configured for me right now, where SDN handles the operation of adding things to the index but that means that when I add the nodes from Cypher, the index entries do not get created - legacy automatic fulltext index, where Neo4j would automatically maintain the index when data is inserted/edited, but SDN wouldn't be able to touch that index
What I don't get is why making SDN understand the second option is a big effort. My naive understanding is that what SDN does behind the scenes in the first case is something like: - save node, setting the value of the indexed field - add the index entry - something along the lines of: graphDb.index().forNodes( "locations" ).add( city, "name", city.getProperty( "name" ) ); If we let Neo4j handle adding to the the index, isn't it simply a matter of adding a new index type so that you can specify it in the annotation and then removing the second step for writes (+ a slight change on schema creation)? Why do the reads/queries need to change as well - do you need to provide the details of the index when building the query? On Tue, Jul 1, 2014 at 11:04 AM, Michael Hunger <[email protected]> wrote: > Yep, that would work. > > And yes, it is planned to add automatic fulltext, spatial and other indexes > to Neo4j in the future. > > But let's try to work out together an easy way to get the full text > functionality working nonetheless. Would be a fun challenge :) > > > > On Tue, Jul 1, 2014 at 11:09 AM, Liliana Ziolek <[email protected]> > wrote: >> >> Would it help if the index wasn't a full text index but a normal one - >> would that make it work? >> >> More importantly, you say that cypher won't support writing to legacy >> indexes - and as I understand, currently full text index is of legacy type. >> Is there a plan to introduce a new, cypher-supported full text index in the >> future neo4j? I'd be happy to go with standard index for now if there was >> hope that in the future I can just change the index type and go. >> >> Thanks! >> >> Sent from my shiny Nexus 5 phone >> >> On Jul 1, 2014 9:32 AM, "Michael Hunger" >> <[email protected]> wrote: >>> >>> Hey, >>> >>> you are totally right, this sucks. Let me explain why. >>> >>> right now Cypher can't update fulltext indexes, which SDN uses. These are >>> the legacy Neo4j indexes which require manual addition. >>> You're right this is really sucky, but except for coding (i.e. manually >>> adding the nodes, properties, values to that fulltext index) or using the >>> neo4j-shell for that index-update, I have no good idea. >>> >>> It was decided consciously that Cypher will not support writing to legacy >>> indexes. >>> >>> The only thing that you can do is to use a legacy auto-index configured >>> as fulltext, but as that index is read-only, SDN can't write to it, so the >>> field would have to be "read-only". Or we would have to add something to SDN >>> that marks a field as using that legacy auto-index and never actually >>> writing to the index itself. But then that also means this has to be taken >>> into account with every other read operation and query generation which >>> makes it a pretty big effort. >>> >>> So for now I'd rather advise to implement the CSV loading as SDN code >>> using OpenCSV as reader (which is what cypher uses too). >>> >>> String[] header = reader.nextRow(); >>> for (String[] row : reader.nextRow()) { >>> City city = template.save(new >>> City(get(row,header,"City"),template.save(new >>> Country(get(row,header,"Country"))); >>> Airport ap = template.save(new >>> Airport(get(row,header,"Airport"),get(row,header,"IATAcode"),get(row,header,"ICAOcode")); >>> ap.serve(city); >>> template.save(ap); >>> } >>> >>> Sorry for being not more helpful, >>> >>> Cheers, >>> >>> Michael >>> >>> On Tue, Jul 1, 2014 at 9:46 AM, Liliana Ziolek <[email protected]> >>> wrote: >>>> >>>> Oh, in case that helps, I'm using Neo4j 2.1.2 and SDN 3.2.0-SNAPSHOT. >>>> >>>> >>>> On Tuesday, July 1, 2014 8:46:00 AM UTC+1, Liliana Ziolek wrote: >>>>> >>>>> Hi, >>>>> I'm trying to do - I thought - a rather simple thing - import data >>>>> through CSV import and then work with it via SDN. It doesn't seem to be >>>>> working though and not sure if I'm doing something silly or it doesn't >>>>> work. >>>>> It seems to me that the data is created fine and SDN can access it via >>>>> findAll method, but it cannot find it using the indexed field. >>>>> >>>>> My POJO is quite simple, the important bit: >>>>> >>>>> public class City extends GraphNode { >>>>> @Indexed(indexType = IndexType.FULLTEXT, indexName = "locations") >>>>> private String name; >>>>> (... other fields) >>>>> } >>>>> >>>>> I have an SDN repository with the following methods: >>>>> public interface CityRepository extends GraphRepository<City> { >>>>> Page<City> findByNameLike(String name, Pageable page); >>>>> List<City> findByName(String cityName); >>>>> ... >>>>> } >>>>> On top of that a super-simple service that pretty much just wraps that >>>>> into @Transactional. >>>>> >>>>> Everything works fine when I use SDN to put the data in and take it >>>>> out, this passes fine: >>>>> locationService.addCity("Poznan", "Poland"); >>>>> List<City> citiesByNameLike = >>>>> locationService.getCitiesByNameLike("Pozn*"); >>>>> assertThat(citiesByNameLike, hasSize(1)); >>>>> assertThat(locationService.getCitiesByName("Poznan"), >>>>> equalTo(citiesByNameLike)); >>>>> >>>>> However, when I import it via CSV import and MERGE, even though I can >>>>> see that the city is actually there (when I run findAll), it doesn't come >>>>> back when I try to look it up by name. >>>>> CSV import query: >>>>> //csv fields: Airport,City,Country,IATAcode,ICAOcode >>>>> String cypherLoadCountries = "LOAD CSV WITH HEADERS FROM \"" + >>>>> fileLocation + "\" AS csvLine " >>>>> + "MERGE (country:Country:_Country { name: >>>>> csvLine.Country } ) " >>>>> + "MERGE (city:City:_City { name: csvLine.City } ) " >>>>> + "MERGE (city) - [:IS_IN] -> (country) " >>>>> + "MERGE (airport:Airport:_Airport {name: >>>>> csvLine.Airport, iataCode: csvLine.IATAcode, icaoCode: csvLine.ICAOcode} >>>>> ) " >>>>> + "MERGE (airport) - [:SERVES {__type__: >>>>> 'AirportCityConnection'}] -> (city)"; >>>>> neo4jTemplate.query(cypherLoadCountries, ImmutableMap.of()); >>>>> >>>>> Am I doing something silly here? Is there meant to be a call to switch >>>>> on indexing or perhaps SDN indexes a different field? >>>>> Any help appreciated. >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Neo4j" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>> >>> >>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "Neo4j" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/neo4j/w44ApzfsRQI/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> [email protected]. >>> >>> For more options, visit https://groups.google.com/d/optout. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Neo4j" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. > > > -- > You received this message because you are subscribed to a topic in the > Google Groups "Neo4j" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/neo4j/w44ApzfsRQI/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > For more options, visit https://groups.google.com/d/optout. -- Liliana "Write your code as if the person maintaining it is a homicidal maniac who knows where you live." -- You received this message because you are subscribed to the Google Groups "Neo4j" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
