如何通过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..]

如何通过neo4jclient返回关系及其属性?

关系对象与节点对象相同,因此可以以相同的方式获得它们。

你是如何设置你的元素的?什么是"实体",假设你有这样一个类:

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>,由于对通用部分的限制。