C# 中的 Neo4j 标量函数
Neo4j Scalar functions in c#
在 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 函数有什么想法吗?
您需要使用 Neo4jClient
的 Return.As
部分,下面的查询与您的原始 Cypher 匹配(好吧,包括您在 C#
版本中使用的 Optional
):
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)")
});
Return.As
允许您调用您想要的函数。
在 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 函数有什么想法吗?
您需要使用 Neo4jClient
的 Return.As
部分,下面的查询与您的原始 Cypher 匹配(好吧,包括您在 C#
版本中使用的 Optional
):
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)")
});
Return.As
允许您调用您想要的函数。