That is great info. This is a useful graph transformation common in SNA tools like Pajek and Gephi (with a plugin), so nice I can do it directly in Neo4j without needing to do post-processing at the application side. I did encounter a syntax error on the "WHERE" clause when trying out the query, e.g., Neo.ClientError.Statement.InvalidSyntax, Invalid input 'H': expected 'i/I' (line 5, column 2 (offset: 133)) "WHERE id(e2) > id(e1)" But after injecting a "WITH" clause it worked fine:
MATCH (entity:Entity)-[:LINKS_TO]->(doc:Document) WITH doc, collect(entity) as entities UNWIND entities as e1 UNWIND entities as e2 WITH e1, e2, doc WHERE id(e2) > id(e1) RETURN e1, e2, doc On Sunday, April 26, 2015 at 4:30:22 AM UTC-4, Michael Hunger wrote: > Foreach is just iterating over a list and in this case creates a > "cross-product". > > instead of using foreach you can also use unwind, which turns collections > back into rows, like this > > MATCH (entity:Entity)-[:LINKS_TO]->(doc:Document) > WITH doc, collect(entity) as entities > UNWIND entities as e1 > UNWIND entities as e2 > WHERE id(e2) > id(e1) > RETURN e1,e2,doc > > > Am 25.04.2015 um 17:28 schrieb Dan <[email protected] <javascript:>>: > > Thanks Michael, that definitely works. > > A final question is there a way to do similar but to only return the > links, not create them? I see that FOREACH statement is apparently used to > write to database (update, create, etc). I was trying to see how to do > similar but only return the links (not actually create them in database). > Not sure if some nested EXTRACT statements would do it. Thanks. > > On Friday, April 24, 2015 at 10:40:23 PM UTC-4, Michael Hunger wrote: > >> ah, so what I said >> >> >> MATCH (entity:Entity)-[:LINKS_TO]->(doc:Document) >>> WITH doc, collect(entity) as entities >>> >> FOREACH (e1 in entities | FOREACH (e2 in filter(e in entities >> WHERE id(e) > id(e1)) | CREATE (e1)-[:RELATED_TO]->(e2))) >> >> Michael >> >> Am 25.04.2015 um 04:33 schrieb Dan <[email protected]>: >> >> Thanks for info Michael. I believe that query will return the list of >> entities common to each document. What I’m really after is generating >> dynamically (via Cypher) a new graph result (relationships) comprised of >> only one node type derived from the underlying bipartite graph (two node >> types). >> >> e.g., >> >> >> http://image.slidesharecdn.com/pn2013-130704162301-phpapp01/95/sna-in-technologyenhanced-learning-a-shift-to-personal-network-perspective-using-clustered-graphs-9-638.jpg?cb=1373000400 >> >> So if neo4j database includes links between entities and documents, I >> want to generate a new graph result that would just contain links between >> one entity type: entities to entities or documents to documents. These >> new dynamic (query time) links would be based on shared connections between >> entities and documents in the underlying graph database. >> >> So if E1 is linked to D1 and D2, E2 is linked to D1, and E3 is linked to >> D3, a Cypher query would return: >> >> 1) 1) For a entity only graph result: E1 linked to E2 and E3 by >> itself. >> >> 2) 2) For a document only graph result: D1 linked to D2 and D3 by >> itself. >> >> Thanks, Dan >> >> >> On Friday, April 24, 2015 at 9:04:43 PM UTC-4, Michael Hunger wrote: >>> >>> Do you mean something like this? >>> >>> MATCH (entity:Entity)-[:LINKS_TO]->(doc:Document) >>> RETURN doc, collect(entity) as entities >>> >>> Michael >>> >>> Am 25.04.2015 um 02:38 schrieb Dan <[email protected]>: >>> >>> I was wondering if it is possible to generate a single mode graph >>> projection from a bipartite (2-mode) graph via a Cypher query? >>> >>> e.g., >>> http://upload.wikimedia.org/wikipedia/commons/f/f9/Bipartite_network_projection.png >>> >>> So let's say I have text mining related data such as entities (X) linked >>> to documents (Y) in a neo4j graph database. And I want a query result >>> set that links X's to X's (for example) based on links to common Y's. Can >>> such be done via a Cypher query sequence? >>> >>> Thanks, Dan >>> >>> -- >>> 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 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 the Google Groups > "Neo4j" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] <javascript:>. > 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.
