Neo4jClient 显示传递对象的奇怪行为
Neo4jClient shows strange behavior passing objects
我正在尝试使用 ASP.NET MVC5 中的 Neo4jClient 从我的 Neo4j 数据库中查询数据和对象。
我必须在特定对象中构造 returned 数据。这适用于 IEnumerates,但不适用于单个对象。我看不出这种行为的任何原因,因为 Neo4j 本身 return 以预期的方式处理结果。
这里有一个示例:
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 return 容器的单个 JSON 对象。
pos.projects 包含 - 正如预期的那样 - ProjectContainer 的 1 个元素的枚举,包括 "data" 中项目数据的所有属性。但我不想要枚举,因为它总是 1 个项目。
问题是:
问题:pos.projects容器不为空,但只包含空属性。应该填写和projects[0]一样的内容,但是这样不行。
问题:如果我重命名 "project" 中的 属性 "data"(属性 本身和 with 子句),甚至 pos.projectcontainer 将为空。为什么 属性 的名称会改变行为,"data" 是客户端的任何特殊关键字吗?
我在 Neo4j 浏览器中测试了来自 query.Query.DebugQueryText 的查询,结果符合预期,即使我将 属性 "project" 或 "data" 命名为:
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"}}] │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
感谢您的帮助。
莱纳
你是对的,这是一个存在的问题 - 所以这不是一个 解决方案 本身,而是一个 work-around 来填充对象。
我不知道有什么方法可以用 anonymous types
实现你想要的,只有具体的 class 类型,所以如果你有一个 class 叫做 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")
而 return 相反,所以整个查询看起来像:
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
它不是很好,但它会正确地填充你的对象:/
我正在尝试使用 ASP.NET MVC5 中的 Neo4jClient 从我的 Neo4j 数据库中查询数据和对象。
我必须在特定对象中构造 returned 数据。这适用于 IEnumerates,但不适用于单个对象。我看不出这种行为的任何原因,因为 Neo4j 本身 return 以预期的方式处理结果。
这里有一个示例:
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 return 容器的单个 JSON 对象。 pos.projects 包含 - 正如预期的那样 - ProjectContainer 的 1 个元素的枚举,包括 "data" 中项目数据的所有属性。但我不想要枚举,因为它总是 1 个项目。
问题是:
问题:pos.projects容器不为空,但只包含空属性。应该填写和projects[0]一样的内容,但是这样不行。
问题:如果我重命名 "project" 中的 属性 "data"(属性 本身和 with 子句),甚至 pos.projectcontainer 将为空。为什么 属性 的名称会改变行为,"data" 是客户端的任何特殊关键字吗?
我在 Neo4j 浏览器中测试了来自 query.Query.DebugQueryText 的查询,结果符合预期,即使我将 属性 "project" 或 "data" 命名为:
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"}}] │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
感谢您的帮助。 莱纳
你是对的,这是一个存在的问题 - 所以这不是一个 解决方案 本身,而是一个 work-around 来填充对象。
我不知道有什么方法可以用 anonymous types
实现你想要的,只有具体的 class 类型,所以如果你有一个 class 叫做 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")
而 return 相反,所以整个查询看起来像:
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
它不是很好,但它会正确地填充你的对象:/