neo4j标量函数在c#中

时间:2017-09-29 00:42:58

标签: c# graph neo4j neo4jclient

在Neo4j中,我们可以执行:startNode(relationship), endNode(relationship),它将为我们提供给定关系的节点的开始和结束。

我的示例查询是:

match p=(n1 {Identifier:<id>})-[:r1|r2*2]-(n2) unwind relationships(p) as rel return distinct startNode(rel) as n1, type(rel), endNode(rel) as n2

所以基本上它是一个可变长度的关系,我可以得到类型,以及每个关系的起始和结束节点。

如果我没有指定startNode或endNode,我将获得实际上彼此没有连接的额外节点。

这在neo4j cypher中完全正常,但我不知道如何在c#中执行startNode和endNode(标量函数)。

目前我有这个:

 var data = client.Cypher.Match("(n1)")
            .Where((Node n1) => n1.Identifier == identifier)
            .OptionalMatch("p=(n1)-[:r1|r1*2"]-(n2)")
            .Unwind("relationships(p)", "rel")
            .ReturnDistinct((n1, rel, n2) => new
            {
                startNode = n1.As<Node<string>>(),
                endNode = n2.As<Node<string>>(),
                relationship = rel.As<RelationshipInstance<object>>()
            }).Results;

这是执行startNode和endNode函数,因此我获得了实际上没有相互连接的额外节点关系

有关如何在c#neo4j客户端中实现startNode和endNode函数的任何想法?

1 个答案:

答案 0 :(得分:1)

您需要使用Return.As的{​​{1}}部分,以下查询与原始Cypher匹配(包括您在Neo4jClient版本中使用的Optional):

C#

var query = client.Cypher.Match("(n1)") .Where((Node n1) => n1.Identifier == identifier) .OptionalMatch("p=(n1)-[:r1|r2*..2]->(n2)") .Unwind("relationships(p)", "rel") .ReturnDistinct((n1, rel, n2) => new { startNode = Return.As<Node<string>>("startNode(rel)"), endNode = Return.As<Node<string>>("endNode(rel)"), relationship = Return.As<string>("type(rel)") }); 允许您调用您想要的功能。