gpt4 book ai didi

c# - 如何通过带有密码的 neo4jclient 返回关系及其属性

转载 作者:行者123 更新时间:2023-11-30 20:47:54 26 4
gpt4 key购买 nike

请在下面找到 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..3],我将如何获取关系的属性。

最佳答案

关系对象和节点对象是一样的,所以你得到它们的方法是一样的。

您实际上是如何设置元素的?什么是“实体”,假设您有一个类:

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] 的情况下当您返回一个枚举时,您最终会得到一个更复杂的查询。所以你返回 '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>由于对通用部分的限制。

关于c# - 如何通过带有密码的 neo4jclient 返回关系及其属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25355079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com