如何通过neo4jclient返回关系及其属性?
本文关键字:属性 关系 何通过 neo4jclient 返回 | 更新日期: 2023-09-27 18:18:29
请查找以下Cypher查询(这是正常的)
MATCH (a:`Entity`) - [r] - (b:`Entity`)
RETURN a , r , b
第一个问题:我如何在我的c#代码中将其转换为neo4jClient。
第二个问题:关系有多个属性。如何使用neo4Jclient访问它们?
实体具有属性EntityName和DataSpaceName关系有两个属性:RelationType和RelationFrequency。
我用来获取节点详细信息的代码如下
var query1 = client
.Cypher
.Match("(a:`Entity`) - [r] - (b:`Entity`)")
.Where("a.DataSpace = b.DataSpace")
.Return((a,b) => new {
FromEntity = Return.As<string>("a.EntityName"),
ToEntity=Return.As<string>("b.EntityName")
}
);
编辑:
我已经试过了。
var query1 = client
.Cypher
.Match("(a:`Entity`) - [r] - (b:`Entity`)")
.Where("a.DataSpace = b.DataSpace")
.Return((a,b) => new {
FromEntity = Return.As<string>("a.EntityName"),
ToEntity=Return.As<string>("b.EntityName"),
Relation=Return.As<string>("r.RelType"),
}
);
但是,如果关系是通配符,即[*]或[r *1..]
关系对象与节点对象相同,因此可以以相同的方式获得它们。
你是如何设置你的元素的?什么是"实体",假设你有这样一个类:
public class Entity {
public string DataSpace { get; set; }
public string EntityName { get; set; }
}
和一个关系对象:
public class RelationshipObj {
public string RelType { get; set; }
}
您将返回如下内容:
var originalQuery = graphClient
.Cypher
.Match("(a:`Entity`)-[r]-(b:`Entity`)")
.Where("a.DataSpace = b.DataSpace")
.Return((a, b, r) => new
{
FromEntity = a.As<Entity>().EntityName,
ToEntity = b.As<Entity>().EntityName,
Relation = r.As<RelationshipObj>().RelType,
});
在你有[r*1..3]
的情况下,当你返回一个枚举时,你最终会得到一个更复杂的查询。所以你的return for 'Relation'变成了:
Relation = r.As<IEnumerable<RelationshipObj>>()
在不解析结果的情况下,你不能再从中提取'RelType'属性:
foreach (var result in results)
{
foreach (var relationship in result.Relation)
{
Console.WriteLine(relationship.RelType);
}
}
现在,你实际上在问如何处理通配符关系,显然你不能像上面那样获得属性——因为你实际上不知道你在请求什么。您可以将结果作为string
并使用JSON。NET将其解析为正确的对象。但是,您也可以返回RelationshipInstance<Dictionary<string,string>>
,它将为您提供关系的TypeKey
,您可以使用它来反序列化到您的关系对象:
var query = graphClient.Cypher
.Match("(a:`Entity`)-[r*]-(b:`Entity`)")
.Where("a.DataSpace = b.DataSpace")
.Return((a, b, r) => new
{
FromEntity = a.As<Entity>().EntityName,
ToEntity = b.As<Entity>().EntityName,
Relation = r.As<IEnumerable<RelationshipInstance<Dictionary<string,string>>>>(),
});
var results = query.Results.ToList();
foreach (var result in results)
{
foreach (var relationship in result.Relation)
{
if (relationship.TypeKey == "REL_TO")
{
var obj = JsonConvert.DeserializeObject<RelationshipObj>(JsonConvert.SerializeObject(relationship.Data));
Console.WriteLine(obj.RelType);
}
}
}
我们必须做一些奇怪的反序列化/序列化的事情,因为我们不能只使用RelationshipObject<string>
,由于对通用部分的限制。