큰 오브젝트 그래프를 Neo4j 데이터베이스에 저장해야합니다. Neo4jClient를 사용하여 Neo4j와 대화하기. 필자는 단일 쿼리에서 모든 필수 CREATE 등을 생성 (리플렉션 사용) 한 다음 ExecuteWithoutResults를 수행하기로 결정했습니다. 이는 코드 작성으로 인해 각 객체를 생성하지 못하도록하고 하나의 데이터베이스 호출로 전체 그래프를 작성하여 성능을 향상시킵니다.Neo4jClient 또는 Neo4j가 전체 쿼리를 처리하지 않습니다.
내 코드는 다음과 유사합니다 (그러나 분명히 더 복잡)입니다 :
ICypherFluentQuery query;
foreach(...) { query = query.CreateUnique(...); }
if (...) query = query.Match(...);
... etc. etc.
query.ExecuteWithoutResults();
결과는이 게시물의 끝에 긴 쿼리 (이 비주얼에 의해 제조 된 쿼리 변수의 값입니다 Studio 디버거).
문제는 내가 이것을 실행 한 후에 Neo4j 데이터베이스를 검사 할 때 쿼리의 시작 부분에 생성 된 항목 만 실제로 데이터베이스에있는 것입니다 (첫 번째 보조 프로그램까지). 나는 주문이 발전기를 변경하여이 일과 관련이 있다는 것을 확인했다. 다른 CREATE가 먼저 오게되었다. 결과는 새롭게 등장한 항목이 이제는 데이터베이스에 나타나고, 새로 EmailAddress 등에서 나타나지 않았다는 것이다.
이 문제가 발생하는 이유와 가능한 해결 방법에 대한 피드백은 크게 환영 할 것입니다.
"START root=node(0)
MATCH root-[:HOSTS]->(n2)
WHERE n2.Key = 2552851c9015412ea808
WITH root,n2
CREATE UNIQUE (n2)-[:AGENCY_HAS_RESIDENTIAL_UNITS]->(n3)
CREATE (n3)-[:AGENCY_HAS_RESIDENTIAL_UNIT]->(n4 MyStory.Logic.CarerManagementSlice.Models.ResidentialUnit)
WITH root,n4
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_EMAIL_ADDRESS]->(n5 MyStory.Logic.Common.Models.EmailAddress)
WITH root,n4,n5
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_EMAIL_ADDRESS]->(n6 MyStory.Logic.Common.Models.EmailAddress)
WITH root,n4,n6
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_EMAIL_ADDRESS]->(n7 MyStory.Logic.Common.Models.EmailAddress)
WITH root,n4,n7
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_ADDRESS]->(n8 MyStory.Logic.CarerManagementSlice.Models.ResidentialUnitAddress)
WITH root,n4,n8
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_ADDRESS]->(n9 MyStory.Logic.CarerManagementSlice.Models.ResidentialUnitAddress)
WITH root,n4,n9
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_ADDRESS]->(n10 MyStory.Logic.CarerManagementSlice.Models.ResidentialUnitAddress)
WITH root,n4,n10
CREATE (n4)-[:RESIDENTIAL_UNIT_SUPPORTS_PROGRAM]->(n11 MyStory.Logic.CarerManagementSlice.Models.SupportingProgram)
WITH root,n4,n11
MATCH root-[:HOSTS]->(n12)
WHERE n12.Key = 2552851c9015412ea808
WITH root,n4,n11,n12
MATCH (n12)-[:CENTRE_BELONGS_TO]-(n13)
WITH root,n4,n11,n13
MATCH (n13)-[:HAS_PROGRAM]->(n14)
WHERE n14.UniqueId = 2
WITH root,n4,n11,n14
CREATE (n11)-[:SUPPORTING_PROGRAM_IS_LINKED_TO_PROGRAM]->(n14)
WITH root,n4,n11
CREATE (n4)-[:RESIDENTIAL_UNIT_SUPPORTS_PROGRAM]->(n15 MyStory.Logic.CarerManagementSlice.Models.SupportingProgram)
WITH root,n4,n15
MATCH root-[:HOSTS]->(n16)
WHERE n16.Key = 2552851c9015412ea808
WITH root,n4,n15,n16
MATCH (n16)-[:CENTRE_BELONGS_TO]-(n17)
WITH root,n4,n15,n17
MATCH (n17)-[:HAS_PROGRAM]->(n18)
WHERE n18.UniqueId = 2
WITH root,n4,n15,n18
CREATE (n15)-[:SUPPORTING_PROGRAM_IS_LINKED_TO_PROGRAM]->(n18)
WITH root,n4,n15
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_PHONE_NUMBER]->(n19 MyStory.Logic.Common.Models.PhoneNumberWithType)
WITH root,n4,n19
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_PHONE_NUMBER]->(n20 MyStory.Logic.Common.Models.PhoneNumberWithType)
WITH root,n4,n20
CREATE (n4)-[:RESIDENTIAL_UNIT_HAS_PHONE_NUMBER]->(n21 MyStory.Logic.Common.Models.PhoneNumberWithType)
WITH root,n4,n21
CREATE (n4)-[:HAS_RESIDENTIAL_UNIT_CLOSURE_REASON]->(n22 MyStory.Logic.CarerManagementSlice.Models.ResidentialUnitClosureReason)
WITH root,n4,n22
CREATE (n4)-[:HAS_RESIDENTIAL_UNIT_CLOSURE_REASON]->(n23 MyStory.Logic.CarerManagementSlice.Models.ResidentialUnitClosureReason)
WITH root,n4,n23
CREATE (n4)-[:HAS_RESIDENTIAL_UNIT_CLOSURE_REASON]->(n24 MyStory.Logic.CarerManagementSlice.Models.ResidentialUnitClosureReason)
WITH root,n4,n24"
네가 맞아, 실제로 Neo4j (내 질문에 표시된 쿼리와 대조적으로)에있는 쿼리가 – user1147862
인 것으로 나타났습니다. 네가 맞아요, 실제로 Neo4j에 연결된 쿼리를 발견했습니다. 내 질문에 표시된 쿼리) 대신 WHERE n14.UniqueId = 2 (따옴표없이) 쿼리를 생성하는 방식 때문에 WHERE n14.UniqueId = "2" (따옴표와 함께)했다. 이렇게하면 Neo4j는 equals를 false로 평가합니다. 따옴표를 제거하면 문제가 해결되었습니다. – user1147862