2017-09-29 7 views
0

En Neo4j nous pouvons faire: startNode(relationship), endNode(relationship) et il va nous donner le début et la fin du noeud donné une relation.Neo4j fonctions scalaires en C#

Mon exemple de requête est la suivante:

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 

donc en gros ses une relation de longueur variable et je peux obtenir le type, ainsi que le noeud de début et de fin de chaque relation.

Si je ne spécifie pas startNode ou endNode, j'obtiendrai des noeuds supplémentaires qui ne sont pas réellement connectés les uns aux autres.

Cela fonctionne parfaitement bien dans le chiffrement neo4j mais je ne sais pas comment faire startNode et endNode (fonctions scalaires) en C#.

Actuellement, j'ai ceci:

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; 

C'est pas faire les fonctions startNode et nœud terminal et donc j'obtenir les supplémentaires nœuds-relations qui ne sont pas réellement connectés les uns aux autres

Toutes les idées sur comment réaliser les fonctions startNode et endNode dans le client C# neo4j?

Répondre

1

Vous devez utiliser les Return.As parties de Neo4jClient, la requête ci-dessous correspond à votre Cypher original (bien, y compris le Optional que vous utilisez dans votre version 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)") 
      }); 

Le Return.As vous permet d'appeler les fonctions tu veux.

+0

J'ai oublié de mettre à jour cette réponse mais c'est exactement ce que j'ai fait il y a 3 jours. Merci quand même –

+0

Il y a une autre question que j'aimerais ajouter, y a-t-il un moyen de formater la requête avec params où les paramètres ne font pas partie d'une requête neo4j intégrée? c'est-à-dire, je sais que je pourrais faire avecParams sur une clause where, ou une propriété d'un nœud. Mais je ne peux pas utiliser withParams sur le * .. 2 numéro 2 dans cette expression. Comme les niveaux profonds je veux traverser le graphique. Ma seule solution est d'utiliser string.format mais cela est vulnérable aux attaques d'injeciton ...? –

+0

Non mais c'est une limitation Neo, les paramètres ne fonctionnent pas là: - / –