2017-02-15 21 views
0

Я пытаюсь запросить данные и объекты из моей базы данных Neo4j, используя Neo4jClient в ASP.NET MVC5.Neo4jClient показывает странное поведение объектов передачи

Мне нужно структурировать возвращаемые данные в определенных объектах. Это отлично работает для IEnumerates, но не работает для отдельных объектов. Я не вижу причин для такого поведения, поскольку Neo4j сам возвращает результаты ожидаемым образом.

Здесь образца:

public class ProjectContainer 
{ 
    public string relationship { get; set; } 
    public int accesstype { get; set; } 
    public ProjectData data { get; set; } 
} 

var query = graphClient.Cypher 
    .Match("(positionData:Position)<-[relationData:HAS_POSITION]-(projectData:Project)") 
    .Where((PositionData positionData) => positionData.uuid == uuid) 
    .With("positionData, projectData, { relationship: type(relationData), accesstype:0, data: projectData } as container ") 
    .Return((positionData, projectData, container) => new 
    { 
     position = positionData.As<PositionData>(), 
     projectdata = projectData.As<ProjectData>(), 
     projectcontainer = container.As<ProjectContainer>(), 
     projects = container.CollectAs<ProjectContainer>() 
    }); 

var pos = query.Results.First(); 

Neo4j возвращают один JSON-объект для контейнера. pos.projects содержит - как и ожидалось - перечисление 1 элемента ProjectContainer, включая все свойства projectdata в «данных». Но я не хочу перечислять, так как всегда будет один проект.

Проблемы:

  1. проблема: pos.projectscontainer не равно нулю, но содержит только нулевые свойства. Он должен быть заполнен тем же содержимым, что и проекты [0], но это не работает.

  2. проблема: если я переименую свойство «данные» в «проекте» (само свойство и в с-предложением), даже pos.projectcontainer будет равен нулю. Почему имя свойства изменяет поведение, является ли «данные» каким-либо специальным ключевым словом для клиента?

Я тестировал запрос от query.Query.DebugQueryText в браузере Neo4j и результат, как и следовало ожидать, даже если я называю свойство «проект» или «данные»:

MATCH (positionData:Position)<-[relationData:HAS_POSITION]-(projectData:Project) WHERE (positionData.uuid = "c3a1eedc-5083-4784-a378-cfd2ba0bec57") WITH positionData, projectData, { relationship: type(relationData), accesstype:0, data: projectData } as container RETURN positionData AS position, projectData AS projectdata, container AS projectcontainer, collect(container) AS projects 

╒══════════════════════════════╤══════════════════════════════╤══════════════════════════════╕ 
│"projectdata"     │"projectcontainer"   │"projects"     │ 
╞══════════════════════════════╪══════════════════════════════╪══════════════════════════════╡ 
│{"description":"Project dummy │{"relationship":"HAS_POSITION"│[{"relationship":"HAS_POSITION│ 
│description","closed":false,"a│,"accesstype":"0","data":{"des│","accesstype":"0","data":{"de│ 
│ctive":true,"published":false,│cription":"Project dummy descr│scription":"Project dummy desc│ 
│"title":"Project dummy title",│iption","closed":false,"active│ription","closed":false,"activ│ 
│"uuid":"e4327251-d0c7-4e24-aa1│":true,"published":false,"titl│e":true,"published":false,"tit│ 
│2-cf7ade4a512a"}    │e":"Project dummy title","uuid│le":"Project dummy title","uui│ 
│        │":"e4327251-d0c7-4e24-aa12-cf7│d":"e4327251-d0c7-4e24-aa12-cf│ 
│        │ade4a512a"}}     │7ade4a512a"}}]    │ 
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘ 

спасибо за любую помощь. Райнер

+0

Вы используете Fiddler, чтобы увидеть, что Neo4j возвращается? –

+0

Нет, я еще не использовал Fiddler. Я протестировал запрос из query.Query.DebugQueryText в браузере Neo4j, и результат будет таким же ожидаемым, даже если я назову свойство «проект» или «данные». (добавлен шифр и исходные результаты в сообщении) –

+0

Поскольку 'container.CollectAs ()' работает как перечисление, я надеялся, что 'container.Head(). CollectAs ()' будет работать, но также возвращает null. –

ответ

0

Вы правы, что существующая проблема - так это не решения сам по себе, но обходный, чтобы объект заполнил

я не знаю. способа, чтобы достичь того, чего вы хотите с anonymous types, только с конкретным типом класса, поэтому если у вас есть класс Altogether который выглядел так:

public class Altogether 
{ 
    public PositionData position { get; set; } 
    public ProjectData projectdata { get; set; } 
    public ProjectContainer projectcontainer { get; set;} 
} 

вы можете добавить эту строку в текущем запросе:

.With("{position: positionData, projectdata: projectData, projectcontainer: container} as altogether")

И вернуться, что вместо этого, так что весь запрос выглядит следующим образом:

var query = graphClient.Cypher 
    .Match("(positionData:Position)<-[relationData:HAS_POSITION]-(projectData:Project)") 
    .Where((PositionData positionData) => positionData.uuid == uuid) 
    .With("positionData, projectData, { relationship: type(relationData), accesstype:0, data: projectData } as container") 
    .With("{position: positionData, projectdata: projectData, projectcontainer: container} as altogether") //<-- Add here 
    .Return((altogether) => altogether.As<Altogether>()); //<-- Change here 

Это не большой, но она заполнит ваши объекты должным образом:/

+0

Спасибо Крису!именно то, что мне нужно –