33import org .junit .Before ;
44import org .junit .Rule ;
55import org .junit .Test ;
6- import org .neo4j .graphalgo .linkprediction .CommonNeighborsFinder ;
6+ import org .neo4j .graphalgo .linkprediction .NeighborsFinder ;
77import org .neo4j .graphdb .Direction ;
88import org .neo4j .graphdb .Node ;
99import org .neo4j .graphdb .RelationshipType ;
1313
1414import java .util .Set ;
1515
16+ import static org .hamcrest .MatcherAssert .assertThat ;
17+ import static org .hamcrest .core .IsCollectionContaining .hasItem ;
18+ import static org .hamcrest .core .IsCollectionContaining .hasItems ;
1619import static org .junit .Assert .assertEquals ;
1720
18- public class CommonNeighborsFinderTest {
21+ public class NeighborsFinderTest {
1922
2023 @ Rule
2124 public final ImpermanentDatabaseRule DB = new ImpermanentDatabaseRule ();
@@ -39,12 +42,12 @@ public void excludeDirectRelationships() throws Throwable {
3942 tx .success ();
4043 }
4144
42- CommonNeighborsFinder commonNeighborsFinder = new CommonNeighborsFinder (api );
45+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
4346
4447 try (Transaction tx = api .beginTx ()) {
4548 Node node1 = api .getNodeById (0 );
4649 Node node2 = api .getNodeById (1 );
47- Set <Node > neighbors = commonNeighborsFinder .findCommonNeighbors (node1 , node2 , null , Direction .BOTH );
50+ Set <Node > neighbors = neighborsFinder .findCommonNeighbors (node1 , node2 , null , Direction .BOTH );
4851
4952 assertEquals (0 , neighbors .size ());
5053 }
@@ -59,11 +62,11 @@ public void sameNodeHasNoCommonNeighbors() throws Throwable {
5962 tx .success ();
6063 }
6164
62- CommonNeighborsFinder commonNeighborsFinder = new CommonNeighborsFinder (api );
65+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
6366
6467 try (Transaction tx = api .beginTx ()) {
6568 Node node1 = api .getNodeById (0 );
66- Set <Node > neighbors = commonNeighborsFinder .findCommonNeighbors (node1 , node1 , null , Direction .BOTH );
69+ Set <Node > neighbors = neighborsFinder .findCommonNeighbors (node1 , node1 , null , Direction .BOTH );
6770
6871 assertEquals (0 , neighbors .size ());
6972 }
@@ -86,12 +89,12 @@ public void findNeighborsExcludingDirection() throws Throwable {
8689 tx .success ();
8790 }
8891
89- CommonNeighborsFinder commonNeighborsFinder = new CommonNeighborsFinder (api );
92+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
9093
9194 try (Transaction tx = api .beginTx ()) {
9295 Node node1 = api .getNodeById (0 );
9396 Node node2 = api .getNodeById (1 );
94- Set <Node > neighbors = commonNeighborsFinder .findCommonNeighbors (node1 , node2 , null , Direction .BOTH );
97+ Set <Node > neighbors = neighborsFinder .findCommonNeighbors (node1 , node2 , null , Direction .BOTH );
9598
9699 assertEquals (2 , neighbors .size ());
97100 }
@@ -111,12 +114,12 @@ public void findOutgoingNeighbors() throws Throwable {
111114 tx .success ();
112115 }
113116
114- CommonNeighborsFinder commonNeighborsFinder = new CommonNeighborsFinder (api );
117+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
115118
116119 try (Transaction tx = api .beginTx ()) {
117120 Node node1 = api .getNodeById (0 );
118121 Node node2 = api .getNodeById (1 );
119- Set <Node > neighbors = commonNeighborsFinder .findCommonNeighbors (node1 , node2 , FOLLOWS , Direction .OUTGOING );
122+ Set <Node > neighbors = neighborsFinder .findCommonNeighbors (node1 , node2 , FOLLOWS , Direction .OUTGOING );
120123
121124 assertEquals (1 , neighbors .size ());
122125 }
@@ -136,12 +139,12 @@ public void findIncomingNeighbors() throws Throwable {
136139 tx .success ();
137140 }
138141
139- CommonNeighborsFinder commonNeighborsFinder = new CommonNeighborsFinder (api );
142+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
140143
141144 try (Transaction tx = api .beginTx ()) {
142145 Node node1 = api .getNodeById (0 );
143146 Node node2 = api .getNodeById (1 );
144- Set <Node > neighbors = commonNeighborsFinder .findCommonNeighbors (node1 , node2 , FOLLOWS , Direction .INCOMING );
147+ Set <Node > neighbors = neighborsFinder .findCommonNeighbors (node1 , node2 , FOLLOWS , Direction .INCOMING );
145148
146149 assertEquals (1 , neighbors .size ());
147150 }
@@ -164,18 +167,92 @@ public void findNeighborsOfSpecificRelationshipType() throws Throwable {
164167 tx .success ();
165168 }
166169
167- CommonNeighborsFinder commonNeighborsFinder = new CommonNeighborsFinder (api );
170+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
168171
169172 try (Transaction tx = api .beginTx ()) {
170173 Node node1 = api .getNodeById (0 );
171174 Node node2 = api .getNodeById (1 );
172- Set <Node > neighbors = commonNeighborsFinder .findCommonNeighbors (node1 , node2 , COLLEAGUE , Direction .BOTH );
175+ Set <Node > neighbors = neighborsFinder .findCommonNeighbors (node1 , node2 , COLLEAGUE , Direction .BOTH );
173176
174177 assertEquals (1 , neighbors .size ());
175178 }
176179 }
177180
181+ @ Test
182+ public void dontCountDuplicates () throws Throwable {
183+
184+ Node node1 ;
185+ Node node2 ;
186+ Node node3 ;
187+ Node node4 ;
188+ try (Transaction tx = api .beginTx ()) {
189+ node1 = api .createNode ();
190+ node2 = api .createNode ();
191+ node3 = api .createNode ();
192+ node4 = api .createNode ();
193+
194+ node1 .createRelationshipTo (node3 , FRIEND );
195+ node2 .createRelationshipTo (node3 , FRIEND );
196+ node1 .createRelationshipTo (node4 , COLLEAGUE );
197+ node2 .createRelationshipTo (node4 , COLLEAGUE );
198+
199+ tx .success ();
200+ }
201+
202+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
203+
204+ try (Transaction tx = api .beginTx ()) {
205+ Set <Node > neighbors = neighborsFinder .findNeighbors (node1 , node2 , null , Direction .BOTH );
206+
207+ assertEquals (2 , neighbors .size ());
208+ assertThat (neighbors , hasItems (node3 , node4 ));
209+ }
210+ }
211+
212+ @ Test
213+ public void otherNodeCountsAsNeighbor () throws Throwable {
214+
215+ Node node1 ;
216+ Node node2 ;
217+ try (Transaction tx = api .beginTx ()) {
218+ node1 = api .createNode ();
219+ node2 = api .createNode ();
220+ node1 .createRelationshipTo (node2 , FRIEND );
178221
222+ tx .success ();
223+ }
224+
225+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
226+
227+ try (Transaction tx = api .beginTx ()) {
228+ Set <Node > neighbors = neighborsFinder .findNeighbors (node1 , node2 , null , Direction .BOTH );
229+
230+ assertEquals (2 , neighbors .size ());
231+ assertThat (neighbors , hasItems (node1 , node2 ));
232+ }
233+ }
234+
235+ @ Test
236+ public void otherNodeCountsAsOutgoingNeighbor () throws Throwable {
237+ Node node1 ;
238+ Node node2 ;
239+ try (Transaction tx = api .beginTx ()) {
240+ node1 = api .createNode ();
241+ node2 = api .createNode ();
242+ node1 .createRelationshipTo (node2 , FRIEND );
243+
244+ tx .success ();
245+ }
246+
247+ NeighborsFinder neighborsFinder = new NeighborsFinder (api );
248+
249+ try (Transaction tx = api .beginTx ()) {
250+ Set <Node > neighbors = neighborsFinder .findNeighbors (node1 , node2 , null , Direction .OUTGOING );
251+
252+ assertEquals (1 , neighbors .size ());
253+ assertThat (neighbors , hasItems (node2 ));
254+ }
255+ }
179256
180257}
181258
0 commit comments