public List<Object> relsInPath(Object pathValue) { Path path = (Path) pathValue; List<Object> rels = new ArrayList<>(path.length()); for (Relationship rel : path.relationships()) { rels.add(rel); } return rels; }
Neo4jBoltPath boltPath = new Neo4jBoltPath(); if (path.length() == 0) { return boltPath; List<Node> pathNodes = Iterables.asList(path.nodes()); List<Relationship> relationships = Iterables.asList(path.relationships()); for (int i = 0; i < path.length(); i++) { boltPath.add(convert(pathNodes.get(i))); boltPath.add(convert(relationships.get(i))); if (i == path.length() - 1) { boltPath.add(convert(pathNodes.get(i + 1)));
@Test public void returnPath() { Driver driver = GremlinDatabase.driver("//localhost:" + server.getPort()); try (Session session = driver.session()) { StatementResult setup = session.run("CREATE (n1:Person {name: 'Anders'})-[r:knows]->(n2:Person)" + "RETURN n1,r,n2"); Record createdNodes = setup.single(); Node n1 = createdNodes.get("n1").asNode(); Node n2 = createdNodes.get("n2").asNode(); Relationship r = createdNodes.get("r").asRelationship(); StatementResult result = session.run("MATCH p =(b1 { name: 'Anders' })-->()" + "RETURN p"); Path path = result.single().get("p").asPath(); assertThat(path.contains(n1)).isTrue(); assertThat(path.contains(n2)).isTrue(); assertThat(path.contains(r)).isTrue(); assertThat(path.relationships()).hasSize(1); assertThat(path.nodes()).hasSize(2); } }
@Override public PathInfo getPathInfo(String colKey) { PathInfo pathInfo = null; Value val; try { val = this.record.get(colKey); } catch (NoSuchRecordException e) { throw new RuntimeException("no result column: " + colKey); } String typName = val.type().name(); if ("PATH".equals(typName)) { Path p = val.asPath(); long startId = p.start().id(); long endId = p.end().id(); List<Long> relIds = new ArrayList<Long>(); Iterator<Relationship> it = p.relationships().iterator(); while(it.hasNext()) { Relationship rel = it.next(); relIds.add(Long.valueOf(rel.id())); } pathInfo = new PathInfo(startId, endId, relIds, p); } return pathInfo; }
@Test public void shouldGetCurrentPathByGivenEntity() { // This is in a try-block, to make sure we close the driver after the test try (Driver driver = GraphDatabase .driver(neo4j.boltURI(), Config.build().withEncryption().toConfig()); Session session = driver.session()) { // Given session.run("CREATE (e:Entity {key:'immutableValue'})-[:CURRENT {date:localdatetime('1988-10-27T00:00:00')}]->(s:State {key:'initialValue'})"); session.run("MATCH (e:Entity {key:'immutableValue'})-[:CURRENT {date:localdatetime('1988-10-27T00:00:00')}]->(s:State {key:'initialValue'}) CREATE (e)-[:HAS_STATE {startDate:localdatetime('1988-10-27T00:00:00')}]->(s)"); Node entity = session.run("MATCH (e:Entity) RETURN e").single().get("e").asNode(); Node state = session.run("MATCH (s:State) RETURN s").single().get("s").asNode(); // When StatementResult result = session.run("MATCH (e:Entity) WITH e CALL graph.versioner.get.current.path(e) YIELD path RETURN path"); Path current = result.single().get("path").asPath(); Iterator<Relationship> relsIterator = current.relationships().iterator(); Map<String, Object> rels = new HashMap<>(); while (relsIterator.hasNext()) { Relationship support = relsIterator.next(); rels.put(support.type(), support); } // Then assertThat(current.contains(entity), equalTo(true)); assertThat(rels.containsKey(Utility.CURRENT_TYPE), equalTo(true)); assertThat(current.contains(state), equalTo(true)); } }
@Nonnull default String pathAsString(@Nonnull Path path) { List<String> list = new ArrayList<>(path.length()); Node lastTraversed = path.start(); if (lastTraversed != null) { list.add(nodeAsString(lastTraversed)); for (Path.Segment segment : path) { Relationship relationship = segment.relationship(); if (relationship.startNodeId() == lastTraversed.id()) { list.add("-" + relationshipAsString(relationship) + "->"); } else { list.add("<-" + relationshipAsString(relationship) + "-"); } list.add(nodeAsString(segment.end())); lastTraversed = segment.end(); } } return list.stream().collect(Collectors.joining()); }
@Override public int size() { return asObject().length(); }
@SuppressWarnings("unchecked") @Override public long gePathtNodeIdAt(PathInfo pathInfo, int index) { Object obj = pathInfo.getContentObject(); List<Node> nodes = null; if (obj instanceof List<?>) nodes = (List<Node>) obj; else if (obj instanceof Path) { nodes = new ArrayList<Node>(); Iterator<Node> it = ((Path)obj).nodes().iterator(); while(it.hasNext()) nodes.add(it.next()); pathInfo.setContentObject(nodes); } return nodes.get(index).id(); }
@Override public PathInfo getPathInfo(String colKey) { PathInfo pathInfo = null; Value val; try { val = this.record.get(colKey); } catch (NoSuchRecordException e) { throw new RuntimeException("no result column: " + colKey); } String typName = val.type().name(); if ("PATH".equals(typName)) { Path p = val.asPath(); long startId = p.start().id(); long endId = p.end().id(); List<Long> relIds = new ArrayList<Long>(); Iterator<Relationship> it = p.relationships().iterator(); while(it.hasNext()) { Relationship rel = it.next(); relIds.add(Long.valueOf(rel.id())); } pathInfo = new PathInfo(startId, endId, relIds, p); } return pathInfo; }
@Test public void shouldGetAllStateNodesByGivenEntityWithOnlyOneCurrentState() { // This is in a try-block, to make sure we close the driver after the test try (Driver driver = GraphDatabase .driver(neo4j.boltURI(), Config.build().withEncryption().toConfig()); Session session = driver.session()) { // Given session.run("CREATE (e:Entity {key:'immutableValue'})-[:CURRENT {date:localdatetime('1988-10-27T00:00:00')}]->(s:State {key:'initialValue'})"); session.run("MATCH (e:Entity {key:'immutableValue'})-[:CURRENT {date:localdatetime('1988-10-27T00:00:00')}]->(s:State {key:'initialValue'}) CREATE (e)-[:HAS_STATE {startDate:localdatetime('1988-10-27T00:00:00')}]->(s)"); Node entity = session.run("MATCH (e:Entity) RETURN e").single().get("e").asNode(); Node stateNew = session.run("MATCH (s:State {key:'initialValue'}) RETURN s").single().get("s").asNode(); // When StatementResult result = session.run("MATCH (e:Entity) WITH e CALL graph.versioner.get.all(e) YIELD path RETURN path"); Path current = result.single().get("path").asPath(); Iterator<Relationship> relsIterator = current.relationships().iterator(); Map<String, Object> rels = new HashMap<>(); while (relsIterator.hasNext()) { Relationship support = relsIterator.next(); rels.put(support.type(), support); } // Then assertThat(current.contains(entity), equalTo(true)); assertThat(current.contains(stateNew), equalTo(true)); } }
@Test public void shouldCreateAnRNodeConnectedToTheEntity() throws Throwable { try (Driver driver = GraphDatabase.driver(neo4j.boltURI(), Config.build().withEncryption().toConfig()); Session session = driver.session()) { StatementResult result = session.run("CALL graph.versioner.init('Entity')"); StatementResult rPath = session.run("MATCH rPath = (:R)-[:FOR]->(:Entity) RETURN rPath"); Assertions.assertThat(result.single().get("node").asNode().id()).isEqualTo(0L); Assertions.assertThat(rPath) .hasSize(1) .allMatch(path -> path.get("rPath").asPath().length() == 1); } } }
@SuppressWarnings("unchecked") @Override public long gePathtNodeIdAt(PathInfo pathInfo, int index) { Object obj = pathInfo.getContentObject(); List<Node> nodes = null; if (obj instanceof List<?>) nodes = (List<Node>) obj; else if (obj instanceof Path) { nodes = new ArrayList<Node>(); Iterator<Node> it = ((Path)obj).nodes().iterator(); while(it.hasNext()) nodes.add(it.next()); pathInfo.setContentObject(nodes); } return nodes.get(index).id(); }
List<Object> relsInPath(Object pathValue) { Path path = (Path) pathValue; List<Object> rels = new ArrayList<>(path.length()); for (Relationship rel : path.relationships()) { rels.add(rel); } return rels; } }
@Test public void shouldGetAllStateNodesByGivenEntity() { // This is in a try-block, to make sure we close the driver after the test try (Driver driver = GraphDatabase .driver(neo4j.boltURI(), Config.build().withEncryption().toConfig()); Session session = driver.session()) { // Given session.run("CREATE (e:Entity {key:'immutableValue'})-[:CURRENT {date:localdatetime('1988-10-27T00:00:00')}]->(s:State {key:'initialValue'})"); session.run("MATCH (e:Entity {key:'immutableValue'})-[:CURRENT {date:localdatetime('1988-10-27T00:00:00')}]->(s:State {key:'initialValue'}) CREATE (e)-[:HAS_STATE {startDate:localdatetime('1988-10-27T00:00:00')}]->(s)"); session.run("MATCH (e)-[hs:HAS_STATE]->(s) CREATE (e)-[:HAS_STATE {startDate: localdatetime('1988-10-26T00:00:00'), endDate: hs.startDate}]->(:State{key:'oldState'})"); session.run("MATCH (s1:State {key:'oldState'}), (s2:State {key:'initialValue'}) CREATE (s1)<-[:PREVIOUS {date: localdatetime('1988-10-26T00:00:00')}]-(s2) "); Node entity = session.run("MATCH (e:Entity) RETURN e").single().get("e").asNode(); Node stateNew = session.run("MATCH (s:State {key:'initialValue'}) RETURN s").single().get("s").asNode(); Node stateOld = session.run("MATCH (s:State {key:'oldState'}) RETURN s").single().get("s").asNode(); // When StatementResult result = session.run("MATCH (e:Entity) WITH e CALL graph.versioner.get.all(e) YIELD path RETURN path"); Path current = result.single().get("path").asPath(); Iterator<Relationship> relsIterator = current.relationships().iterator(); Map<String, Object> rels = new HashMap<>(); while (relsIterator.hasNext()) { Relationship support = relsIterator.next(); rels.put(support.type(), support); } // Then assertThat(current.contains(entity), equalTo(true)); assertThat(current.contains(stateNew), equalTo(true)); assertThat(rels.containsKey(Utility.PREVIOUS_TYPE), equalTo(true)); assertThat(current.contains(stateOld), equalTo(true)); } }