In meinem SDN-4-Projekt habe ich eine folgende Entität:Neo4j Cypher Abfrage mit mehreren Bedingungen
@NodeEntity
public class Characteristic extends Authorable {
private final static String CONTAINS = "CONTAINS";
private final static String DEFINED_BY = "DEFINED_BY";
private String name;
private String description;
@Relationship(type = DEFINED_BY, direction = Relationship.OUTGOING)
private Decision owner;
}
@NodeEntity
public class Decision extends Commentable {
private final static String DEFINED_BY = "DEFINED_BY";
@Relationship(type = DEFINED_BY, direction = Relationship.INCOMING)
private Set<Characteristic> characteristics = new HashSet<>();
}
@RelationshipEntity(type = "DECISION_CHARACTERISTIC")
public class DecisionCharacteristic {
@GraphId
private Long id;
@StartNode
private Decision decision;
@EndNode
private Characteristic characteristic;
private Object value;
}
Ich brauche einen Decision
Knoten auszuwählen, die die spezifischen Eigenschaften entsprechen.
Ich habe folgende Cypher Abfrage erstellt:
MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) WHERE id(parentD) = {decisionId} MATCH (childD)-[rdc:DECISION_CHARACTERISTIC]->(characteristic:Characteristic) WHERE ((( id(characteristic) = 138 AND (rdc.value > 15000.32)) AND ( id(characteristic) = 138 AND (rdc.value < 50000.32))) AND ( id(characteristic) = 139 AND (rdc.value = 'Commercial'))) WITH childD, ru, u RETURN childD
aber diese Abfrage funktioniert falsch. Ich muss einen Entscheidungsknoten auswählen, der für das Merkmal mit id=138
einen value between 15000.32 and 50000.32
hat und für das Merkmal mit genau value = 'Commercial'
hat.
Wo liege ich falsch in meiner Abfrage und wie man es umwandelt, um wie erwartet zu arbeiten?
AKTUALISIERT
Ich habe einen folgenden Knoten:
DecisionCharacteristic neo4jPriceDecisionCharacteristic = new DecisionCharacteristic(neo4jDecision, priceCharacteristic, new Double(10000.32d));
decisionCharacteristicRepository.save(neo4jPriceDecisionCharacteristic);
DecisionCharacteristic oraclePriceDecisionCharacteristic = new DecisionCharacteristic(oracleDecision, priceCharacteristic, new Double(35000.2d));
decisionCharacteristicRepository.save(oraclePriceDecisionCharacteristic);
assertNotNull(neo4jPriceDecisionCharacteristic);
assertNotNull(neo4jPriceDecisionCharacteristic.getId());
DecisionCharacteristic neo4jLicenseDecisionCharacteristic = new DecisionCharacteristic(neo4jDecision, licenseCharacteristic, "Commercial");
decisionCharacteristicRepository.save(neo4jLicenseDecisionCharacteristic);
DecisionCharacteristic orientLicenseDecisionCharacteristic = new DecisionCharacteristic(orientDecision, licenseCharacteristic, "Free");
decisionCharacteristicRepository.save(orientLicenseDecisionCharacteristic);
DecisionCharacteristic oracleLicenseDecisionCharacteristic = new DecisionCharacteristic(oracleDecision, licenseCharacteristic, "Commercial");
decisionCharacteristicRepository.save(oracleLicenseDecisionCharacteristic);
IDs:
priceCharacteristic ID: 138
licenseCharacteristic ID: 139
Ich versuche, einen Decision
Knoten mit einer folgenden Abfrage zu erhalten:
MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) WHERE id(parentD) = {decisionId} MATCH (childD)-[rdc:DECISION_CHARACTERISTIC]->(characteristic:Characteristic) WHERE (id(characteristic) = 138 AND (id(characteristic) = 138 AND ( (rdc.value > 15000.32)) AND ( (rdc.value < 50000.32))) OR ( id(characteristic) = 139 AND (rdc.value = 'Commercial'))) RETURN childD
Ich gehe davon aus, dass nur oracleDecision
Knoten diese Bedingung erfüllt, aber es gibt zwei Knoten:
Neo4j
Oracle
Wo bin ich falsch?
Können Sie Ihrer Beschreibung die IDs der einzelnen Merkmale hinzufügen? Sie passen auf 138 oder 139, aber wir können nicht sagen, auf welche sie sich beziehen. – InverseFalcon
Ich habe meine Frage aktualisiert: priceCharacteristic ID: 138 licenseCharacteristic ID: 139 – alexanoid