use of org.neo4j.graphdb.RelationshipType in project neo4j by neo4j.
the class SchemaProcedure method buildSchemaGraph.
public GraphResult buildSchemaGraph() {
final Map<String, NodeImpl> nodes = new HashMap<>();
final Map<String, Set<RelationshipImpl>> relationships = new HashMap<>();
try (Statement statement = kernelTransaction.acquireStatement()) {
ReadOperations readOperations = statement.readOperations();
StatementTokenNameLookup statementTokenNameLookup = new StatementTokenNameLookup(readOperations);
try (Transaction transaction = graphDatabaseAPI.beginTx()) {
// add all labelsInDatabase
ResourceIterator<Label> labelsInDatabase = graphDatabaseAPI.getAllLabelsInUse().iterator();
while (labelsInDatabase.hasNext()) {
Label label = labelsInDatabase.next();
Map<String, Object> properties = new HashMap<>();
Iterator<NewIndexDescriptor> indexDescriptorIterator = readOperations.indexesGetForLabel(readOperations.labelGetForName(label.name()));
ArrayList<String> indexes = new ArrayList<>();
while (indexDescriptorIterator.hasNext()) {
NewIndexDescriptor index = indexDescriptorIterator.next();
String[] propertyNames = PropertyNameUtils.getPropertyKeys(statementTokenNameLookup, index.schema().getPropertyIds());
indexes.add(String.join(",", propertyNames));
}
properties.put("indexes", indexes);
Iterator<ConstraintDescriptor> nodePropertyConstraintIterator = readOperations.constraintsGetForLabel(readOperations.labelGetForName(label.name()));
ArrayList<String> constraints = new ArrayList<>();
while (nodePropertyConstraintIterator.hasNext()) {
PropertyConstraint constraint = ConstraintBoundary.map(nodePropertyConstraintIterator.next());
constraints.add(constraint.userDescription(statementTokenNameLookup));
}
properties.put("constraints", constraints);
getOrCreateLabel(label.name(), properties, nodes);
}
//add all relationships
Iterator<RelationshipType> relationshipTypeIterator = graphDatabaseAPI.getAllRelationshipTypesInUse().iterator();
while (relationshipTypeIterator.hasNext()) {
RelationshipType relationshipType = relationshipTypeIterator.next();
String relationshipTypeGetName = relationshipType.name();
int relId = readOperations.relationshipTypeGetForName(relationshipTypeGetName);
ResourceIterator<Label> labelsInUse = graphDatabaseAPI.getAllLabelsInUse().iterator();
List<NodeImpl> startNodes = new LinkedList<>();
List<NodeImpl> endNodes = new LinkedList<>();
while (labelsInUse.hasNext()) {
Label labelToken = labelsInUse.next();
String labelName = labelToken.name();
Map<String, Object> properties = new HashMap<>();
NodeImpl node = getOrCreateLabel(labelName, properties, nodes);
int labelId = readOperations.labelGetForName(labelName);
if (readOperations.countsForRelationship(labelId, relId, ReadOperations.ANY_LABEL) > 0) {
startNodes.add(node);
}
if (readOperations.countsForRelationship(ReadOperations.ANY_LABEL, relId, labelId) > 0) {
endNodes.add(node);
}
}
for (NodeImpl startNode : startNodes) {
for (NodeImpl endNode : endNodes) {
RelationshipImpl relationship = addRelationship(startNode, endNode, relationshipTypeGetName, relationships);
}
}
}
transaction.success();
return getGraphResult(nodes, relationships);
}
}
}
use of org.neo4j.graphdb.RelationshipType in project neo4j by neo4j.
the class ValueRelationship method unpackFields.
public static ValueRelationship unpackFields(Neo4jPack.Unpacker unpacker) throws IOException {
long relId = unpacker.unpackLong();
long startNodeId = unpacker.unpackLong();
long endNodeId = unpacker.unpackLong();
String relTypeName = unpacker.unpackString();
Map<String, Object> props = unpacker.unpackMap();
RelationshipType relType = RelationshipType.withName(relTypeName);
return new ValueRelationship(relId, startNodeId, endNodeId, relType, props);
}
use of org.neo4j.graphdb.RelationshipType in project neo4j by neo4j.
the class ValueUnboundRelationship method unpackFields.
public static ValueUnboundRelationship unpackFields(Neo4jPack.Unpacker unpacker) throws IOException {
long relId = unpacker.unpackLong();
String relTypeName = unpacker.unpackString();
Map<String, Object> props = unpacker.unpackMap();
RelationshipType relType = RelationshipType.withName(relTypeName);
return new ValueUnboundRelationship(relId, relType, props);
}
use of org.neo4j.graphdb.RelationshipType in project neo4j by neo4j.
the class ParallelBatchImporterTest method assertDegrees.
private void assertDegrees(Node node) {
for (RelationshipType type : node.getRelationshipTypes()) {
for (Direction direction : Direction.values()) {
long degree = node.getDegree(type, direction);
long actualDegree = count(node.getRelationships(type, direction));
assertEquals(actualDegree, degree);
}
}
}
use of org.neo4j.graphdb.RelationshipType in project neo4j by neo4j.
the class TestShortestPath method shouldAbortAsSoonAsPossible.
// Attempt at recreating this issue without cypher
// https://github.com/neo4j/neo4j/issues/4160
@Test
public void shouldAbortAsSoonAsPossible() {
final Label A = Label.label("A");
final Label B = Label.label("B");
final Label C = Label.label("C");
final Label D = Label.label("D");
final Label E = Label.label("E");
final Label F = Label.label("F");
final RelationshipType relType = RelationshipType.withName("TO");
recursiveSnowFlake(null, 0, 4, 5, new Label[] { A, B, C, D, E }, relType);
final Node a = graphDb.findNodes(A).next();
final ResourceIterator<Node> allE = graphDb.findNodes(E);
while (allE.hasNext()) {
final Node e = allE.next();
final Node f = graphDb.createNode(F);
f.createRelationshipTo(e, relType);
}
final CountingPathExpander countingPathExpander = new CountingPathExpander(PathExpanders.forTypeAndDirection(relType, Direction.OUTGOING));
final ShortestPath shortestPath = new ShortestPath(Integer.MAX_VALUE, countingPathExpander, Integer.MAX_VALUE);
final ResourceIterator<Node> allF = graphDb.findNodes(F);
final long start = System.currentTimeMillis();
while (allF.hasNext()) {
final Node f = allF.next();
shortestPath.findAllPaths(a, f);
}
final long totalTime = System.currentTimeMillis() - start;
assertEquals("There are 625 different end nodes. The algorithm should start one traversal for each such node. " + "That is 625*2 visited nodes if traversal is interrupted correctly.", 1250, countingPathExpander.nodesVisited.intValue());
}
Aggregations